Index: llvm/trunk/lib/MC/MCContext.cpp =================================================================== --- llvm/trunk/lib/MC/MCContext.cpp +++ llvm/trunk/lib/MC/MCContext.cpp @@ -582,10 +582,21 @@ } // 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(); Index: llvm/trunk/test/DebugInfo/X86/main-file-name.s =================================================================== --- llvm/trunk/test/DebugInfo/X86/main-file-name.s +++ llvm/trunk/test/DebugInfo/X86/main-file-name.s @@ -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 - Index: llvm/trunk/test/MC/ELF/debug-main-file.s =================================================================== --- llvm/trunk/test/MC/ELF/debug-main-file.s +++ llvm/trunk/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