diff --git a/llvm/bindings/go/llvm/dibuilder.go b/llvm/bindings/go/llvm/dibuilder.go --- a/llvm/bindings/go/llvm/dibuilder.go +++ b/llvm/bindings/go/llvm/dibuilder.go @@ -118,6 +118,7 @@ Flags string RuntimeVersion int SysRoot string + SDK string } // CreateCompileUnit creates compile unit debug metadata. @@ -132,6 +133,8 @@ defer C.free(unsafe.Pointer(flags)) sysroot := C.CString(cu.SysRoot) defer C.free(unsafe.Pointer(sysroot)) + sdk := C.CString(cu.SDK) + defer C.free(unsafe.Pointer(sdk)) result := C.LLVMDIBuilderCreateCompileUnit( d.ref, C.LLVMDWARFSourceLanguage(cu.Language), @@ -146,6 +149,7 @@ /*SplitDebugInlining*/ C.LLVMBool(boolToCInt(true)), /*DebugInfoForProfiling*/ C.LLVMBool(boolToCInt(false)), sysroot, C.size_t(len(cu.SysRoot)), + sdk, C.size_t(len(cu.SDK)), ) return Metadata{C: result} } diff --git a/llvm/include/llvm-c/DebugInfo.h b/llvm/include/llvm-c/DebugInfo.h --- a/llvm/include/llvm-c/DebugInfo.h +++ b/llvm/include/llvm-c/DebugInfo.h @@ -252,6 +252,8 @@ * profile collection. * \param SysRoot The Clang system root (value of -isysroot). * \param SysRootLen The length of the C string passed to \c SysRoot. + * \param SDK The SDK. On Darwin, the last component of the sysroot. + * \param SDKLen The length of the C string passed to \c SDK. */ LLVMMetadataRef LLVMDIBuilderCreateCompileUnit( LLVMDIBuilderRef Builder, LLVMDWARFSourceLanguage Lang, @@ -259,7 +261,8 @@ LLVMBool isOptimized, const char *Flags, size_t FlagsLen, unsigned RuntimeVer, const char *SplitName, size_t SplitNameLen, LLVMDWARFEmissionKind Kind, unsigned DWOId, LLVMBool SplitDebugInlining, - LLVMBool DebugInfoForProfiling, const char *SysRoot, size_t SysRootLen); + LLVMBool DebugInfoForProfiling, const char *SysRoot, size_t SysRootLen, + const char *SDK, size_t SDKLen); /** * Create a file descriptor to hold debugging information for a file. diff --git a/llvm/include/llvm/BinaryFormat/Dwarf.def b/llvm/include/llvm/BinaryFormat/Dwarf.def --- a/llvm/include/llvm/BinaryFormat/Dwarf.def +++ b/llvm/include/llvm/BinaryFormat/Dwarf.def @@ -427,6 +427,7 @@ HANDLE_DW_AT(0x3fec, APPLE_objc_complete_type, 0, APPLE) HANDLE_DW_AT(0x3fed, APPLE_property, 0, APPLE) HANDLE_DW_AT(0x3fee, APPLE_objc_direct, 0, APPLE) +HANDLE_DW_AT(0x3fef, APPLE_sdk, 0, APPLE) // Attribute form encodings. HANDLE_DW_FORM(0x01, addr, 2, DWARF) diff --git a/llvm/include/llvm/IR/DIBuilder.h b/llvm/include/llvm/IR/DIBuilder.h --- a/llvm/include/llvm/IR/DIBuilder.h +++ b/llvm/include/llvm/IR/DIBuilder.h @@ -136,6 +136,8 @@ /// \param NameTableKind Whether to emit .debug_gnu_pubnames, /// .debug_pubnames, or no pubnames at all. /// \param SysRoot The clang system root (value of -isysroot). + /// \param SDK The SDK name. On Darwin, this is the last component + /// of the sysroot. DICompileUnit * createCompileUnit(unsigned Lang, DIFile *File, StringRef Producer, bool isOptimized, StringRef Flags, unsigned RV, @@ -146,7 +148,8 @@ bool DebugInfoForProfiling = false, DICompileUnit::DebugNameTableKind NameTableKind = DICompileUnit::DebugNameTableKind::Default, - bool RangesBaseAddress = false, StringRef SysRoot = {}); + bool RangesBaseAddress = false, StringRef SysRoot = {}, + StringRef SDK = {}); /// Create a file descriptor to hold debugging information for a file. /// \param Filename File name. diff --git a/llvm/include/llvm/IR/DebugInfoMetadata.h b/llvm/include/llvm/IR/DebugInfoMetadata.h --- a/llvm/include/llvm/IR/DebugInfoMetadata.h +++ b/llvm/include/llvm/IR/DebugInfoMetadata.h @@ -1173,7 +1173,7 @@ DIImportedEntityArray ImportedEntities, DIMacroNodeArray Macros, uint64_t DWOId, bool SplitDebugInlining, bool DebugInfoForProfiling, unsigned NameTableKind, bool RangesBaseAddress, StringRef SysRoot, - StorageType Storage, bool ShouldCreate = true) { + StringRef SDK, StorageType Storage, bool ShouldCreate = true) { return getImpl( Context, SourceLanguage, File, getCanonicalMDString(Context, Producer), IsOptimized, getCanonicalMDString(Context, Flags), RuntimeVersion, @@ -1181,7 +1181,8 @@ EnumTypes.get(), RetainedTypes.get(), GlobalVariables.get(), ImportedEntities.get(), Macros.get(), DWOId, SplitDebugInlining, DebugInfoForProfiling, NameTableKind, RangesBaseAddress, - getCanonicalMDString(Context, SysRoot), Storage, ShouldCreate); + getCanonicalMDString(Context, SysRoot), + getCanonicalMDString(Context, SDK), Storage, ShouldCreate); } static DICompileUnit * getImpl(LLVMContext &Context, unsigned SourceLanguage, Metadata *File, @@ -1191,8 +1192,8 @@ Metadata *GlobalVariables, Metadata *ImportedEntities, Metadata *Macros, uint64_t DWOId, bool SplitDebugInlining, bool DebugInfoForProfiling, unsigned NameTableKind, - bool RangesBaseAddress, MDString *SysRoot, StorageType Storage, - bool ShouldCreate = true); + bool RangesBaseAddress, MDString *SysRoot, MDString *SDK, + StorageType Storage, bool ShouldCreate = true); TempDICompileUnit cloneImpl() const { return getTemporary( @@ -1201,7 +1202,7 @@ getEmissionKind(), getEnumTypes(), getRetainedTypes(), getGlobalVariables(), getImportedEntities(), getMacros(), DWOId, getSplitDebugInlining(), getDebugInfoForProfiling(), getNameTableKind(), - getRangesBaseAddress(), getSysRoot()); + getRangesBaseAddress(), getSysRoot(), getSDK()); } public: @@ -1218,12 +1219,12 @@ DIImportedEntityArray ImportedEntities, DIMacroNodeArray Macros, uint64_t DWOId, bool SplitDebugInlining, bool DebugInfoForProfiling, DebugNameTableKind NameTableKind, bool RangesBaseAddress, - StringRef SysRoot), + StringRef SysRoot, StringRef SDK), (SourceLanguage, File, Producer, IsOptimized, Flags, RuntimeVersion, SplitDebugFilename, EmissionKind, EnumTypes, RetainedTypes, GlobalVariables, ImportedEntities, Macros, DWOId, SplitDebugInlining, DebugInfoForProfiling, (unsigned)NameTableKind, RangesBaseAddress, - SysRoot)) + SysRoot, SDK)) DEFINE_MDNODE_GET_DISTINCT_TEMPORARY( DICompileUnit, (unsigned SourceLanguage, Metadata *File, MDString *Producer, @@ -1232,11 +1233,12 @@ Metadata *RetainedTypes, Metadata *GlobalVariables, Metadata *ImportedEntities, Metadata *Macros, uint64_t DWOId, bool SplitDebugInlining, bool DebugInfoForProfiling, - unsigned NameTableKind, bool RangesBaseAddress, MDString *SysRoot), + unsigned NameTableKind, bool RangesBaseAddress, MDString *SysRoot, + MDString *SDK), (SourceLanguage, File, Producer, IsOptimized, Flags, RuntimeVersion, SplitDebugFilename, EmissionKind, EnumTypes, RetainedTypes, GlobalVariables, ImportedEntities, Macros, DWOId, SplitDebugInlining, - DebugInfoForProfiling, NameTableKind, RangesBaseAddress, SysRoot)) + DebugInfoForProfiling, NameTableKind, RangesBaseAddress, SysRoot, SDK)) TempDICompileUnit clone() const { return cloneImpl(); } @@ -1279,6 +1281,7 @@ this->SplitDebugInlining = SplitDebugInlining; } StringRef getSysRoot() const { return getStringOperand(9); } + StringRef getSDK() const { return getStringOperand(10); } MDString *getRawProducer() const { return getOperandAs(1); } MDString *getRawFlags() const { return getOperandAs(2); } @@ -1291,6 +1294,7 @@ Metadata *getRawImportedEntities() const { return getOperand(7); } Metadata *getRawMacros() const { return getOperand(8); } MDString *getRawSysRoot() const { return getOperandAs(9); } + MDString *getRawSDK() const { return getOperandAs(10); } /// Replace arrays. /// diff --git a/llvm/lib/AsmParser/LLParser.cpp b/llvm/lib/AsmParser/LLParser.cpp --- a/llvm/lib/AsmParser/LLParser.cpp +++ b/llvm/lib/AsmParser/LLParser.cpp @@ -4637,7 +4637,7 @@ /// splitDebugFilename: "abc.debug", /// emissionKind: FullDebug, enums: !1, retainedTypes: !2, /// globals: !4, imports: !5, macros: !6, dwoId: 0x0abcd, -/// sysroot: "/") +/// sysroot: "/", sdk: "MacOSX.sdk") bool LLParser::ParseDICompileUnit(MDNode *&Result, bool IsDistinct) { if (!IsDistinct) return Lex.Error("missing 'distinct', required for !DICompileUnit"); @@ -4661,7 +4661,8 @@ OPTIONAL(debugInfoForProfiling, MDBoolField, = false); \ OPTIONAL(nameTableKind, NameTableKindField, ); \ OPTIONAL(debugBaseAddress, MDBoolField, = false); \ - OPTIONAL(sysroot, MDStringField, ); + OPTIONAL(sysroot, MDStringField, ); \ + OPTIONAL(sdk, MDStringField, ); PARSE_MD_FIELDS(); #undef VISIT_MD_FIELDS @@ -4670,7 +4671,7 @@ runtimeVersion.Val, splitDebugFilename.Val, emissionKind.Val, enums.Val, retainedTypes.Val, globals.Val, imports.Val, macros.Val, dwoId.Val, splitDebugInlining.Val, debugInfoForProfiling.Val, nameTableKind.Val, - debugBaseAddress.Val, sysroot.Val); + debugBaseAddress.Val, sysroot.Val, sdk.Val); return false; } diff --git a/llvm/lib/Bitcode/Reader/MetadataLoader.cpp b/llvm/lib/Bitcode/Reader/MetadataLoader.cpp --- a/llvm/lib/Bitcode/Reader/MetadataLoader.cpp +++ b/llvm/lib/Bitcode/Reader/MetadataLoader.cpp @@ -1456,7 +1456,7 @@ break; } case bitc::METADATA_COMPILE_UNIT: { - if (Record.size() < 14 || Record.size() > 21) + if (Record.size() < 14 || Record.size() > 22) return error("Invalid record"); // Ignore Record[0], which indicates whether this compile unit is @@ -1474,7 +1474,8 @@ Record.size() <= 18 ? 0 : Record[18], false, // FIXME: https://reviews.llvm.org/rGc51b45e32ef7f35c11891f60871aa9c2c04cd991 // Record.size() <= 19 ? 0 : Record[19], - Record.size() <= 20 ? nullptr : getMDString(Record[20])); + Record.size() <= 20 ? nullptr : getMDString(Record[20]), + Record.size() <= 21 ? nullptr : getMDString(Record[21])); MetadataList.assignValue(CU, NextMetadataNo); NextMetadataNo++; diff --git a/llvm/lib/Bitcode/Writer/BitcodeWriter.cpp b/llvm/lib/Bitcode/Writer/BitcodeWriter.cpp --- a/llvm/lib/Bitcode/Writer/BitcodeWriter.cpp +++ b/llvm/lib/Bitcode/Writer/BitcodeWriter.cpp @@ -1669,6 +1669,7 @@ Record.push_back((unsigned)N->getNameTableKind()); Record.push_back(N->getRangesBaseAddress()); Record.push_back(VE.getMetadataOrNullID(N->getRawSysRoot())); + Record.push_back(VE.getMetadataOrNullID(N->getRawSDK())); Stream.EmitRecord(bitc::METADATA_COMPILE_UNIT, Record, Abbrev); Record.clear(); diff --git a/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp b/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp --- a/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp +++ b/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp @@ -930,6 +930,9 @@ StringRef SysRoot = DIUnit->getSysRoot(); if (!SysRoot.empty()) NewCU.addString(Die, dwarf::DW_AT_LLVM_sysroot, SysRoot); + StringRef SDK = DIUnit->getSDK(); + if (!SDK.empty()) + NewCU.addString(Die, dwarf::DW_AT_APPLE_sdk, SDK); // Add DW_str_offsets_base to the unit DIE, except for split units. if (useSegmentedStringOffsetsTable() && !useSplitDwarf()) diff --git a/llvm/lib/IR/AsmWriter.cpp b/llvm/lib/IR/AsmWriter.cpp --- a/llvm/lib/IR/AsmWriter.cpp +++ b/llvm/lib/IR/AsmWriter.cpp @@ -1948,6 +1948,7 @@ Printer.printNameTableKind("nameTableKind", N->getNameTableKind()); Printer.printBool("rangesBaseAddress", N->getRangesBaseAddress(), false); Printer.printString("sysroot", N->getSysRoot()); + Printer.printString("sdk", N->getSDK()); Out << ")"; } diff --git a/llvm/lib/IR/DIBuilder.cpp b/llvm/lib/IR/DIBuilder.cpp --- a/llvm/lib/IR/DIBuilder.cpp +++ b/llvm/lib/IR/DIBuilder.cpp @@ -141,7 +141,7 @@ DICompileUnit::DebugEmissionKind Kind, uint64_t DWOId, bool SplitDebugInlining, bool DebugInfoForProfiling, DICompileUnit::DebugNameTableKind NameTableKind, bool RangesBaseAddress, - StringRef SysRoot) { + StringRef SysRoot, StringRef SDK) { assert(((Lang <= dwarf::DW_LANG_Fortran08 && Lang >= dwarf::DW_LANG_C89) || (Lang <= dwarf::DW_LANG_hi_user && Lang >= dwarf::DW_LANG_lo_user)) && @@ -152,7 +152,7 @@ VMContext, Lang, File, Producer, isOptimized, Flags, RunTimeVer, SplitName, Kind, nullptr, nullptr, nullptr, nullptr, nullptr, DWOId, SplitDebugInlining, DebugInfoForProfiling, NameTableKind, - RangesBaseAddress, SysRoot); + RangesBaseAddress, SysRoot, SDK); // Create a named metadata so that it is easier to find cu in a module. NamedMDNode *NMD = M.getOrInsertNamedMetadata("llvm.dbg.cu"); diff --git a/llvm/lib/IR/DebugInfo.cpp b/llvm/lib/IR/DebugInfo.cpp --- a/llvm/lib/IR/DebugInfo.cpp +++ b/llvm/lib/IR/DebugInfo.cpp @@ -497,7 +497,7 @@ RetainedTypes, GlobalVariables, ImportedEntities, CU->getMacros(), CU->getDWOId(), CU->getSplitDebugInlining(), CU->getDebugInfoForProfiling(), CU->getNameTableKind(), - CU->getRangesBaseAddress(), CU->getSysRoot()); + CU->getRangesBaseAddress(), CU->getSysRoot(), CU->getSDK()); } DILocation *getReplacementMDLocation(DILocation *MLD) { @@ -765,7 +765,8 @@ LLVMBool isOptimized, const char *Flags, size_t FlagsLen, unsigned RuntimeVer, const char *SplitName, size_t SplitNameLen, LLVMDWARFEmissionKind Kind, unsigned DWOId, LLVMBool SplitDebugInlining, - LLVMBool DebugInfoForProfiling, const char *SysRoot, size_t SysRootLen) { + LLVMBool DebugInfoForProfiling, const char *SysRoot, size_t SysRootLen, + const char *SDK, size_t SDKLen) { auto File = unwrapDI(FileRef); return wrap(unwrap(Builder)->createCompileUnit( @@ -775,7 +776,7 @@ static_cast(Kind), DWOId, SplitDebugInlining, DebugInfoForProfiling, DICompileUnit::DebugNameTableKind::Default, false, - StringRef(SysRoot, SysRootLen))); + StringRef(SysRoot, SysRootLen), StringRef(SDK, SDKLen))); } LLVMMetadataRef diff --git a/llvm/lib/IR/DebugInfoMetadata.cpp b/llvm/lib/IR/DebugInfoMetadata.cpp --- a/llvm/lib/IR/DebugInfoMetadata.cpp +++ b/llvm/lib/IR/DebugInfoMetadata.cpp @@ -521,16 +521,23 @@ Metadata *GlobalVariables, Metadata *ImportedEntities, Metadata *Macros, uint64_t DWOId, bool SplitDebugInlining, bool DebugInfoForProfiling, unsigned NameTableKind, bool RangesBaseAddress, MDString *SysRoot, - StorageType Storage, bool ShouldCreate) { + MDString *SDK, StorageType Storage, bool ShouldCreate) { assert(Storage != Uniqued && "Cannot unique DICompileUnit"); assert(isCanonical(Producer) && "Expected canonical MDString"); assert(isCanonical(Flags) && "Expected canonical MDString"); assert(isCanonical(SplitDebugFilename) && "Expected canonical MDString"); - Metadata *Ops[] = { - File, Producer, Flags, SplitDebugFilename, - EnumTypes, RetainedTypes, GlobalVariables, ImportedEntities, - Macros, SysRoot}; + Metadata *Ops[] = {File, + Producer, + Flags, + SplitDebugFilename, + EnumTypes, + RetainedTypes, + GlobalVariables, + ImportedEntities, + Macros, + SysRoot, + SDK}; return storeImpl(new (array_lengthof(Ops)) DICompileUnit( Context, Storage, SourceLanguage, IsOptimized, RuntimeVersion, EmissionKind, DWOId, SplitDebugInlining, diff --git a/llvm/test/DebugInfo/X86/split-dwarf-sysroot.ll b/llvm/test/DebugInfo/X86/split-dwarf-sysroot.ll --- a/llvm/test/DebugInfo/X86/split-dwarf-sysroot.ll +++ b/llvm/test/DebugInfo/X86/split-dwarf-sysroot.ll @@ -4,9 +4,11 @@ ; CHECK: DW_TAG_skeleton_unit ; CHECK-NOT: DW_AT_LLVM_sysroot +; CHECK-NOT: DW_AT_LLVM_sdk ; CHECK: DW_TAG_compile_unit ; CHECK-NOT: DW_TAG ; CHECK: DW_AT_LLVM_sysroot ("/opt/clang-root") +; CHECK: DW_AT_APPLE_sdk ("Linux.sdk") target triple = "x86_64-pc-linux" @@ -21,7 +23,7 @@ !llvm.dbg.cu = !{!0} !llvm.module.flags = !{!6, !7, !8} -!0 = distinct !DICompileUnit(language: DW_LANG_C, file: !1, emissionKind: FullDebug, enums: !2, sysroot: "/opt/clang-root") +!0 = distinct !DICompileUnit(language: DW_LANG_C, file: !1, emissionKind: FullDebug, enums: !2, sysroot: "/opt/clang-root", sdk: "Linux.sdk") !1 = !DIFile(filename: "a.c", directory: "/") !2 = !{} !6 = !{i32 2, !"Dwarf Version", i32 5} diff --git a/llvm/tools/llvm-c-test/debuginfo.c b/llvm/tools/llvm-c-test/debuginfo.c --- a/llvm/tools/llvm-c-test/debuginfo.c +++ b/llvm/tools/llvm-c-test/debuginfo.c @@ -38,7 +38,7 @@ LLVMMetadataRef CompileUnit = LLVMDIBuilderCreateCompileUnit( DIB, LLVMDWARFSourceLanguageC, File, "llvm-c-test", 11, 0, NULL, 0, 0, - NULL, 0, LLVMDWARFEmissionFull, 0, 0, 0, "/", 1); + NULL, 0, LLVMDWARFEmissionFull, 0, 0, 0, "/", 1, "", 0); LLVMMetadataRef Module = LLVMDIBuilderCreateModule(DIB, CompileUnit, diff --git a/llvm/unittests/IR/MetadataTest.cpp b/llvm/unittests/IR/MetadataTest.cpp --- a/llvm/unittests/IR/MetadataTest.cpp +++ b/llvm/unittests/IR/MetadataTest.cpp @@ -96,7 +96,7 @@ Context, 1, getFile(), "clang", false, "-g", 2, "", DICompileUnit::FullDebug, getTuple(), getTuple(), getTuple(), getTuple(), getTuple(), 0, true, false, - DICompileUnit::DebugNameTableKind::Default, false, "/"); + DICompileUnit::DebugNameTableKind::Default, false, "/", ""); } DIType *getBasicType(StringRef Name) { return DIBasicType::get(Context, dwarf::DW_TAG_unspecified_type, Name); @@ -1710,11 +1710,12 @@ uint64_t DWOId = 0x10000000c0ffee; MDTuple *Macros = getTuple(); StringRef SysRoot = "/"; + StringRef SDK = "MacOSX.sdk"; auto *N = DICompileUnit::getDistinct( Context, SourceLanguage, File, Producer, IsOptimized, Flags, RuntimeVersion, SplitDebugFilename, EmissionKind, EnumTypes, RetainedTypes, GlobalVariables, ImportedEntities, Macros, DWOId, true, - false, DICompileUnit::DebugNameTableKind::Default, false, SysRoot); + false, DICompileUnit::DebugNameTableKind::Default, false, SysRoot, SDK); EXPECT_EQ(dwarf::DW_TAG_compile_unit, N->getTag()); EXPECT_EQ(SourceLanguage, N->getSourceLanguage()); @@ -1732,6 +1733,7 @@ EXPECT_EQ(Macros, N->getMacros().get()); EXPECT_EQ(DWOId, N->getDWOId()); EXPECT_EQ(SysRoot, N->getSysRoot()); + EXPECT_EQ(SDK, N->getSDK()); TempDICompileUnit Temp = N->clone(); EXPECT_EQ(dwarf::DW_TAG_compile_unit, Temp->getTag()); @@ -1749,6 +1751,7 @@ EXPECT_EQ(ImportedEntities, Temp->getImportedEntities().get()); EXPECT_EQ(Macros, Temp->getMacros().get()); EXPECT_EQ(SysRoot, Temp->getSysRoot()); + EXPECT_EQ(SDK, Temp->getSDK()); auto *TempAddress = Temp.get(); auto *Clone = MDNode::replaceWithPermanent(std::move(Temp)); @@ -1770,11 +1773,12 @@ MDTuple *ImportedEntities = MDTuple::getDistinct(Context, None); uint64_t DWOId = 0xc0ffee; StringRef SysRoot = "/"; + StringRef SDK = "MacOSX.sdk"; auto *N = DICompileUnit::getDistinct( Context, SourceLanguage, File, Producer, IsOptimized, Flags, RuntimeVersion, SplitDebugFilename, EmissionKind, EnumTypes, RetainedTypes, nullptr, ImportedEntities, nullptr, DWOId, true, false, - DICompileUnit::DebugNameTableKind::Default, false, SysRoot); + DICompileUnit::DebugNameTableKind::Default, false, SysRoot, SDK); auto *GlobalVariables = MDTuple::getDistinct(Context, None); EXPECT_EQ(nullptr, N->getGlobalVariables().get());