From 842ea709e4ed881c2bc59155af5df910eccda9c6 Mon Sep 17 00:00:00 2001 From: Adrian Prantl Date: Thu, 12 Mar 2020 14:19:04 -0700 Subject: [PATCH] Debug Info: Store the SDK in the DICompileUnit. This is another intermediate step for PR44213 (https://bugs.llvm.org/show_bug.cgi?id=44213). This stores the SDK *name* in the debug info, to make it possible to `-fdebug-prefix-map`-replace the sysroot with a recognizable string and allowing the debugger to find a fitting SDK relative to itself, not the machine the executable was compiled on. rdar://problem/51645582 --- clang/lib/CodeGen/CGDebugInfo.cpp | 12 +++++++++--- clang/test/CodeGen/debug-info-sysroot-sdk.c | 16 ++++++++++++++++ clang/test/CodeGen/debug-info-sysroot.c | 15 --------------- 3 files changed, 25 insertions(+), 18 deletions(-) create mode 100644 clang/test/CodeGen/debug-info-sysroot-sdk.c delete mode 100644 clang/test/CodeGen/debug-info-sysroot.c diff --git a/clang/lib/CodeGen/CGDebugInfo.cpp b/clang/lib/CodeGen/CGDebugInfo.cpp index 551d423..eeb1927 100644 --- a/clang/lib/CodeGen/CGDebugInfo.cpp +++ b/clang/lib/CodeGen/CGDebugInfo.cpp @@ -611,9 +611,15 @@ void CGDebugInfo::CreateCompileUnit() { remapDIPath(MainFileName), remapDIPath(getCurrentDirname()), CSInfo, getSource(SM, SM.getMainFileID())); - StringRef Sysroot; - if (CGM.getCodeGenOpts().getDebuggerTuning() == llvm::DebuggerKind::LLDB) + StringRef Sysroot, SDK; + if (CGM.getCodeGenOpts().getDebuggerTuning() == llvm::DebuggerKind::LLDB) { Sysroot = CGM.getHeaderSearchOpts().Sysroot; + auto B = llvm::sys::path::rbegin(Sysroot); + auto E = llvm::sys::path::rend(Sysroot); + auto It = std::find_if(B, E, [](auto SDK) { return SDK.endswith(".sdk"); }); + if (It != E) + SDK = *It; + } // Create new compile unit. TheCU = DBuilder.createCompileUnit( @@ -625,7 +631,7 @@ void CGDebugInfo::CreateCompileUnit() { ? llvm::DICompileUnit::DebugNameTableKind::None : static_cast( CGOpts.DebugNameTable), - CGOpts.DebugRangesBaseAddress, Sysroot); + CGOpts.DebugRangesBaseAddress, Sysroot, SDK); } llvm::DIType *CGDebugInfo::CreateType(const BuiltinType *BT) { diff --git a/clang/test/CodeGen/debug-info-sysroot-sdk.c b/clang/test/CodeGen/debug-info-sysroot-sdk.c new file mode 100644 index 0000000..5c4d201 --- /dev/null +++ b/clang/test/CodeGen/debug-info-sysroot-sdk.c @@ -0,0 +1,16 @@ +// RUN: %clang_cc1 -debug-info-kind=limited -triple %itanium_abi_triple \ +// RUN: %s -isysroot /CLANG_SYSROOT/MacOSX.sdk -emit-llvm -o - \ +// RUN: -debugger-tuning=lldb | FileCheck %s --check-prefix=LLDB +// RUN: %clang_cc1 -debug-info-kind=limited -triple %itanium_abi_triple \ +// RUN: %s -isysroot /CLANG_SYSROOT/MacOSX.sdk -emit-llvm -o - \ +// RUN: -debugger-tuning=gdb | FileCheck %s --check-prefix=GDB + +void foo() {} + +// The sysroot and sdk are LLDB-tuning-specific attributes. + +// LLDB: distinct !DICompileUnit({{.*}}sysroot: "/CLANG_SYSROOT/MacOSX.sdk", +// LLDB-SAME: sdk: "MacOSX.sdk" +// GDB: distinct !DICompileUnit( +// GDB-NOT: sysroot: "/CLANG_SYSROOT/MacOSX.sdk" +// GDB-NOT: sdk: "MacOSX.sdk" diff --git a/clang/test/CodeGen/debug-info-sysroot.c b/clang/test/CodeGen/debug-info-sysroot.c deleted file mode 100644 index bb3c0c8..0000000 --- a/clang/test/CodeGen/debug-info-sysroot.c +++ /dev/null @@ -1,15 +0,0 @@ -// RUN: %clang_cc1 -debug-info-kind=limited -triple %itanium_abi_triple \ -// RUN: %s -isysroot /CLANG_SYSROOT -emit-llvm -o - \ -// RUN: -debugger-tuning=lldb | FileCheck %s --check-prefix=LLDB -// RUN: %clang_cc1 -debug-info-kind=limited -triple %itanium_abi_triple \ -// RUN: %s -isysroot /CLANG_SYSROOT -emit-llvm -o - \ -// RUN: -debugger-tuning=gdb | FileCheck %s --check-prefix=GDB - -void foo() {} - -// The sysroot is an LLDB-tuning-specific attribute. - -// LLDB: distinct !DICompileUnit({{.*}}sysroot: "/CLANG_SYSROOT" -// GDB: distinct !DICompileUnit( -// GDB-NOT: sysroot: "/CLANG_SYSROOT" - -- 2.7.4