diff options
| author | Adrian Prantl <aprantl@apple.com> | 2015-05-21 20:37:30 +0000 |
|---|---|---|
| committer | Adrian Prantl <aprantl@apple.com> | 2015-05-21 20:37:30 +0000 |
| commit | 1f599f9f653c92f38b9d3784a2dfd8a118942650 (patch) | |
| tree | 9ca74e0fcc1a76da83a377182b228003114a4382 /llvm/lib | |
| parent | be81cf570e9dcd5c89ee5029b6539b6e8203841e (diff) | |
| download | bcm5719-llvm-1f599f9f653c92f38b9d3784a2dfd8a118942650.tar.gz bcm5719-llvm-1f599f9f653c92f38b9d3784a2dfd8a118942650.zip | |
IR / debug info: Add a DWOId field to DICompileUnit,
so DWARF skeleton CUs can be expression in IR. A skeleton CU is a
(typically empty) DW_TAG_compile_unit that has a DW_AT_(GNU)_dwo_name and
a DW_AT_(GNU)_dwo_id attribute. It is used to refer to external debug info.
This is a prerequisite for clang module debugging as discussed in
http://lists.cs.uiuc.edu/pipermail/cfe-dev/2014-November/040076.html.
In order to refer to external types stored in split DWARF (dwo) objects,
such as clang modules, we need to emit skeleton CUs, which identify the
dwarf object (i.e., the clang module) by filename (the SplitDebugFilename)
and a hash value, the dwo_id.
This patch only contains the IR changes. The idea is that a CUs with a
non-zero dwo_id field will be emitted together with a DW_AT_GNU_dwo_name
and DW_AT_GNU_dwo_id attribute.
http://reviews.llvm.org/D9488
rdar://problem/20091852
llvm-svn: 237949
Diffstat (limited to 'llvm/lib')
| -rw-r--r-- | llvm/lib/AsmParser/LLParser.cpp | 7 | ||||
| -rw-r--r-- | llvm/lib/Bitcode/Reader/BitcodeReader.cpp | 5 | ||||
| -rw-r--r-- | llvm/lib/Bitcode/Writer/BitcodeWriter.cpp | 1 | ||||
| -rw-r--r-- | llvm/lib/IR/AsmWriter.cpp | 1 | ||||
| -rw-r--r-- | llvm/lib/IR/DIBuilder.cpp | 4 | ||||
| -rw-r--r-- | llvm/lib/IR/DebugInfoMetadata.cpp | 7 | ||||
| -rw-r--r-- | llvm/lib/IR/LLVMContextImpl.h | 12 |
7 files changed, 22 insertions, 15 deletions
diff --git a/llvm/lib/AsmParser/LLParser.cpp b/llvm/lib/AsmParser/LLParser.cpp index ef464c339f7..d3c8ffd2fef 100644 --- a/llvm/lib/AsmParser/LLParser.cpp +++ b/llvm/lib/AsmParser/LLParser.cpp @@ -3547,7 +3547,7 @@ bool LLParser::ParseDIFile(MDNode *&Result, bool IsDistinct) { /// isOptimized: true, flags: "-O2", runtimeVersion: 1, /// splitDebugFilename: "abc.debug", emissionKind: 1, /// enums: !1, retainedTypes: !2, subprograms: !3, -/// globals: !4, imports: !5) +/// globals: !4, imports: !5, dwoId: 0x0abcd) bool LLParser::ParseDICompileUnit(MDNode *&Result, bool IsDistinct) { #define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \ REQUIRED(language, DwarfLangField, ); \ @@ -3562,7 +3562,8 @@ bool LLParser::ParseDICompileUnit(MDNode *&Result, bool IsDistinct) { OPTIONAL(retainedTypes, MDField, ); \ OPTIONAL(subprograms, MDField, ); \ OPTIONAL(globals, MDField, ); \ - OPTIONAL(imports, MDField, ); + OPTIONAL(imports, MDField, ); \ + OPTIONAL(dwoId, MDUnsignedField, ); PARSE_MD_FIELDS(); #undef VISIT_MD_FIELDS @@ -3571,7 +3572,7 @@ bool LLParser::ParseDICompileUnit(MDNode *&Result, bool IsDistinct) { isOptimized.Val, flags.Val, runtimeVersion.Val, splitDebugFilename.Val, emissionKind.Val, enums.Val, retainedTypes.Val, subprograms.Val, globals.Val, - imports.Val)); + imports.Val, dwoId.Val)); return false; } diff --git a/llvm/lib/Bitcode/Reader/BitcodeReader.cpp b/llvm/lib/Bitcode/Reader/BitcodeReader.cpp index bba29172a28..6eef594eaf1 100644 --- a/llvm/lib/Bitcode/Reader/BitcodeReader.cpp +++ b/llvm/lib/Bitcode/Reader/BitcodeReader.cpp @@ -1844,7 +1844,7 @@ std::error_code BitcodeReader::ParseMetadata() { break; } case bitc::METADATA_COMPILE_UNIT: { - if (Record.size() != 14) + if (Record.size() < 14 || Record.size() > 15) return Error("Invalid record"); MDValueList.AssignValue( @@ -1855,7 +1855,8 @@ std::error_code BitcodeReader::ParseMetadata() { getMDString(Record[7]), Record[8], getMDOrNull(Record[9]), getMDOrNull(Record[10]), getMDOrNull(Record[11]), getMDOrNull(Record[12]), - getMDOrNull(Record[13]))), + getMDOrNull(Record[13]), + Record.size() == 14 ? 0 : Record[14])), NextMDValueNo++); break; } diff --git a/llvm/lib/Bitcode/Writer/BitcodeWriter.cpp b/llvm/lib/Bitcode/Writer/BitcodeWriter.cpp index 199663d1bfd..3a539e12926 100644 --- a/llvm/lib/Bitcode/Writer/BitcodeWriter.cpp +++ b/llvm/lib/Bitcode/Writer/BitcodeWriter.cpp @@ -949,6 +949,7 @@ static void WriteDICompileUnit(const DICompileUnit *N, Record.push_back(VE.getMetadataOrNullID(N->getSubprograms().get())); Record.push_back(VE.getMetadataOrNullID(N->getGlobalVariables().get())); Record.push_back(VE.getMetadataOrNullID(N->getImportedEntities().get())); + Record.push_back(N->getDWOId()); Stream.EmitRecord(bitc::METADATA_COMPILE_UNIT, Record, Abbrev); Record.clear(); diff --git a/llvm/lib/IR/AsmWriter.cpp b/llvm/lib/IR/AsmWriter.cpp index 304221af400..1089cb58218 100644 --- a/llvm/lib/IR/AsmWriter.cpp +++ b/llvm/lib/IR/AsmWriter.cpp @@ -1624,6 +1624,7 @@ static void writeDICompileUnit(raw_ostream &Out, const DICompileUnit *N, Printer.printMetadata("subprograms", N->getRawSubprograms()); Printer.printMetadata("globals", N->getRawGlobalVariables()); Printer.printMetadata("imports", N->getRawImportedEntities()); + Printer.printInt("dwoId", N->getDWOId()); Out << ")"; } diff --git a/llvm/lib/IR/DIBuilder.cpp b/llvm/lib/IR/DIBuilder.cpp index 3baa4680905..b1925ea5c48 100644 --- a/llvm/lib/IR/DIBuilder.cpp +++ b/llvm/lib/IR/DIBuilder.cpp @@ -125,7 +125,7 @@ static DIScope *getNonCompileUnitScope(DIScope *N) { DICompileUnit *DIBuilder::createCompileUnit( unsigned Lang, StringRef Filename, StringRef Directory, StringRef Producer, bool isOptimized, StringRef Flags, unsigned RunTimeVer, StringRef SplitName, - DebugEmissionKind Kind, bool EmitDebugInfo) { + DebugEmissionKind Kind, uint64_t DWOId, bool EmitDebugInfo) { assert(((Lang <= dwarf::DW_LANG_Fortran08 && Lang >= dwarf::DW_LANG_C89) || (Lang <= dwarf::DW_LANG_hi_user && Lang >= dwarf::DW_LANG_lo_user)) && @@ -147,7 +147,7 @@ DICompileUnit *DIBuilder::createCompileUnit( VMContext, Lang, DIFile::get(VMContext, Filename, Directory), Producer, isOptimized, Flags, RunTimeVer, SplitName, Kind, TempEnumTypes.get(), TempRetainTypes.get(), TempSubprograms.get(), TempGVs.get(), - TempImportedModules.get()); + TempImportedModules.get(), DWOId); // Create a named metadata so that it is easier to find cu in a module. // Note that we only generate this when the caller wants to actually diff --git a/llvm/lib/IR/DebugInfoMetadata.cpp b/llvm/lib/IR/DebugInfoMetadata.cpp index 85335d547b1..8b9857d373b 100644 --- a/llvm/lib/IR/DebugInfoMetadata.cpp +++ b/llvm/lib/IR/DebugInfoMetadata.cpp @@ -311,7 +311,8 @@ DICompileUnit *DICompileUnit::getImpl( unsigned RuntimeVersion, MDString *SplitDebugFilename, unsigned EmissionKind, Metadata *EnumTypes, Metadata *RetainedTypes, Metadata *Subprograms, Metadata *GlobalVariables, - Metadata *ImportedEntities, StorageType Storage, bool ShouldCreate) { + Metadata *ImportedEntities, uint64_t DWOId, + StorageType Storage, bool ShouldCreate) { assert(isCanonical(Producer) && "Expected canonical MDString"); assert(isCanonical(Flags) && "Expected canonical MDString"); assert(isCanonical(SplitDebugFilename) && "Expected canonical MDString"); @@ -319,13 +320,13 @@ DICompileUnit *DICompileUnit::getImpl( DICompileUnit, (SourceLanguage, File, getString(Producer), IsOptimized, getString(Flags), RuntimeVersion, getString(SplitDebugFilename), EmissionKind, EnumTypes, - RetainedTypes, Subprograms, GlobalVariables, ImportedEntities)); + RetainedTypes, Subprograms, GlobalVariables, ImportedEntities, DWOId)); Metadata *Ops[] = {File, Producer, Flags, SplitDebugFilename, EnumTypes, RetainedTypes, Subprograms, GlobalVariables, ImportedEntities}; DEFINE_GETIMPL_STORE( DICompileUnit, - (SourceLanguage, IsOptimized, RuntimeVersion, EmissionKind), Ops); + (SourceLanguage, IsOptimized, RuntimeVersion, EmissionKind, DWOId), Ops); } DISubprogram *DILocalScope::getSubprogram() const { diff --git a/llvm/lib/IR/LLVMContextImpl.h b/llvm/lib/IR/LLVMContextImpl.h index 95292509f50..f81db607770 100644 --- a/llvm/lib/IR/LLVMContextImpl.h +++ b/llvm/lib/IR/LLVMContextImpl.h @@ -472,19 +472,20 @@ template <> struct MDNodeKeyImpl<DICompileUnit> { Metadata *Subprograms; Metadata *GlobalVariables; Metadata *ImportedEntities; + uint64_t DWOId; MDNodeKeyImpl(unsigned SourceLanguage, Metadata *File, StringRef Producer, bool IsOptimized, StringRef Flags, unsigned RuntimeVersion, StringRef SplitDebugFilename, unsigned EmissionKind, Metadata *EnumTypes, Metadata *RetainedTypes, Metadata *Subprograms, Metadata *GlobalVariables, - Metadata *ImportedEntities) + Metadata *ImportedEntities, uint64_t DWOId) : SourceLanguage(SourceLanguage), File(File), Producer(Producer), IsOptimized(IsOptimized), Flags(Flags), RuntimeVersion(RuntimeVersion), SplitDebugFilename(SplitDebugFilename), EmissionKind(EmissionKind), EnumTypes(EnumTypes), RetainedTypes(RetainedTypes), Subprograms(Subprograms), GlobalVariables(GlobalVariables), - ImportedEntities(ImportedEntities) {} + ImportedEntities(ImportedEntities), DWOId(DWOId) {} MDNodeKeyImpl(const DICompileUnit *N) : SourceLanguage(N->getSourceLanguage()), File(N->getRawFile()), Producer(N->getProducer()), IsOptimized(N->isOptimized()), @@ -494,7 +495,7 @@ template <> struct MDNodeKeyImpl<DICompileUnit> { RetainedTypes(N->getRawRetainedTypes()), Subprograms(N->getRawSubprograms()), GlobalVariables(N->getRawGlobalVariables()), - ImportedEntities(N->getRawImportedEntities()) {} + ImportedEntities(N->getRawImportedEntities()), DWOId(N->getDWOId()) {} bool isKeyOf(const DICompileUnit *RHS) const { return SourceLanguage == RHS->getSourceLanguage() && @@ -507,13 +508,14 @@ template <> struct MDNodeKeyImpl<DICompileUnit> { RetainedTypes == RHS->getRawRetainedTypes() && Subprograms == RHS->getRawSubprograms() && GlobalVariables == RHS->getRawGlobalVariables() && - ImportedEntities == RHS->getRawImportedEntities(); + ImportedEntities == RHS->getRawImportedEntities() && + DWOId == RHS->getDWOId(); } unsigned getHashValue() const { return hash_combine(SourceLanguage, File, Producer, IsOptimized, Flags, RuntimeVersion, SplitDebugFilename, EmissionKind, EnumTypes, RetainedTypes, Subprograms, GlobalVariables, - ImportedEntities); + ImportedEntities, DWOId); } }; |

