diff --git a/llvm/include/llvm/MC/MCAsmInfo.h b/llvm/include/llvm/MC/MCAsmInfo.h --- a/llvm/include/llvm/MC/MCAsmInfo.h +++ b/llvm/include/llvm/MC/MCAsmInfo.h @@ -341,6 +341,10 @@ /// argument and how it is interpreted. Defaults to NoAlignment. LCOMM::LCOMMType LCOMMDirectiveAlignmentType = LCOMM::NoAlignment; + /// True if the target only has basename for .file directive. False if the + /// target also needs the directory along with the basename. Default to true. + bool HasBasenameOnlyForFileDirective = true; + // True if the target allows .align directives on functions. This is true for // most targets, so defaults to true. bool HasFunctionAlignment = true; @@ -666,6 +670,9 @@ return LCOMMDirectiveAlignmentType; } + bool hasBasenameOnlyForFileDirective() const { + return HasBasenameOnlyForFileDirective; + } bool hasFunctionAlignment() const { return HasFunctionAlignment; } bool hasDotTypeDotSizeDirective() const { return HasDotTypeDotSizeDirective; } bool hasSingleParameterDotFile() const { return HasSingleParameterDotFile; } diff --git a/llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp b/llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp --- a/llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp +++ b/llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp @@ -297,8 +297,11 @@ // don't, this at least helps the user find where a global came from. if (MAI->hasSingleParameterDotFile()) { // .file "foo.c" - OutStreamer->emitFileDirective( - llvm::sys::path::filename(M.getSourceFileName())); + if (MAI->hasBasenameOnlyForFileDirective()) + OutStreamer->emitFileDirective( + llvm::sys::path::filename(M.getSourceFileName())); + else + OutStreamer->emitFileDirective(M.getSourceFileName()); } GCModuleInfo *MI = getAnalysisIfAvailable(); diff --git a/llvm/lib/MC/MCAsmInfoXCOFF.cpp b/llvm/lib/MC/MCAsmInfoXCOFF.cpp --- a/llvm/lib/MC/MCAsmInfoXCOFF.cpp +++ b/llvm/lib/MC/MCAsmInfoXCOFF.cpp @@ -19,6 +19,7 @@ MCAsmInfoXCOFF::MCAsmInfoXCOFF() { IsLittleEndian = false; HasVisibilityOnlyWithLinkage = true; + HasBasenameOnlyForFileDirective = false; PrivateGlobalPrefix = "L.."; PrivateLabelPrefix = "L.."; SupportsQuotedNames = false; diff --git a/llvm/test/CodeGen/PowerPC/aix-filename-absolute-path.ll b/llvm/test/CodeGen/PowerPC/aix-filename-absolute-path.ll new file mode 100644 --- /dev/null +++ b/llvm/test/CodeGen/PowerPC/aix-filename-absolute-path.ll @@ -0,0 +1,8 @@ +; RUN: llc -verify-machineinstrs -mtriple powerpc-ibm-aix-xcoff < %s \ +; RUN: | FileCheck %s +; RUN: llc -verify-machineinstrs -mtriple powerpc64-ibm-aix-xcoff < %s \ +; RUN: | FileCheck %s + +; CHECK: .file "/absolute/path/to/file" + +source_filename = "/absolute/path/to/file" diff --git a/llvm/test/CodeGen/PowerPC/aix-filename-relative-path.ll b/llvm/test/CodeGen/PowerPC/aix-filename-relative-path.ll new file mode 100644 --- /dev/null +++ b/llvm/test/CodeGen/PowerPC/aix-filename-relative-path.ll @@ -0,0 +1,8 @@ +; RUN: llc -verify-machineinstrs -mtriple powerpc-ibm-aix-xcoff < %s \ +; RUN: | FileCheck %s +; RUN: llc -verify-machineinstrs -mtriple powerpc64-ibm-aix-xcoff < %s \ +; RUN: | FileCheck %s + +; CHECK: .file "../relative/path/to/file" + +source_filename = "../relative/path/to/file"