From 3da9ca444f1095d12681e86b15160e6e1fb89d64 Mon Sep 17 00:00:00 2001 From: Teresa Johnson Date: Mon, 30 Sep 2019 15:05:35 +0000 Subject: [PATCH] [Clang] Use -main-file-name for source filename if not set -main-file-name is currently used to set the source name used in debug information. If the source filename is "-" and -main-file-name is set, then use the filename also for source_filename and ModuleID of the output. The argument is generally used outside the internal clang calls when running clang in a wrapper like icecc which gives the source via stdin but still wants to get a object file with the original source filename both in debug info and IR code. Patch by: the_jk (Joel Klinghed) Differential Revision: https://reviews.llvm.org/D67592 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@373217 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/clang/Driver/CC1Options.td | 2 +- lib/CodeGen/ModuleBuilder.cpp | 12 ++++++++++-- test/Frontend/stdin-input.c | 7 +++++++ 3 files changed, 18 insertions(+), 3 deletions(-) create mode 100644 test/Frontend/stdin-input.c diff --git a/include/clang/Driver/CC1Options.td b/include/clang/Driver/CC1Options.td index 2a93b82933..66906fb862 100644 --- a/include/clang/Driver/CC1Options.td +++ b/include/clang/Driver/CC1Options.td @@ -687,7 +687,7 @@ let Flags = [CC1Option, CC1AsOption, NoDriverOption] in { def version : Flag<["-"], "version">, HelpText<"Print the compiler version">; def main_file_name : Separate<["-"], "main-file-name">, - HelpText<"Main file name to use for debug info">; + HelpText<"Main file name to use for debug info and source if missing">; def split_dwarf_output : Separate<["-"], "split-dwarf-output">, HelpText<"File name to use for split dwarf debug info output">; diff --git a/lib/CodeGen/ModuleBuilder.cpp b/lib/CodeGen/ModuleBuilder.cpp index 414a6b8976..4154f6ebe7 100644 --- a/lib/CodeGen/ModuleBuilder.cpp +++ b/lib/CodeGen/ModuleBuilder.cpp @@ -65,6 +65,13 @@ namespace { private: SmallVector DeferredInlineMemberFuncDefs; + static llvm::StringRef ExpandModuleName(llvm::StringRef ModuleName, + const CodeGenOptions &CGO) { + if (ModuleName == "-" && !CGO.MainFileName.empty()) + return CGO.MainFileName; + return ModuleName; + } + public: CodeGeneratorImpl(DiagnosticsEngine &diags, llvm::StringRef ModuleName, const HeaderSearchOptions &HSO, @@ -73,7 +80,8 @@ namespace { CoverageSourceInfo *CoverageInfo = nullptr) : Diags(diags), Ctx(nullptr), HeaderSearchOpts(HSO), PreprocessorOpts(PPO), CodeGenOpts(CGO), HandlingTopLevelDecls(0), - CoverageInfo(CoverageInfo), M(new llvm::Module(ModuleName, C)) { + CoverageInfo(CoverageInfo), + M(new llvm::Module(ExpandModuleName(ModuleName, CGO), C)) { C.setDiscardValueNames(CGO.DiscardValueNames); } @@ -121,7 +129,7 @@ namespace { llvm::Module *StartModule(llvm::StringRef ModuleName, llvm::LLVMContext &C) { assert(!M && "Replacing existing Module?"); - M.reset(new llvm::Module(ModuleName, C)); + M.reset(new llvm::Module(ExpandModuleName(ModuleName, CodeGenOpts), C)); Initialize(*Ctx); return M.get(); } diff --git a/test/Frontend/stdin-input.c b/test/Frontend/stdin-input.c new file mode 100644 index 0000000000..334c167602 --- /dev/null +++ b/test/Frontend/stdin-input.c @@ -0,0 +1,7 @@ +// RUN: cat %s | %clang -emit-llvm -g -S \ +// RUN: -Xclang -main-file-name -Xclang test/foo.c -x c - -o - | FileCheck %s +// CHECK: ; ModuleID = 'test/foo.c' +// CHECK: source_filename = "test/foo.c" +// CHECK: !1 = !DIFile(filename: "test/foo.c" + +int main() {} -- 2.40.0