From 85c011ddc49cb2b108baaca6b36b76b9dcfd7119 Mon Sep 17 00:00:00 2001 From: Nick Lewycky Date: Thu, 5 May 2011 00:08:20 +0000 Subject: [PATCH] Preserve the full name of the file, so that '-c -o foo.pic.o' produces foo.pic.gcno instead of foo.gcno. llvm-svn: 130899 --- clang/include/clang/Driver/CC1Options.td | 6 +++--- clang/include/clang/Frontend/CodeGenOptions.h | 5 +++-- clang/lib/CodeGen/CodeGenModule.cpp | 12 ++++++------ clang/lib/CodeGen/CodeGenModule.h | 4 ++-- clang/lib/Driver/Tools.cpp | 8 ++------ clang/lib/Frontend/CompilerInvocation.cpp | 2 +- 6 files changed, 17 insertions(+), 20 deletions(-) diff --git a/clang/include/clang/Driver/CC1Options.td b/clang/include/clang/Driver/CC1Options.td index 7908b8f10601..3c0c3c5a13f7 100644 --- a/clang/include/clang/Driver/CC1Options.td +++ b/clang/include/clang/Driver/CC1Options.td @@ -140,9 +140,9 @@ def femit_coverage_notes : Flag<"-femit-coverage-notes">, HelpText<"Emit a gcov coverage notes file when compiling.">; def femit_coverage_data: Flag<"-femit-coverage-data">, HelpText<"Instrument the program to emit gcov coverage data when run.">; -def coverage_dir : Separate<"-coverage-dir">, - HelpText<"Emit coverage data to this directory.">; -def coverage_dir_EQ : Joined<"-coverage-dir=">, Alias; +def coverage_file : Separate<"-coverage-file">, + HelpText<"Emit coverage data to this filename. The extension will be replaced.">; +def coverage_file_EQ : Joined<"-coverage-file=">, Alias; def relaxed_aliasing : Flag<"-relaxed-aliasing">, HelpText<"Turn off Type Based Alias Analysis">; def masm_verbose : Flag<"-masm-verbose">, diff --git a/clang/include/clang/Frontend/CodeGenOptions.h b/clang/include/clang/Frontend/CodeGenOptions.h index 7221f0d55481..1c686c76df5f 100644 --- a/clang/include/clang/Frontend/CodeGenOptions.h +++ b/clang/include/clang/Frontend/CodeGenOptions.h @@ -95,8 +95,9 @@ public: /// The code model to use (-mcmodel). std::string CodeModel; - /// The directory in which to place coverage data files. - std::string CoverageDir; + /// The filename with path we use for coverage files. The extension will be + /// replaced. + std::string CoverageFile; /// Enable additional debugging information. std::string DebugPass; diff --git a/clang/lib/CodeGen/CodeGenModule.cpp b/clang/lib/CodeGen/CodeGenModule.cpp index 22df86aca2d7..4ce12ecd6004 100644 --- a/clang/lib/CodeGen/CodeGenModule.cpp +++ b/clang/lib/CodeGen/CodeGenModule.cpp @@ -134,7 +134,7 @@ void CodeGenModule::Release() { EmitDeclMetadata(); if (getCodeGenOpts().EmitGcovArcs || getCodeGenOpts().EmitGcovNotes) - EmitCoverageDir(); + EmitCoverageFile(); } void CodeGenModule::UpdateCompletedType(const TagDecl *TD) { @@ -2219,16 +2219,16 @@ void CodeGenFunction::EmitDeclMetadata() { } } -void CodeGenModule::EmitCoverageDir() { - if (!getCodeGenOpts().CoverageDir.empty()) { +void CodeGenModule::EmitCoverageFile() { + if (!getCodeGenOpts().CoverageFile.empty()) { if (llvm::NamedMDNode *CUNode = TheModule.getNamedMetadata("llvm.dbg.cu")) { llvm::NamedMDNode *GCov = TheModule.getOrInsertNamedMetadata("llvm.gcov"); llvm::LLVMContext &Ctx = TheModule.getContext(); - llvm::MDString *CoverageDir = - llvm::MDString::get(Ctx, getCodeGenOpts().CoverageDir); + llvm::MDString *CoverageFile = + llvm::MDString::get(Ctx, getCodeGenOpts().CoverageFile); for (int i = 0, e = CUNode->getNumOperands(); i != e; ++i) { llvm::MDNode *CU = CUNode->getOperand(i); - llvm::Value *node[] = { CoverageDir, CU }; + llvm::Value *node[] = { CoverageFile, CU }; llvm::MDNode *N = llvm::MDNode::get(Ctx, node); GCov->addOperand(N); } diff --git a/clang/lib/CodeGen/CodeGenModule.h b/clang/lib/CodeGen/CodeGenModule.h index 65ee922279da..ce708c88d070 100644 --- a/clang/lib/CodeGen/CodeGenModule.h +++ b/clang/lib/CodeGen/CodeGenModule.h @@ -735,9 +735,9 @@ private: void EmitDeclMetadata(); - /// EmitCoverageDir - Emit the llvm.gcov metadata used to tell LLVM where + /// EmitCoverageFile - Emit the llvm.gcov metadata used to tell LLVM where /// to emit the .gcno and .gcda files in a way that persists in .bc files. - void EmitCoverageDir(); + void EmitCoverageFile(); /// MayDeferGeneration - Determine if the given decl can be emitted /// lazily; this is only relevant for definitions. The given decl diff --git a/clang/lib/Driver/Tools.cpp b/clang/lib/Driver/Tools.cpp index f4e0f2e35903..239edb5db4f9 100644 --- a/clang/lib/Driver/Tools.cpp +++ b/clang/lib/Driver/Tools.cpp @@ -1306,12 +1306,8 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA, if (C.getArgs().hasArg(options::OPT_c) || C.getArgs().hasArg(options::OPT_S)) { if (Output.isFilename()) { - llvm::StringRef CoverageDir = - llvm::sys::path::parent_path(Output.getFilename()); - if (!CoverageDir.empty()) { - CmdArgs.push_back("-coverage-dir"); - CmdArgs.push_back(Args.MakeArgString(CoverageDir)); - } + CmdArgs.push_back("-coverage-file"); + CmdArgs.push_back(Args.MakeArgString(Output.getFilename())); } } diff --git a/clang/lib/Frontend/CompilerInvocation.cpp b/clang/lib/Frontend/CompilerInvocation.cpp index 180ce3efcbe2..924e5ed4cbe2 100644 --- a/clang/lib/Frontend/CompilerInvocation.cpp +++ b/clang/lib/Frontend/CompilerInvocation.cpp @@ -974,7 +974,7 @@ static void ParseCodeGenArgs(CodeGenOptions &Opts, ArgList &Args, InputKind IK, Opts.InstrumentForProfiling = Args.hasArg(OPT_pg); Opts.EmitGcovArcs = Args.hasArg(OPT_femit_coverage_data); Opts.EmitGcovNotes = Args.hasArg(OPT_femit_coverage_notes); - Opts.CoverageDir = Args.getLastArgValue(OPT_coverage_dir); + Opts.CoverageFile = Args.getLastArgValue(OPT_coverage_file); if (Arg *A = Args.getLastArg(OPT_fobjc_dispatch_method_EQ)) { llvm::StringRef Name = A->getValue(Args);