1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-11-22 18:54:02 +01:00

DebugInfo: Add flag to CU to disable emission of inline debug info into the skeleton CU

In cases where .dwo/.dwp files are guaranteed to be available, skipping
the extra online (in the .o file) inline info can save a substantial
amount of space - see the original r221306 for more details there.

llvm-svn: 279650
This commit is contained in:
David Blaikie 2016-08-24 18:29:49 +00:00
parent e16dab59f1
commit 22b8e86371
12 changed files with 105 additions and 42 deletions

View File

@ -101,7 +101,7 @@ namespace llvm {
unsigned RV, StringRef SplitName = StringRef(), unsigned RV, StringRef SplitName = StringRef(),
DICompileUnit::DebugEmissionKind Kind = DICompileUnit::DebugEmissionKind Kind =
DICompileUnit::DebugEmissionKind::FullDebug, DICompileUnit::DebugEmissionKind::FullDebug,
uint64_t DWOId = 0); uint64_t DWOId = 0, bool SplitDebugInlining = true);
/// Create a file descriptor to hold debugging information /// Create a file descriptor to hold debugging information
/// for a file. /// for a file.

View File

@ -997,14 +997,16 @@ private:
unsigned RuntimeVersion; unsigned RuntimeVersion;
unsigned EmissionKind; unsigned EmissionKind;
uint64_t DWOId; uint64_t DWOId;
bool SplitDebugInlining;
DICompileUnit(LLVMContext &C, StorageType Storage, unsigned SourceLanguage, DICompileUnit(LLVMContext &C, StorageType Storage, unsigned SourceLanguage,
bool IsOptimized, unsigned RuntimeVersion, bool IsOptimized, unsigned RuntimeVersion,
unsigned EmissionKind, uint64_t DWOId, ArrayRef<Metadata *> Ops) unsigned EmissionKind, uint64_t DWOId, bool SplitDebugInlining,
ArrayRef<Metadata *> Ops)
: DIScope(C, DICompileUnitKind, Storage, dwarf::DW_TAG_compile_unit, Ops), : DIScope(C, DICompileUnitKind, Storage, dwarf::DW_TAG_compile_unit, Ops),
SourceLanguage(SourceLanguage), IsOptimized(IsOptimized), SourceLanguage(SourceLanguage), IsOptimized(IsOptimized),
RuntimeVersion(RuntimeVersion), EmissionKind(EmissionKind), RuntimeVersion(RuntimeVersion), EmissionKind(EmissionKind),
DWOId(DWOId) { DWOId(DWOId), SplitDebugInlining(SplitDebugInlining) {
assert(Storage != Uniqued); assert(Storage != Uniqued);
} }
~DICompileUnit() = default; ~DICompileUnit() = default;
@ -1016,13 +1018,15 @@ private:
unsigned EmissionKind, DICompositeTypeArray EnumTypes, unsigned EmissionKind, DICompositeTypeArray EnumTypes,
DIScopeArray RetainedTypes, DIGlobalVariableArray GlobalVariables, DIScopeArray RetainedTypes, DIGlobalVariableArray GlobalVariables,
DIImportedEntityArray ImportedEntities, DIMacroNodeArray Macros, DIImportedEntityArray ImportedEntities, DIMacroNodeArray Macros,
uint64_t DWOId, StorageType Storage, bool ShouldCreate = true) { uint64_t DWOId, bool SplitDebugInlining, StorageType Storage,
return getImpl( bool ShouldCreate = true) {
Context, SourceLanguage, File, getCanonicalMDString(Context, Producer), return getImpl(Context, SourceLanguage, File,
IsOptimized, getCanonicalMDString(Context, Flags), RuntimeVersion, getCanonicalMDString(Context, Producer), IsOptimized,
getCanonicalMDString(Context, SplitDebugFilename), EmissionKind, getCanonicalMDString(Context, Flags), RuntimeVersion,
EnumTypes.get(), RetainedTypes.get(), GlobalVariables.get(), getCanonicalMDString(Context, SplitDebugFilename),
ImportedEntities.get(), Macros.get(), DWOId, Storage, ShouldCreate); EmissionKind, EnumTypes.get(), RetainedTypes.get(),
GlobalVariables.get(), ImportedEntities.get(), Macros.get(),
DWOId, SplitDebugInlining, Storage, ShouldCreate);
} }
static DICompileUnit * static DICompileUnit *
getImpl(LLVMContext &Context, unsigned SourceLanguage, Metadata *File, getImpl(LLVMContext &Context, unsigned SourceLanguage, Metadata *File,
@ -1030,15 +1034,16 @@ private:
unsigned RuntimeVersion, MDString *SplitDebugFilename, unsigned RuntimeVersion, MDString *SplitDebugFilename,
unsigned EmissionKind, Metadata *EnumTypes, Metadata *RetainedTypes, unsigned EmissionKind, Metadata *EnumTypes, Metadata *RetainedTypes,
Metadata *GlobalVariables, Metadata *ImportedEntities, Metadata *GlobalVariables, Metadata *ImportedEntities,
Metadata *Macros, uint64_t DWOId, StorageType Storage, Metadata *Macros, uint64_t DWOId, bool SplitDebugInlining,
bool ShouldCreate = true); StorageType Storage, bool ShouldCreate = true);
TempDICompileUnit cloneImpl() const { TempDICompileUnit cloneImpl() const {
return getTemporary( return getTemporary(getContext(), getSourceLanguage(), getFile(),
getContext(), getSourceLanguage(), getFile(), getProducer(), getProducer(), isOptimized(), getFlags(),
isOptimized(), getFlags(), getRuntimeVersion(), getSplitDebugFilename(), getRuntimeVersion(), getSplitDebugFilename(),
getEmissionKind(), getEnumTypes(), getRetainedTypes(), getEmissionKind(), getEnumTypes(), getRetainedTypes(),
getGlobalVariables(), getImportedEntities(), getMacros(), DWOId); getGlobalVariables(), getImportedEntities(),
getMacros(), DWOId, getSplitDebugInlining());
} }
static void get() = delete; static void get() = delete;
@ -1053,20 +1058,21 @@ public:
DICompositeTypeArray EnumTypes, DIScopeArray RetainedTypes, DICompositeTypeArray EnumTypes, DIScopeArray RetainedTypes,
DIGlobalVariableArray GlobalVariables, DIGlobalVariableArray GlobalVariables,
DIImportedEntityArray ImportedEntities, DIMacroNodeArray Macros, DIImportedEntityArray ImportedEntities, DIMacroNodeArray Macros,
uint64_t DWOId), uint64_t DWOId, bool SplitDebugInlining),
(SourceLanguage, File, Producer, IsOptimized, Flags, RuntimeVersion, (SourceLanguage, File, Producer, IsOptimized, Flags, RuntimeVersion,
SplitDebugFilename, EmissionKind, EnumTypes, RetainedTypes, SplitDebugFilename, EmissionKind, EnumTypes, RetainedTypes,
GlobalVariables, ImportedEntities, Macros, DWOId)) GlobalVariables, ImportedEntities, Macros, DWOId, SplitDebugInlining))
DEFINE_MDNODE_GET_DISTINCT_TEMPORARY( DEFINE_MDNODE_GET_DISTINCT_TEMPORARY(
DICompileUnit, DICompileUnit,
(unsigned SourceLanguage, Metadata *File, MDString *Producer, (unsigned SourceLanguage, Metadata *File, MDString *Producer,
bool IsOptimized, MDString *Flags, unsigned RuntimeVersion, bool IsOptimized, MDString *Flags, unsigned RuntimeVersion,
MDString *SplitDebugFilename, unsigned EmissionKind, Metadata *EnumTypes, MDString *SplitDebugFilename, unsigned EmissionKind, Metadata *EnumTypes,
Metadata *RetainedTypes, Metadata *GlobalVariables, Metadata *RetainedTypes, Metadata *GlobalVariables,
Metadata *ImportedEntities, Metadata *Macros, uint64_t DWOId), Metadata *ImportedEntities, Metadata *Macros, uint64_t DWOId,
bool SplitDebugInlining),
(SourceLanguage, File, Producer, IsOptimized, Flags, RuntimeVersion, (SourceLanguage, File, Producer, IsOptimized, Flags, RuntimeVersion,
SplitDebugFilename, EmissionKind, EnumTypes, RetainedTypes, SplitDebugFilename, EmissionKind, EnumTypes, RetainedTypes,
GlobalVariables, ImportedEntities, Macros, DWOId)) GlobalVariables, ImportedEntities, Macros, DWOId, SplitDebugInlining))
TempDICompileUnit clone() const { return cloneImpl(); } TempDICompileUnit clone() const { return cloneImpl(); }
@ -1096,6 +1102,10 @@ public:
} }
uint64_t getDWOId() const { return DWOId; } uint64_t getDWOId() const { return DWOId; }
void setDWOId(uint64_t DwoId) { DWOId = DwoId; } void setDWOId(uint64_t DwoId) { DWOId = DwoId; }
bool getSplitDebugInlining() const { return SplitDebugInlining; }
void setSplitDebugInlining(bool SplitDebugInlining) {
this->SplitDebugInlining = SplitDebugInlining;
}
MDString *getRawProducer() const { return getOperandAs<MDString>(1); } MDString *getRawProducer() const { return getOperandAs<MDString>(1); }
MDString *getRawFlags() const { return getOperandAs<MDString>(2); } MDString *getRawFlags() const { return getOperandAs<MDString>(2); }

