diff --git a/lib/Transforms/Instrumentation/GCOVProfiling.cpp b/lib/Transforms/Instrumentation/GCOVProfiling.cpp index 03c63557bce..63227f99723 100644 --- a/lib/Transforms/Instrumentation/GCOVProfiling.cpp +++ b/lib/Transforms/Instrumentation/GCOVProfiling.cpp @@ -136,7 +136,7 @@ namespace { // Reversed, NUL-terminated copy of Options.Version. char ReversedVersion[5]; // Checksum, produced by hash of EdgeDestinations - uint32_t FileChecksum; + SmallVector FileChecksums; Module *M; LLVMContext *Ctx; @@ -498,14 +498,17 @@ void GCOVProfiler::emitProfileNotes() { EdgeDestinations += Func->getEdgeDestinations(); } - FileChecksum = hash_value(EdgeDestinations); + FileChecksums.push_back(hash_value(EdgeDestinations)); out.write("oncg", 4); out.write(ReversedVersion, 4); - out.write(reinterpret_cast(&FileChecksum), 4); + out.write(reinterpret_cast(&FileChecksums.back()), 4); for (SmallVectorImpl::iterator I = Funcs.begin(), - E = Funcs.end(); I != E; ++I) - (*I)->writeOut(); + E = Funcs.end(); I != E; ++I) { + GCOVFunction *Func = *I; + Func->setCfgChecksum(FileChecksums.back()); + Func->writeOut(); + } out.write("\0\0\0\0\0\0\0\0", 8); // EOF out.close(); @@ -803,7 +806,7 @@ Function *GCOVProfiler::insertCounterWriteout( Builder.CreateCall3(StartFile, Builder.CreateGlobalStringPtr(FilenameGcda), Builder.CreateGlobalStringPtr(ReversedVersion), - Builder.getInt32(FileChecksum)); + Builder.getInt32(FileChecksums[i])); for (unsigned j = 0, e = CountersBySP.size(); j != e; ++j) { DISubprogram SP(CountersBySP[j].second); Builder.CreateCall4( @@ -812,7 +815,7 @@ Function *GCOVProfiler::insertCounterWriteout( Builder.CreateGlobalStringPtr(getFunctionName(SP)) : Constant::getNullValue(Builder.getInt8PtrTy()), Builder.getInt8(Options.UseCfgChecksum), - Builder.getInt32(FileChecksum)); + Builder.getInt32(FileChecksums[i])); GlobalVariable *GV = CountersBySP[j].first; unsigned Arcs =