Record where the GCOV data files should be placed.

llvm-svn: 130866
This commit is contained in:
Nick Lewycky
2011-05-04 20:46:58 +00:00
parent 63cc1de58d
commit 480cb9918d
6 changed files with 43 additions and 0 deletions

View File

@@ -140,6 +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<coverage_dir>;
def relaxed_aliasing : Flag<"-relaxed-aliasing">,
HelpText<"Turn off Type Based Alias Analysis">;
def masm_verbose : Flag<"-masm-verbose">,

View File

@@ -95,6 +95,9 @@ public:
/// The code model to use (-mcmodel).
std::string CodeModel;
/// The directory in which to place coverage data files.
std::string CoverageDir;
/// Enable additional debugging information.
std::string DebugPass;

View File

@@ -132,6 +132,9 @@ void CodeGenModule::Release() {
if (getCodeGenOpts().EmitDeclMetadata)
EmitDeclMetadata();
if (getCodeGenOpts().EmitGcovArcs || getCodeGenOpts().EmitGcovNotes)
EmitCoverageDir();
}
void CodeGenModule::UpdateCompletedType(const TagDecl *TD) {
@@ -2216,6 +2219,23 @@ void CodeGenFunction::EmitDeclMetadata() {
}
}
void CodeGenModule::EmitCoverageDir() {
if (!getCodeGenOpts().CoverageDir.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);
for (int i = 0, e = CUNode->getNumOperands(); i != e; ++i) {
llvm::MDNode *CU = CUNode->getOperand(i);
llvm::Value *node[] = { CoverageDir, CU };
llvm::MDNode *N = llvm::MDNode::get(Ctx, node);
GCov->addOperand(N);
}
}
}
}
///@name Custom Runtime Function Interfaces
///@{
//

View File

@@ -735,6 +735,10 @@ private:
void EmitDeclMetadata();
/// EmitCoverageDir - 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();
/// MayDeferGeneration - Determine if the given decl can be emitted
/// lazily; this is only relevant for definitions. The given decl
/// must be either a function or var decl.

View File

@@ -1303,6 +1303,18 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA,
Args.hasArg(options::OPT_coverage))
CmdArgs.push_back("-femit-coverage-data");
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));
}
}
}
Args.AddLastArg(CmdArgs, options::OPT_nostdinc);
Args.AddLastArg(CmdArgs, options::OPT_nostdincxx);
Args.AddLastArg(CmdArgs, options::OPT_nobuiltininc);

View File

@@ -977,6 +977,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);
if (Arg *A = Args.getLastArg(OPT_fobjc_dispatch_method_EQ)) {
llvm::StringRef Name = A->getValue(Args);