View File

@ -3969,14 +3969,16 @@ bool LLParser::ParseDICompileUnit(MDNode *&Result, bool IsDistinct) {
OPTIONAL(globals, MDField, ); \ OPTIONAL(globals, MDField, ); \
OPTIONAL(imports, MDField, ); \ OPTIONAL(imports, MDField, ); \
OPTIONAL(macros, MDField, ); \ OPTIONAL(macros, MDField, ); \
OPTIONAL(dwoId, MDUnsignedField, ); OPTIONAL(dwoId, MDUnsignedField, ); \
OPTIONAL(splitDebugInlining, MDBoolField, = true);
PARSE_MD_FIELDS(); PARSE_MD_FIELDS();
#undef VISIT_MD_FIELDS #undef VISIT_MD_FIELDS
Result = DICompileUnit::getDistinct( Result = DICompileUnit::getDistinct(
Context, language.Val, file.Val, producer.Val, isOptimized.Val, flags.Val, Context, language.Val, file.Val, producer.Val, isOptimized.Val, flags.Val,
runtimeVersion.Val, splitDebugFilename.Val, emissionKind.Val, enums.Val, runtimeVersion.Val, splitDebugFilename.Val, emissionKind.Val, enums.Val,
retainedTypes.Val, globals.Val, imports.Val, macros.Val, dwoId.Val); retainedTypes.Val, globals.Val, imports.Val, macros.Val, dwoId.Val,
splitDebugInlining.Val);
return false; return false;
} }

