Update the gcov version used slightly, to make it stop causing modern gcov's to

crash.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@130911 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Nick Lewycky 2011-05-05 02:46:38 +00:00
parent 7a75a9ade8
commit 5409a18832
2 changed files with 35 additions and 15 deletions

View File

@ -87,7 +87,7 @@ namespace {
// list. // list.
void insertCounterWriteout(DebugInfoFinder &, void insertCounterWriteout(DebugInfoFinder &,
SmallVector<std::pair<GlobalVariable *, SmallVector<std::pair<GlobalVariable *,
uint32_t>, 8> &); MDNode *>, 8> &);
std::string mangleName(DICompileUnit CU, std::string NewStem); std::string mangleName(DICompileUnit CU, std::string NewStem);
@ -261,12 +261,13 @@ namespace {
ReturnBlock = new GCOVBlock(i++, os); ReturnBlock = new GCOVBlock(i++, os);
writeBytes(FunctionTag, 4); writeBytes(FunctionTag, 4);
uint32_t BlockLen = 1 + 1 + 1 + lengthOfGCOVString(SP.getName()) + uint32_t BlockLen = 1 + 1 + 1 + 1 + lengthOfGCOVString(SP.getName()) +
1 + lengthOfGCOVString(SP.getFilename()) + 1; 1 + lengthOfGCOVString(SP.getFilename()) + 1;
write(BlockLen); write(BlockLen);
uint32_t Ident = reinterpret_cast<intptr_t>((MDNode*)SP); uint32_t Ident = reinterpret_cast<intptr_t>((MDNode*)SP);
write(Ident); write(Ident);
write(0); // checksum write(0); // checksum #1
write(0); // checksum #2
writeGCOVString(SP.getName()); writeGCOVString(SP.getName());
writeGCOVString(SP.getFilename()); writeGCOVString(SP.getFilename());
write(SP.getLineNumber()); write(SP.getLineNumber());
@ -418,7 +419,7 @@ bool GCOVProfiler::emitProfileArcs(DebugInfoFinder &DIF) {
if (DIF.subprogram_begin() == DIF.subprogram_end()) if (DIF.subprogram_begin() == DIF.subprogram_end())
return false; return false;
SmallVector<std::pair<GlobalVariable *, uint32_t>, 8> CountersByIdent; SmallVector<std::pair<GlobalVariable *, MDNode *>, 8> CountersBySP;
for (DebugInfoFinder::iterator SPI = DIF.subprogram_begin(), for (DebugInfoFinder::iterator SPI = DIF.subprogram_begin(),
SPE = DIF.subprogram_end(); SPI != SPE; ++SPI) { SPE = DIF.subprogram_end(); SPI != SPE; ++SPI) {
DISubprogram SP(*SPI); DISubprogram SP(*SPI);
@ -441,8 +442,7 @@ bool GCOVProfiler::emitProfileArcs(DebugInfoFinder &DIF) {
GlobalValue::InternalLinkage, GlobalValue::InternalLinkage,
Constant::getNullValue(CounterTy), Constant::getNullValue(CounterTy),
"__llvm_gcov_ctr", 0, false, 0); "__llvm_gcov_ctr", 0, false, 0);
CountersByIdent.push_back( CountersBySP.push_back(std::make_pair(Counters, (MDNode*)SP));
std::make_pair(Counters, reinterpret_cast<intptr_t>((MDNode*)SP)));
UniqueVector<BasicBlock *> ComplexEdgePreds; UniqueVector<BasicBlock *> ComplexEdgePreds;
UniqueVector<BasicBlock *> ComplexEdgeSuccs; UniqueVector<BasicBlock *> ComplexEdgeSuccs;
@ -509,7 +509,7 @@ bool GCOVProfiler::emitProfileArcs(DebugInfoFinder &DIF) {
} }
} }
insertCounterWriteout(DIF, CountersByIdent); insertCounterWriteout(DIF, CountersBySP);
return true; return true;
} }
@ -580,7 +580,10 @@ Constant *GCOVProfiler::getIncrementIndirectCounterFunc() {
} }
Constant *GCOVProfiler::getEmitFunctionFunc() { Constant *GCOVProfiler::getEmitFunctionFunc() {
const Type *Args[] = { Type::getInt32Ty(*Ctx) }; const Type *Args[2] = {
Type::getInt32Ty(*Ctx), // uint32_t ident
Type::getInt8PtrTy(*Ctx), // const char *function_name
};
const FunctionType *FTy = FunctionType::get(Type::getVoidTy(*Ctx), const FunctionType *FTy = FunctionType::get(Type::getVoidTy(*Ctx),
Args, false); Args, false);
return M->getOrInsertFunction("llvm_gcda_emit_function", FTy); return M->getOrInsertFunction("llvm_gcda_emit_function", FTy);
@ -616,7 +619,7 @@ GlobalVariable *GCOVProfiler::getEdgeStateValue() {
void GCOVProfiler::insertCounterWriteout( void GCOVProfiler::insertCounterWriteout(
DebugInfoFinder &DIF, DebugInfoFinder &DIF,
SmallVector<std::pair<GlobalVariable *, uint32_t>, 8> &CountersByIdent) { SmallVector<std::pair<GlobalVariable *, MDNode *>, 8> &CountersBySP) {
const FunctionType *WriteoutFTy = const FunctionType *WriteoutFTy =
FunctionType::get(Type::getVoidTy(*Ctx), false); FunctionType::get(Type::getVoidTy(*Ctx), false);
Function *WriteoutF = Function::Create(WriteoutFTy, Function *WriteoutF = Function::Create(WriteoutFTy,
@ -637,11 +640,15 @@ void GCOVProfiler::insertCounterWriteout(
std::string FilenameGcda = mangleName(compile_unit, "gcda"); std::string FilenameGcda = mangleName(compile_unit, "gcda");
Builder.CreateCall(StartFile, Builder.CreateCall(StartFile,
Builder.CreateGlobalStringPtr(FilenameGcda)); Builder.CreateGlobalStringPtr(FilenameGcda));
for (SmallVector<std::pair<GlobalVariable *, uint32_t>, 8>::iterator for (SmallVector<std::pair<GlobalVariable *, MDNode *>, 8>::iterator
I = CountersByIdent.begin(), E = CountersByIdent.end(); I = CountersBySP.begin(), E = CountersBySP.end();
I != E; ++I) { I != E; ++I) {
Builder.CreateCall(EmitFunction, ConstantInt::get(Type::getInt32Ty(*Ctx), DISubprogram SP(I->second);
I->second)); intptr_t ident = reinterpret_cast<intptr_t>(I->second);
Builder.CreateCall2(EmitFunction,
ConstantInt::get(Type::getInt32Ty(*Ctx), ident),
Builder.CreateGlobalStringPtr(SP.getName()));
GlobalVariable *GV = I->first; GlobalVariable *GV = I->first;
unsigned Arcs = unsigned Arcs =
cast<ArrayType>(GV->getType()->getElementType())->getNumElements(); cast<ArrayType>(GV->getType()->getElementType())->getNumElements();

View File

@ -48,6 +48,17 @@ static void write_int64(uint64_t i) {
write_int32(hi); write_int32(hi);
} }
static uint32_t length_of_string(const char *s) {
return (strlen(s) + 5) / 4;
}
static void write_string(const char *s) {
uint32_t len = length_of_string(s);
write_int32(len);
fwrite(s, strlen(s), 1, output_file);
fwrite("\0\0\0\0", 4 - (strlen(s) % 4), 1, output_file);
}
static char *mangle_filename(const char *orig_filename) { static char *mangle_filename(const char *orig_filename) {
/* TODO: handle GCOV_PREFIX_STRIP */ /* TODO: handle GCOV_PREFIX_STRIP */
const char *prefix; const char *prefix;
@ -129,16 +140,18 @@ void llvm_gcda_increment_indirect_counter(uint32_t *predecessor,
#endif #endif
} }
void llvm_gcda_emit_function(uint32_t ident) { void llvm_gcda_emit_function(uint32_t ident, const char *function_name) {
#ifdef DEBUG_GCDAPROFILING #ifdef DEBUG_GCDAPROFILING
printf("llvmgcda: function id=%x\n", ident); printf("llvmgcda: function id=%x\n", ident);
#endif #endif
/* function tag */ /* function tag */
fwrite("\0\0\0\1", 4, 1, output_file); fwrite("\0\0\0\1", 4, 1, output_file);
write_int32(2); write_int32(3 + 1 + length_of_string(function_name));
write_int32(ident); write_int32(ident);
write_int32(0); write_int32(0);
write_int32(0);
write_string(function_name);
} }
void llvm_gcda_emit_arcs(uint32_t num_counters, uint64_t *counters) { void llvm_gcda_emit_arcs(uint32_t num_counters, uint64_t *counters) {