llvm-project/clang/test/CodeGenCXX/2010-07-23-DeclLoc.cpp
Douglas Katzman 3459ce2e5e Stop messing with the 'g' group of options in CompilerInvocation.
With this change, most 'g' options are rejected by CompilerInvocation.
They remain only as Driver options. The new way to request debug info
from cc1 is with "-debug-info-kind={line-tables-only|limited|standalone}"
and "-dwarf-version={2|3|4}". In the absence of a command-line option
to specify Dwarf version, the Toolchain decides it, rather than placing
Toolchain-specific logic in CompilerInvocation.

Also fix a bug in the Windows compatibility argument parsing
in which the "rightmost argument wins" principle failed.

Differential Revision: http://reviews.llvm.org/D13221

llvm-svn: 249655
2015-10-08 04:24:12 +00:00

88 lines
3.9 KiB
C++

// RUN: %clang_cc1 -emit-llvm -debug-info-kind=limited %s -o - | FileCheck %s
// Require the template function declaration refer to the correct filename.
// First, locate the function decl in metadata, and pluck out the file handle:
// CHECK: !DISubprogram(name: "extract_dwarf_data_from_header
// CHECK-SAME: file: [[FILE:![0-9]+]]
// Second: Require that filehandle refer to the correct filename:
// CHECK: [[FILE]] = !DIFile(filename: "decl_should_be_here.hpp"
typedef long unsigned int __darwin_size_t;
typedef __darwin_size_t size_t;
typedef unsigned char uint8_t;
typedef unsigned int uint32_t;
typedef unsigned long long uint64_t;
namespace std {
template<typename _Tp> class auto_ptr {
_Tp* _M_ptr;
public:
typedef _Tp element_type;
auto_ptr(element_type* __p = 0) throw() : _M_ptr(__p) { }
element_type& operator*() const throw() { }
};
}
class Pointer32 {
public:
typedef uint32_t ptr_t;
typedef uint32_t size_t;
};
class Pointer64 {
public:
typedef uint64_t ptr_t;
typedef uint64_t size_t;
};
class BigEndian {};
class LittleEndian {};
template <typename _SIZE, typename _ENDIANNESS> class SizeAndEndianness {
public:
typedef _SIZE SIZE;
};
typedef SizeAndEndianness<Pointer32, LittleEndian> ISA32Little;
typedef SizeAndEndianness<Pointer32, BigEndian> ISA32Big;
typedef SizeAndEndianness<Pointer64, LittleEndian> ISA64Little;
typedef SizeAndEndianness<Pointer64, BigEndian> ISA64Big;
template <typename SIZE> class TRange {
protected:
typename SIZE::ptr_t _location;
typename SIZE::size_t _length;
TRange(typename SIZE::ptr_t location, typename SIZE::size_t length) : _location(location), _length(length) { }
};
template <typename SIZE, typename T> class TRangeValue : public TRange<SIZE> {
T _value;
public:
TRangeValue(typename SIZE::ptr_t location, typename SIZE::size_t length, T value) : TRange<SIZE>(location, length), _value(value) {};
};
template <typename SIZE> class TAddressRelocator {};
class CSCppSymbolOwner{};
class CSCppSymbolOwnerData{};
template <typename SIZE> class TRawSymbolOwnerData
{
TRangeValue< SIZE, uint8_t* > _TEXT_text_section;
const char* _dsym_path;
uint32_t _dylib_current_version;
uint32_t _dylib_compatibility_version;
public:
TRawSymbolOwnerData() :
_TEXT_text_section(0, 0, __null), _dsym_path(__null), _dylib_current_version(0), _dylib_compatibility_version(0) {}
};
template <typename SIZE_AND_ENDIANNESS> class TExtendedMachOHeader {};
# 16 "decl_should_be_here.hpp"
template <typename SIZE_AND_ENDIANNESS> void extract_dwarf_data_from_header(TExtendedMachOHeader<SIZE_AND_ENDIANNESS>& header,
TRawSymbolOwnerData<typename SIZE_AND_ENDIANNESS::SIZE>& symbol_owner_data,
TAddressRelocator<typename SIZE_AND_ENDIANNESS::SIZE>* address_relocator) {}
struct CSCppSymbolOwnerHashFunctor {
size_t operator()(const CSCppSymbolOwner& symbol_owner) const {
# 97 "wrong_place_for_decl.cpp"
}
};
template <typename SIZE_AND_ENDIANNESS> CSCppSymbolOwnerData* create_symbol_owner_data_arch_specific(CSCppSymbolOwner* symbol_owner, const char* dsym_path) {
typedef typename SIZE_AND_ENDIANNESS::SIZE SIZE;
std::auto_ptr< TRawSymbolOwnerData<SIZE> > data(new TRawSymbolOwnerData<SIZE>());
std::auto_ptr< TExtendedMachOHeader<SIZE_AND_ENDIANNESS> > header;
extract_dwarf_data_from_header(*header, *data, (TAddressRelocator<typename SIZE_AND_ENDIANNESS::SIZE>*)__null);
}
CSCppSymbolOwnerData* create_symbol_owner_data2(CSCppSymbolOwner* symbol_owner, const char* dsym_path) {
create_symbol_owner_data_arch_specific< ISA32Little >(symbol_owner, dsym_path);
create_symbol_owner_data_arch_specific< ISA32Big >(symbol_owner, dsym_path);
create_symbol_owner_data_arch_specific< ISA64Little >(symbol_owner, dsym_path);
create_symbol_owner_data_arch_specific< ISA64Big >(symbol_owner, dsym_path);
}