View File

@ -2452,7 +2452,7 @@ std::error_code BitcodeReader::parseMetadata(bool ModuleLevel) {
break; break;
} }
case bitc::METADATA_COMPILE_UNIT: { case bitc::METADATA_COMPILE_UNIT: {
if (Record.size() < 14 || Record.size() > 16) if (Record.size() < 14 || Record.size() > 17)
return error("Invalid record"); return error("Invalid record");
// Ignore Record[0], which indicates whether this compile unit is // Ignore Record[0], which indicates whether this compile unit is
@ -2464,7 +2464,8 @@ std::error_code BitcodeReader::parseMetadata(bool ModuleLevel) {
Record[8], getMDOrNull(Record[9]), getMDOrNull(Record[10]), Record[8], getMDOrNull(Record[9]), getMDOrNull(Record[10]),
getMDOrNull(Record[12]), getMDOrNull(Record[13]), getMDOrNull(Record[12]), getMDOrNull(Record[13]),
Record.size() <= 15 ? nullptr : getMDOrNull(Record[15]), Record.size() <= 15 ? nullptr : getMDOrNull(Record[15]),
Record.size() <= 14 ? 0 : Record[14]); Record.size() <= 14 ? 0 : Record[14],
Record.size() <= 16 ? true : Record[16]);
MetadataList.assignValue(CU, NextMetadataNo++); MetadataList.assignValue(CU, NextMetadataNo++);

View File

@ -1564,6 +1564,7 @@ void ModuleBitcodeWriter::writeDICompileUnit(const DICompileUnit *N,
Record.push_back(VE.getMetadataOrNullID(N->getImportedEntities().get())); Record.push_back(VE.getMetadataOrNullID(N->getImportedEntities().get()));
Record.push_back(N->getDWOId()); Record.push_back(N->getDWOId());
Record.push_back(VE.getMetadataOrNullID(N->getMacros().get())); Record.push_back(VE.getMetadataOrNullID(N->getMacros().get()));
Record.push_back(N->getSplitDebugInlining());
Stream.EmitRecord(bitc::METADATA_COMPILE_UNIT, Record, Abbrev); Stream.EmitRecord(bitc::METADATA_COMPILE_UNIT, Record, Abbrev);
Record.clear(); Record.clear();

View File

@ -352,6 +352,7 @@ bool DwarfDebug::isLexicalScopeDIENull(LexicalScope *Scope) {
template <typename Func> static void forBothCUs(DwarfCompileUnit &CU, Func F) { template <typename Func> static void forBothCUs(DwarfCompileUnit &CU, Func F) {
F(CU); F(CU);
if (auto *SkelCU = CU.getSkeleton()) if (auto *SkelCU = CU.getSkeleton())
if (CU.getCUNode()->getSplitDebugInlining())
F(*SkelCU); F(*SkelCU);
} }
@ -1155,7 +1156,8 @@ void DwarfDebug::endFunction(const MachineFunction *MF) {
TheCU.constructSubprogramScopeDIE(FnScope); TheCU.constructSubprogramScopeDIE(FnScope);
if (auto *SkelCU = TheCU.getSkeleton()) if (auto *SkelCU = TheCU.getSkeleton())
if (!LScopes.getAbstractScopesList().empty()) if (!LScopes.getAbstractScopesList().empty() &&
TheCU.getCUNode()->getSplitDebugInlining())
SkelCU->constructSubprogramScopeDIE(FnScope); SkelCU->constructSubprogramScopeDIE(FnScope);
// Clear debug info // Clear debug info

View File

@ -1409,7 +1409,7 @@ struct MDFieldPrinter {
bool ShouldSkipNull = true); bool ShouldSkipNull = true);
template <class IntTy> template <class IntTy>
void printInt(StringRef Name, IntTy Int, bool ShouldSkipZero = true); void printInt(StringRef Name, IntTy Int, bool ShouldSkipZero = true);
void printBool(StringRef Name, bool Value); void printBool(StringRef Name, bool Value, Optional<bool> Default = None);
void printDIFlags(StringRef Name, unsigned Flags); void printDIFlags(StringRef Name, unsigned Flags);
template <class IntTy, class Stringifier> template <class IntTy, class Stringifier>
void printDwarfEnum(StringRef Name, IntTy Value, Stringifier toString, void printDwarfEnum(StringRef Name, IntTy Value, Stringifier toString,
@ -1472,7 +1472,10 @@ void MDFieldPrinter::printInt(StringRef Name, IntTy Int, bool ShouldSkipZero) {
Out << FS << Name << ": " << Int; Out << FS << Name << ": " << Int;
} }
void MDFieldPrinter::printBool(StringRef Name, bool Value) { void MDFieldPrinter::printBool(StringRef Name, bool Value,
Optional<bool> Default) {
if (Default && Value == *Default)
return;
Out << FS << Name << ": " << (Value ? "true" : "false"); Out << FS << Name << ": " << (Value ? "true" : "false");
} }
@ -1666,6 +1669,7 @@ static void writeDICompileUnit(raw_ostream &Out, const DICompileUnit *N,
Printer.printMetadata("imports", N->getRawImportedEntities()); Printer.printMetadata("imports", N->getRawImportedEntities());
Printer.printMetadata("macros", N->getRawMacros()); Printer.printMetadata("macros", N->getRawMacros());
Printer.printInt("dwoId", N->getDWOId()); Printer.printInt("dwoId", N->getDWOId());
Printer.printBool("splitDebugInlining", N->getSplitDebugInlining(), true);
Out << ")"; Out << ")";
} }

View File

@ -111,7 +111,8 @@ static DIScope *getNonCompileUnitScope(DIScope *N) {
DICompileUnit *DIBuilder::createCompileUnit( DICompileUnit *DIBuilder::createCompileUnit(
unsigned Lang, StringRef Filename, StringRef Directory, StringRef Producer, unsigned Lang, StringRef Filename, StringRef Directory, StringRef Producer,
bool isOptimized, StringRef Flags, unsigned RunTimeVer, StringRef SplitName, bool isOptimized, StringRef Flags, unsigned RunTimeVer, StringRef SplitName,
DICompileUnit::DebugEmissionKind Kind, uint64_t DWOId) { DICompileUnit::DebugEmissionKind Kind, uint64_t DWOId,
bool SplitDebugInlining) {
assert(((Lang <= dwarf::DW_LANG_Fortran08 && Lang >= dwarf::DW_LANG_C89) || assert(((Lang <= dwarf::DW_LANG_Fortran08 && Lang >= dwarf::DW_LANG_C89) ||
(Lang <= dwarf::DW_LANG_hi_user && Lang >= dwarf::DW_LANG_lo_user)) && (Lang <= dwarf::DW_LANG_hi_user && Lang >= dwarf::DW_LANG_lo_user)) &&
@ -123,7 +124,7 @@ DICompileUnit *DIBuilder::createCompileUnit(
CUNode = DICompileUnit::getDistinct( CUNode = DICompileUnit::getDistinct(
VMContext, Lang, DIFile::get(VMContext, Filename, Directory), Producer, VMContext, Lang, DIFile::get(VMContext, Filename, Directory), Producer,
isOptimized, Flags, RunTimeVer, SplitName, Kind, nullptr, nullptr, isOptimized, Flags, RunTimeVer, SplitName, Kind, nullptr, nullptr,
nullptr, nullptr, nullptr, DWOId); nullptr, nullptr, nullptr, DWOId, SplitDebugInlining);
// Create a named metadata so that it is easier to find cu in a module. // Create a named metadata so that it is easier to find cu in a module.
NamedMDNode *NMD = M.getOrInsertNamedMetadata("llvm.dbg.cu"); NamedMDNode *NMD = M.getOrInsertNamedMetadata("llvm.dbg.cu");

View File

@ -361,7 +361,8 @@ DICompileUnit *DICompileUnit::getImpl(
unsigned RuntimeVersion, MDString *SplitDebugFilename, unsigned RuntimeVersion, MDString *SplitDebugFilename,
unsigned EmissionKind, Metadata *EnumTypes, Metadata *RetainedTypes, unsigned EmissionKind, Metadata *EnumTypes, Metadata *RetainedTypes,
Metadata *GlobalVariables, Metadata *ImportedEntities, Metadata *Macros, Metadata *GlobalVariables, Metadata *ImportedEntities, Metadata *Macros,
uint64_t DWOId, StorageType Storage, bool ShouldCreate) { uint64_t DWOId, bool SplitDebugInlining, StorageType Storage,
bool ShouldCreate) {
assert(Storage != Uniqued && "Cannot unique DICompileUnit"); assert(Storage != Uniqued && "Cannot unique DICompileUnit");
assert(isCanonical(Producer) && "Expected canonical MDString"); assert(isCanonical(Producer) && "Expected canonical MDString");
assert(isCanonical(Flags) && "Expected canonical MDString"); assert(isCanonical(Flags) && "Expected canonical MDString");
@ -371,9 +372,10 @@ DICompileUnit *DICompileUnit::getImpl(
File, Producer, Flags, SplitDebugFilename, File, Producer, Flags, SplitDebugFilename,
EnumTypes, RetainedTypes, GlobalVariables, ImportedEntities, EnumTypes, RetainedTypes, GlobalVariables, ImportedEntities,
Macros}; Macros};
return storeImpl(new (array_lengthof(Ops)) DICompileUnit( return storeImpl(new (array_lengthof(Ops))
Context, Storage, SourceLanguage, IsOptimized, DICompileUnit(Context, Storage, SourceLanguage,
RuntimeVersion, EmissionKind, DWOId, Ops), IsOptimized, RuntimeVersion, EmissionKind,
DWOId, SplitDebugInlining, Ops),
Storage); Storage);
} }

View File

@ -22,18 +22,18 @@
splitDebugFilename: "abc.debug", splitDebugFilename: "abc.debug",
emissionKind: FullDebug, emissionKind: FullDebug,
enums: !2, retainedTypes: !3, enums: !2, retainedTypes: !3,
globals: !5, imports: !6, macros: !7, dwoId: 42) globals: !5, imports: !6, macros: !7, dwoId: 42, splitDebugInlining: true)
; CHECK: !9 = distinct !DICompileUnit(language: DW_LANG_C99, file: !1, isOptimized: false, runtimeVersion: 0, emissionKind: NoDebug) ; CHECK: !9 = distinct !DICompileUnit(language: DW_LANG_C99, file: !1, isOptimized: false, runtimeVersion: 0, emissionKind: NoDebug)
!9 = distinct !DICompileUnit(language: 12, file: !1, producer: "", !9 = distinct !DICompileUnit(language: 12, file: !1, producer: "",
isOptimized: false, flags: "", runtimeVersion: 0, isOptimized: false, flags: "", runtimeVersion: 0,
splitDebugFilename: "", emissionKind: NoDebug) splitDebugFilename: "", emissionKind: NoDebug)
; CHECK: !10 = distinct !DICompileUnit(language: DW_LANG_C99, file: !1, producer: "clang", isOptimized: true, flags: "-O2", runtimeVersion: 2, splitDebugFilename: "abc.debug", emissionKind: LineTablesOnly) ; CHECK: !10 = distinct !DICompileUnit(language: DW_LANG_C99, file: !1, producer: "clang", isOptimized: true, flags: "-O2", runtimeVersion: 2, splitDebugFilename: "abc.debug", emissionKind: LineTablesOnly, splitDebugInlining: false)
!10 = distinct !DICompileUnit(language: DW_LANG_C99, file: !1, producer: "clang", !10 = distinct !DICompileUnit(language: DW_LANG_C99, file: !1, producer: "clang",
isOptimized: true, flags: "-O2", runtimeVersion: 2, isOptimized: true, flags: "-O2", runtimeVersion: 2,
splitDebugFilename: "abc.debug", splitDebugFilename: "abc.debug",
emissionKind: LineTablesOnly) emissionKind: LineTablesOnly, splitDebugInlining: false)
!llvm.module.flags = !{!11} !llvm.module.flags = !{!11}
!11 = !{i32 2, !"Debug Info Version", i32 3} !11 = !{i32 2, !"Debug Info Version", i32 3}

View File

@ -0,0 +1,41 @@
; RUN: llc -split-dwarf=Enable -O0 < %s -mtriple=x86_64-unknown-linux-gnu -filetype=obj | llvm-dwarfdump -debug-dump=info - | FileCheck %s
; CHECK-NOT: DW_TAG_subprogram
; IR generated from the following source:
; void f1();
; inline __attribute__((always_inline)) void f2() {
; f1();
; }
; void f3() {
; f2();
; }
; Function Attrs: uwtable
define void @_Z2f3v() #0 !dbg !5 {
entry:
call void @_Z2f1v(), !dbg !8
ret void, !dbg !11
}
declare void @_Z2f1v() #1
attributes #0 = { uwtable "correctly-rounded-divide-sqrt-fp-math"="false" "disable-tail-calls"="false" "less-precise-fpmad"="false" "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf" "no-infs-fp-math"="false" "no-jump-tables"="false" "no-nans-fp-math"="false" "no-signed-zeros-fp-math"="false" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+fxsr,+mmx,+sse,+sse2,+x87" "unsafe-fp-math"="false" "use-soft-float"="false" }
attributes #1 = { "correctly-rounded-divide-sqrt-fp-math"="false" "disable-tail-calls"="false" "less-precise-fpmad"="false" "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "no-signed-zeros-fp-math"="false" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+fxsr,+mmx,+sse,+sse2,+x87" "unsafe-fp-math"="false" "use-soft-float"="false" }
!llvm.dbg.cu = !{!0}
!llvm.module.flags = !{!3}
!llvm.ident = !{!4}
!0 = distinct !DICompileUnit(language: DW_LANG_C_plus_plus, file: !1, producer: "clang version 4.0.0 (trunk 279571) (llvm/trunk 279602)", isOptimized: false, runtimeVersion: 0, splitDebugFilename: "fission-no-inlining.dwo", emissionKind: FullDebug, enums: !2, splitDebugInlining: false)
!1 = !DIFile(filename: "fission-no-inlining.cpp", directory: "/tmp/dbginfo")
!2 = !{}
!3 = !{i32 2, !"Debug Info Version", i32 3}
!4 = !{!"clang version 4.0.0 (trunk 279571) (llvm/trunk 279602)"}
!5 = distinct !DISubprogram(name: "f3", linkageName: "_Z2f3v", scope: !1, file: !1, line: 5, type: !6, isLocal: false, isDefinition: true, scopeLine: 5, flags: DIFlagPrototyped, isOptimized: false, unit: !0, variables: !2)
!6 = !DISubroutineType(types: !7)
!7 = !{null}
!8 = !DILocation(line: 3, column: 3, scope: !9, inlinedAt: !10)
!9 = distinct !DISubprogram(name: "f2", linkageName: "_Z2f2v", scope: !1, file: !1, line: 2, type: !6, isLocal: false, isDefinition: true, scopeLine: 2, flags: DIFlagPrototyped, isOptimized: false, unit: !0, variables: !2)
!10 = distinct !DILocation(line: 6, column: 3, scope: !5)
!11 = !DILocation(line: 7, column: 1, scope: !5)

View File

@ -94,7 +94,7 @@ protected:
return DICompileUnit::getDistinct(Context, 1, getFile(), "clang", false, return DICompileUnit::getDistinct(Context, 1, getFile(), "clang", false,
"-g", 2, "", DICompileUnit::FullDebug, "-g", 2, "", DICompileUnit::FullDebug,
getTuple(), getTuple(), getTuple(), getTuple(), getTuple(), getTuple(),
getTuple(), getTuple(), 0); getTuple(), getTuple(), 0, true);
} }
DIType *getBasicType(StringRef Name) { DIType *getBasicType(StringRef Name) {
return DIBasicType::get(Context, dwarf::DW_TAG_unspecified_type, Name); return DIBasicType::get(Context, dwarf::DW_TAG_unspecified_type, Name);
@ -1391,8 +1391,7 @@ TEST_F(DICompileUnitTest, get) {
auto *N = DICompileUnit::getDistinct( auto *N = DICompileUnit::getDistinct(
Context, SourceLanguage, File, Producer, IsOptimized, Flags, Context, SourceLanguage, File, Producer, IsOptimized, Flags,
RuntimeVersion, SplitDebugFilename, EmissionKind, EnumTypes, RuntimeVersion, SplitDebugFilename, EmissionKind, EnumTypes,
RetainedTypes, GlobalVariables, ImportedEntities, Macros, RetainedTypes, GlobalVariables, ImportedEntities, Macros, DWOId, true);
DWOId);
EXPECT_EQ(dwarf::DW_TAG_compile_unit, N->getTag()); EXPECT_EQ(dwarf::DW_TAG_compile_unit, N->getTag());
EXPECT_EQ(SourceLanguage, N->getSourceLanguage()); EXPECT_EQ(SourceLanguage, N->getSourceLanguage());
@ -1449,7 +1448,7 @@ TEST_F(DICompileUnitTest, replaceArrays) {
auto *N = DICompileUnit::getDistinct( auto *N = DICompileUnit::getDistinct(
Context, SourceLanguage, File, Producer, IsOptimized, Flags, Context, SourceLanguage, File, Producer, IsOptimized, Flags,
RuntimeVersion, SplitDebugFilename, EmissionKind, EnumTypes, RuntimeVersion, SplitDebugFilename, EmissionKind, EnumTypes,
RetainedTypes, nullptr, ImportedEntities, nullptr, DWOId); RetainedTypes, nullptr, ImportedEntities, nullptr, DWOId, true);
auto *GlobalVariables = MDTuple::getDistinct(Context, None); auto *GlobalVariables = MDTuple::getDistinct(Context, None);
EXPECT_EQ(nullptr, N->getGlobalVariables().get()); EXPECT_EQ(nullptr, N->getGlobalVariables().get());