From: Paul Robinson Date: Tue, 21 May 2019 11:52:27 +0000 (+0000) Subject: [DebugInfo] Handle -main-file-name correctly for asm source. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=a2c6f638cb5f1cfb90fcd258addc7bbcf69a3907;p=llvm [DebugInfo] Handle -main-file-name correctly for asm source. This option provides only the base filename, not a full relative path. Part of the fix for PR41839. Differential Revision: https://reviews.llvm.org/D62071 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@361245 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/MC/MCContext.cpp b/lib/MC/MCContext.cpp index 6ca7d3df19d..e83702eebe0 100644 --- a/lib/MC/MCContext.cpp +++ b/lib/MC/MCContext.cpp @@ -582,10 +582,21 @@ void MCContext::setGenDwarfRootFile(StringRef InputFileName, StringRef Buffer) { } // Canonicalize the root filename. It cannot be empty, and should not // repeat the compilation dir. - StringRef FileName = - !getMainFileName().empty() ? StringRef(getMainFileName()) : InputFileName; - if (FileName.empty() || FileName == "-") - FileName = ""; + // The MCContext ctor initializes MainFileName to the name associated with + // the SrcMgr's main file ID, which might be the same as InputFileName (and + // possibly include directory components). + // Or, MainFileName might have been overridden by a -main-file-name option, + // which is supposed to be just a base filename with no directory component. + // So, if the InputFileName and MainFileName are not equal, assume + // MainFileName is a substitute basename and replace the last component. + SmallString<1024> FileNameBuf = InputFileName; + if (FileNameBuf.empty() || FileNameBuf == "-") + FileNameBuf = ""; + if (!getMainFileName().empty() && FileNameBuf != getMainFileName()) { + llvm::sys::path::remove_filename(FileNameBuf); + llvm::sys::path::append(FileNameBuf, getMainFileName()); + } + StringRef FileName = FileNameBuf; if (FileName.consume_front(getCompilationDir())) if (llvm::sys::path::is_separator(FileName.front())) FileName = FileName.drop_front(); diff --git a/test/DebugInfo/X86/main-file-name.s b/test/DebugInfo/X86/main-file-name.s deleted file mode 100644 index a37ef7d5051..00000000000 --- a/test/DebugInfo/X86/main-file-name.s +++ /dev/null @@ -1,17 +0,0 @@ -// RUN: llvm-mc -triple x86_64-unknown-linux-gnu -filetype obj -main-file-name foo.S -g -o %t %s -// RUN: llvm-dwarfdump -v -debug-info %t | FileCheck %s - -// CHECK: DW_TAG_compile_unit [1] -// CHECK-NOT: DW_TAG_ -// CHECK: DW_AT_name [DW_FORM_string] ("foo.S") - - -# 1 "foo.S" -# 1 "" 1 -# 1 "foo.S" 2 - -foo: - nop - nop - nop - diff --git a/test/MC/ELF/debug-main-file.s b/test/MC/ELF/debug-main-file.s new file mode 100644 index 00000000000..65f9350c15a --- /dev/null +++ b/test/MC/ELF/debug-main-file.s @@ -0,0 +1,41 @@ +// RUN: mkdir -p %t/Inputs +// RUN: cp %s %t/base.s +// RUN: cp %s %t/Inputs/subdir.s +// RUN: cd %t + +// RUN: llvm-mc -triple=x86_64-linux-unknown -filetype=obj -dwarf-version=4 \ +// RUN: -g base.s -o %t1.o +// RUN: llvm-dwarfdump -debug-info %t1.o | \ +// RUN: FileCheck %s --check-prefixes=CHECK,BASE +// RUN: llvm-mc -triple=x86_64-linux-unknown -filetype=obj -dwarf-version=4 \ +// RUN: -g base.s -o %t2.o -main-file-name rename.s +// RUN: llvm-dwarfdump -debug-info %t2.o | \ +// RUN: FileCheck %s --check-prefixes=CHECK,RENAME +// RUN: llvm-mc -triple=x86_64-linux-unknown -filetype=obj -dwarf-version=4 \ +// RUN: -g Inputs\subdir.s -o %t3.o +// RUN: llvm-dwarfdump -debug-info %t3.o | \ +// RUN: FileCheck %s --check-prefixes=CHECK,SUBDIR +// RUN: llvm-mc -triple=x86_64-linux-unknown -filetype=obj -dwarf-version=4 \ +// RUN: -g Inputs\subdir.s -main-file-name sub-rename.s -o %t4.o +// RUN: llvm-dwarfdump -debug-info %t4.o | \ +// RUN: FileCheck %s --check-prefixes=CHECK,SUB-RENAME + +// CHECK: DW_TAG_compile_unit +// CHECK-NOT: DW_TAG +// CHECK: DW_AT_name +// BASE-SAME: ("base.s") +// RENAME-SAME: ("rename.s") +// SUBDIR-SAME: ("Inputs{{(/|\\)+}}subdir.s") +// SUB-RENAME-SAME: ("Inputs{{(/|\\)+}}sub-rename.s") + +// CHECK: DW_TAG_label +// CHECK-NOT: DW_TAG +// CHECK: DW_AT_decl_file +// BASE-SAME: ("{{.*(/|\\)}}base.s") +// RENAME-SAME: ("{{.*(/|\\)}}rename.s") +// SUBDIR-SAME: ("{{.*Inputs(/|\\)+}}subdir.s") +// SUB-RENAME-SAME: ("{{.*Inputs(/|\\)+}}sub-rename.s") + + .text +start: + nop