]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/llvm-project/llvm/lib/Transforms/Instrumentation/GCOVProfiling.cpp
Fix completion descriptors alignment for the ENA
[FreeBSD/FreeBSD.git] / contrib / llvm-project / llvm / lib / Transforms / Instrumentation / GCOVProfiling.cpp
1 //===- GCOVProfiling.cpp - Insert edge counters for gcov profiling --------===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 //
9 // This pass implements GCOV-style profiling. When this pass is run it emits
10 // "gcno" files next to the existing source, and instruments the code that runs
11 // to records the edges between blocks that run and emit a complementary "gcda"
12 // file on exit.
13 //
14 //===----------------------------------------------------------------------===//
15
16 #include "llvm/ADT/DenseMap.h"
17 #include "llvm/ADT/Hashing.h"
18 #include "llvm/ADT/STLExtras.h"
19 #include "llvm/ADT/Sequence.h"
20 #include "llvm/ADT/Statistic.h"
21 #include "llvm/ADT/StringExtras.h"
22 #include "llvm/ADT/StringMap.h"
23 #include "llvm/Analysis/EHPersonalities.h"
24 #include "llvm/Analysis/TargetLibraryInfo.h"
25 #include "llvm/IR/CFG.h"
26 #include "llvm/IR/DebugInfo.h"
27 #include "llvm/IR/DebugLoc.h"
28 #include "llvm/IR/IRBuilder.h"
29 #include "llvm/IR/InstIterator.h"
30 #include "llvm/IR/Instructions.h"
31 #include "llvm/IR/IntrinsicInst.h"
32 #include "llvm/IR/Module.h"
33 #include "llvm/InitializePasses.h"
34 #include "llvm/Pass.h"
35 #include "llvm/Support/CommandLine.h"
36 #include "llvm/Support/Debug.h"
37 #include "llvm/Support/FileSystem.h"
38 #include "llvm/Support/Path.h"
39 #include "llvm/Support/Regex.h"
40 #include "llvm/Support/raw_ostream.h"
41 #include "llvm/Transforms/Instrumentation.h"
42 #include "llvm/Transforms/Instrumentation/GCOVProfiler.h"
43 #include "llvm/Transforms/Utils/ModuleUtils.h"
44 #include <algorithm>
45 #include <memory>
46 #include <string>
47 #include <utility>
48
49 using namespace llvm;
50 namespace endian = llvm::support::endian;
51
52 #define DEBUG_TYPE "insert-gcov-profiling"
53
54 enum : uint32_t {
55   GCOV_TAG_FUNCTION = 0x01000000,
56   GCOV_TAG_BLOCKS = 0x01410000,
57   GCOV_TAG_ARCS = 0x01430000,
58   GCOV_TAG_LINES = 0x01450000,
59 };
60
61 static cl::opt<std::string> DefaultGCOVVersion("default-gcov-version",
62                                                cl::init("408*"), cl::Hidden,
63                                                cl::ValueRequired);
64
65 // Returns the number of words which will be used to represent this string.
66 static unsigned wordsOfString(StringRef s) {
67   // Length + NUL-terminated string + 0~3 padding NULs.
68   return (s.size() / 4) + 2;
69 }
70
71 GCOVOptions GCOVOptions::getDefault() {
72   GCOVOptions Options;
73   Options.EmitNotes = true;
74   Options.EmitData = true;
75   Options.NoRedZone = false;
76
77   if (DefaultGCOVVersion.size() != 4) {
78     llvm::report_fatal_error(std::string("Invalid -default-gcov-version: ") +
79                              DefaultGCOVVersion);
80   }
81   memcpy(Options.Version, DefaultGCOVVersion.c_str(), 4);
82   return Options;
83 }
84
85 namespace {
86 class GCOVFunction;
87
88 class GCOVProfiler {
89 public:
90   GCOVProfiler() : GCOVProfiler(GCOVOptions::getDefault()) {}
91   GCOVProfiler(const GCOVOptions &Opts) : Options(Opts) {}
92   bool
93   runOnModule(Module &M,
94               std::function<const TargetLibraryInfo &(Function &F)> GetTLI);
95
96   void write(uint32_t i) {
97     char Bytes[4];
98     endian::write32(Bytes, i, Endian);
99     os->write(Bytes, 4);
100   }
101   void writeString(StringRef s) {
102     write(wordsOfString(s) - 1);
103     os->write(s.data(), s.size());
104     os->write_zeros(4 - s.size() % 4);
105   }
106   void writeBytes(const char *Bytes, int Size) { os->write(Bytes, Size); }
107
108 private:
109   // Create the .gcno files for the Module based on DebugInfo.
110   void emitProfileNotes();
111
112   // Modify the program to track transitions along edges and call into the
113   // profiling runtime to emit .gcda files when run.
114   bool emitProfileArcs();
115
116   bool isFunctionInstrumented(const Function &F);
117   std::vector<Regex> createRegexesFromString(StringRef RegexesStr);
118   static bool doesFilenameMatchARegex(StringRef Filename,
119                                       std::vector<Regex> &Regexes);
120
121   // Get pointers to the functions in the runtime library.
122   FunctionCallee getStartFileFunc(const TargetLibraryInfo *TLI);
123   FunctionCallee getEmitFunctionFunc(const TargetLibraryInfo *TLI);
124   FunctionCallee getEmitArcsFunc(const TargetLibraryInfo *TLI);
125   FunctionCallee getSummaryInfoFunc();
126   FunctionCallee getEndFileFunc();
127
128   // Add the function to write out all our counters to the global destructor
129   // list.
130   Function *
131   insertCounterWriteout(ArrayRef<std::pair<GlobalVariable *, MDNode *>>);
132   Function *insertReset(ArrayRef<std::pair<GlobalVariable *, MDNode *>>);
133   Function *insertFlush(Function *ResetF);
134
135   bool AddFlushBeforeForkAndExec();
136
137   enum class GCovFileType { GCNO, GCDA };
138   std::string mangleName(const DICompileUnit *CU, GCovFileType FileType);
139
140   GCOVOptions Options;
141   support::endianness Endian;
142   raw_ostream *os;
143
144   // Checksum, produced by hash of EdgeDestinations
145   SmallVector<uint32_t, 4> FileChecksums;
146
147   Module *M = nullptr;
148   std::function<const TargetLibraryInfo &(Function &F)> GetTLI;
149   LLVMContext *Ctx = nullptr;
150   SmallVector<std::unique_ptr<GCOVFunction>, 16> Funcs;
151   std::vector<Regex> FilterRe;
152   std::vector<Regex> ExcludeRe;
153   StringMap<bool> InstrumentedFiles;
154 };
155
156 class GCOVProfilerLegacyPass : public ModulePass {
157 public:
158   static char ID;
159   GCOVProfilerLegacyPass()
160       : GCOVProfilerLegacyPass(GCOVOptions::getDefault()) {}
161   GCOVProfilerLegacyPass(const GCOVOptions &Opts)
162       : ModulePass(ID), Profiler(Opts) {
163     initializeGCOVProfilerLegacyPassPass(*PassRegistry::getPassRegistry());
164   }
165   StringRef getPassName() const override { return "GCOV Profiler"; }
166
167   bool runOnModule(Module &M) override {
168     return Profiler.runOnModule(M, [this](Function &F) -> TargetLibraryInfo & {
169       return getAnalysis<TargetLibraryInfoWrapperPass>().getTLI(F);
170     });
171   }
172
173   void getAnalysisUsage(AnalysisUsage &AU) const override {
174     AU.addRequired<TargetLibraryInfoWrapperPass>();
175   }
176
177 private:
178   GCOVProfiler Profiler;
179 };
180 }
181
182 char GCOVProfilerLegacyPass::ID = 0;
183 INITIALIZE_PASS_BEGIN(
184     GCOVProfilerLegacyPass, "insert-gcov-profiling",
185     "Insert instrumentation for GCOV profiling", false, false)
186 INITIALIZE_PASS_DEPENDENCY(TargetLibraryInfoWrapperPass)
187 INITIALIZE_PASS_END(
188     GCOVProfilerLegacyPass, "insert-gcov-profiling",
189     "Insert instrumentation for GCOV profiling", false, false)
190
191 ModulePass *llvm::createGCOVProfilerPass(const GCOVOptions &Options) {
192   return new GCOVProfilerLegacyPass(Options);
193 }
194
195 static StringRef getFunctionName(const DISubprogram *SP) {
196   if (!SP->getLinkageName().empty())
197     return SP->getLinkageName();
198   return SP->getName();
199 }
200
201 /// Extract a filename for a DISubprogram.
202 ///
203 /// Prefer relative paths in the coverage notes. Clang also may split
204 /// up absolute paths into a directory and filename component. When
205 /// the relative path doesn't exist, reconstruct the absolute path.
206 static SmallString<128> getFilename(const DISubprogram *SP) {
207   SmallString<128> Path;
208   StringRef RelPath = SP->getFilename();
209   if (sys::fs::exists(RelPath))
210     Path = RelPath;
211   else
212     sys::path::append(Path, SP->getDirectory(), SP->getFilename());
213   return Path;
214 }
215
216 namespace {
217   class GCOVRecord {
218   protected:
219     GCOVProfiler *P;
220
221     GCOVRecord(GCOVProfiler *P) : P(P) {}
222
223     void write(uint32_t i) { P->write(i); }
224     void writeString(StringRef s) { P->writeString(s); }
225     void writeBytes(const char *Bytes, int Size) { P->writeBytes(Bytes, Size); }
226   };
227
228   class GCOVFunction;
229   class GCOVBlock;
230
231   // Constructed only by requesting it from a GCOVBlock, this object stores a
232   // list of line numbers and a single filename, representing lines that belong
233   // to the block.
234   class GCOVLines : public GCOVRecord {
235    public:
236     void addLine(uint32_t Line) {
237       assert(Line != 0 && "Line zero is not a valid real line number.");
238       Lines.push_back(Line);
239     }
240
241     uint32_t length() const {
242       return 1 + wordsOfString(Filename) + Lines.size();
243     }
244
245     void writeOut() {
246       write(0);
247       writeString(Filename);
248       for (int i = 0, e = Lines.size(); i != e; ++i)
249         write(Lines[i]);
250     }
251
252     GCOVLines(GCOVProfiler *P, StringRef F)
253         : GCOVRecord(P), Filename(std::string(F)) {}
254
255   private:
256     std::string Filename;
257     SmallVector<uint32_t, 32> Lines;
258   };
259
260
261   // Represent a basic block in GCOV. Each block has a unique number in the
262   // function, number of lines belonging to each block, and a set of edges to
263   // other blocks.
264   class GCOVBlock : public GCOVRecord {
265    public:
266     GCOVLines &getFile(StringRef Filename) {
267       return LinesByFile.try_emplace(Filename, P, Filename).first->second;
268     }
269
270     void addEdge(GCOVBlock &Successor) {
271       OutEdges.push_back(&Successor);
272     }
273
274     void writeOut() {
275       uint32_t Len = 3;
276       SmallVector<StringMapEntry<GCOVLines> *, 32> SortedLinesByFile;
277       for (auto &I : LinesByFile) {
278         Len += I.second.length();
279         SortedLinesByFile.push_back(&I);
280       }
281
282       write(GCOV_TAG_LINES);
283       write(Len);
284       write(Number);
285
286       llvm::sort(SortedLinesByFile, [](StringMapEntry<GCOVLines> *LHS,
287                                        StringMapEntry<GCOVLines> *RHS) {
288         return LHS->getKey() < RHS->getKey();
289       });
290       for (auto &I : SortedLinesByFile)
291         I->getValue().writeOut();
292       write(0);
293       write(0);
294     }
295
296     GCOVBlock(const GCOVBlock &RHS) : GCOVRecord(RHS), Number(RHS.Number) {
297       // Only allow copy before edges and lines have been added. After that,
298       // there are inter-block pointers (eg: edges) that won't take kindly to
299       // blocks being copied or moved around.
300       assert(LinesByFile.empty());
301       assert(OutEdges.empty());
302     }
303
304    private:
305     friend class GCOVFunction;
306
307     GCOVBlock(GCOVProfiler *P, uint32_t Number)
308         : GCOVRecord(P), Number(Number) {}
309
310     uint32_t Number;
311     StringMap<GCOVLines> LinesByFile;
312     SmallVector<GCOVBlock *, 4> OutEdges;
313   };
314
315   // A function has a unique identifier, a checksum (we leave as zero) and a
316   // set of blocks and a map of edges between blocks. This is the only GCOV
317   // object users can construct, the blocks and lines will be rooted here.
318   class GCOVFunction : public GCOVRecord {
319   public:
320     GCOVFunction(GCOVProfiler *P, Function *F, const DISubprogram *SP,
321                  unsigned EndLine, uint32_t Ident, int Version)
322         : GCOVRecord(P), SP(SP), EndLine(EndLine), Ident(Ident),
323           Version(Version), ReturnBlock(P, 1) {
324       LLVM_DEBUG(dbgs() << "Function: " << getFunctionName(SP) << "\n");
325       bool ExitBlockBeforeBody = Version >= 48;
326       uint32_t i = 0;
327       for (auto &BB : *F) {
328         // Skip index 1 if it's assigned to the ReturnBlock.
329         if (i == 1 && ExitBlockBeforeBody)
330           ++i;
331         Blocks.insert(std::make_pair(&BB, GCOVBlock(P, i++)));
332       }
333       if (!ExitBlockBeforeBody)
334         ReturnBlock.Number = i;
335
336       std::string FunctionNameAndLine;
337       raw_string_ostream FNLOS(FunctionNameAndLine);
338       FNLOS << getFunctionName(SP) << SP->getLine();
339       FNLOS.flush();
340       FuncChecksum = hash_value(FunctionNameAndLine);
341     }
342
343     GCOVBlock &getBlock(BasicBlock *BB) {
344       return Blocks.find(BB)->second;
345     }
346
347     GCOVBlock &getReturnBlock() {
348       return ReturnBlock;
349     }
350
351     std::string getEdgeDestinations() {
352       std::string EdgeDestinations;
353       raw_string_ostream EDOS(EdgeDestinations);
354       Function *F = Blocks.begin()->first->getParent();
355       for (BasicBlock &I : *F) {
356         GCOVBlock &Block = getBlock(&I);
357         for (int i = 0, e = Block.OutEdges.size(); i != e; ++i)
358           EDOS << Block.OutEdges[i]->Number;
359       }
360       return EdgeDestinations;
361     }
362
363     uint32_t getFuncChecksum() const {
364       return FuncChecksum;
365     }
366
367     void writeOut(uint32_t CfgChecksum) {
368       write(GCOV_TAG_FUNCTION);
369       SmallString<128> Filename = getFilename(SP);
370       uint32_t BlockLen =
371           2 + (Version >= 47) + wordsOfString(getFunctionName(SP));
372       if (Version < 80)
373         BlockLen += wordsOfString(Filename) + 1;
374       else
375         BlockLen += 1 + wordsOfString(Filename) + 3 + (Version >= 90);
376
377       write(BlockLen);
378       write(Ident);
379       write(FuncChecksum);
380       if (Version >= 47)
381         write(CfgChecksum);
382       writeString(getFunctionName(SP));
383       if (Version < 80) {
384         writeString(Filename);
385         write(SP->getLine());
386       } else {
387         write(SP->isArtificial()); // artificial
388         writeString(Filename);
389         write(SP->getLine()); // start_line
390         write(0);             // start_column
391         // EndLine is the last line with !dbg. It is not the } line as in GCC,
392         // but good enough.
393         write(EndLine);
394         if (Version >= 90)
395           write(0); // end_column
396       }
397
398       // Emit count of blocks.
399       write(GCOV_TAG_BLOCKS);
400       if (Version < 80) {
401         write(Blocks.size() + 1);
402         for (int i = Blocks.size() + 1; i; --i)
403           write(0);
404       } else {
405         write(1);
406         write(Blocks.size() + 1);
407       }
408       LLVM_DEBUG(dbgs() << (Blocks.size() + 1) << " blocks\n");
409
410       // Emit edges between blocks.
411       Function *F = Blocks.begin()->first->getParent();
412       for (BasicBlock &I : *F) {
413         GCOVBlock &Block = getBlock(&I);
414         if (Block.OutEdges.empty()) continue;
415
416         write(GCOV_TAG_ARCS);
417         write(Block.OutEdges.size() * 2 + 1);
418         write(Block.Number);
419         for (int i = 0, e = Block.OutEdges.size(); i != e; ++i) {
420           LLVM_DEBUG(dbgs() << Block.Number << " -> "
421                             << Block.OutEdges[i]->Number << "\n");
422           write(Block.OutEdges[i]->Number);
423           write(0);  // no flags
424         }
425       }
426
427       // Emit lines for each block.
428       for (BasicBlock &I : *F)
429         getBlock(&I).writeOut();
430     }
431
432   private:
433     const DISubprogram *SP;
434     unsigned EndLine;
435     uint32_t Ident;
436     uint32_t FuncChecksum;
437     int Version;
438     DenseMap<BasicBlock *, GCOVBlock> Blocks;
439     GCOVBlock ReturnBlock;
440   };
441 }
442
443 // RegexesStr is a string containing differents regex separated by a semi-colon.
444 // For example "foo\..*$;bar\..*$".
445 std::vector<Regex> GCOVProfiler::createRegexesFromString(StringRef RegexesStr) {
446   std::vector<Regex> Regexes;
447   while (!RegexesStr.empty()) {
448     std::pair<StringRef, StringRef> HeadTail = RegexesStr.split(';');
449     if (!HeadTail.first.empty()) {
450       Regex Re(HeadTail.first);
451       std::string Err;
452       if (!Re.isValid(Err)) {
453         Ctx->emitError(Twine("Regex ") + HeadTail.first +
454                        " is not valid: " + Err);
455       }
456       Regexes.emplace_back(std::move(Re));
457     }
458     RegexesStr = HeadTail.second;
459   }
460   return Regexes;
461 }
462
463 bool GCOVProfiler::doesFilenameMatchARegex(StringRef Filename,
464                                            std::vector<Regex> &Regexes) {
465   for (Regex &Re : Regexes)
466     if (Re.match(Filename))
467       return true;
468   return false;
469 }
470
471 bool GCOVProfiler::isFunctionInstrumented(const Function &F) {
472   if (FilterRe.empty() && ExcludeRe.empty()) {
473     return true;
474   }
475   SmallString<128> Filename = getFilename(F.getSubprogram());
476   auto It = InstrumentedFiles.find(Filename);
477   if (It != InstrumentedFiles.end()) {
478     return It->second;
479   }
480
481   SmallString<256> RealPath;
482   StringRef RealFilename;
483
484   // Path can be
485   // /usr/lib/gcc/x86_64-linux-gnu/8/../../../../include/c++/8/bits/*.h so for
486   // such a case we must get the real_path.
487   if (sys::fs::real_path(Filename, RealPath)) {
488     // real_path can fail with path like "foo.c".
489     RealFilename = Filename;
490   } else {
491     RealFilename = RealPath;
492   }
493
494   bool ShouldInstrument;
495   if (FilterRe.empty()) {
496     ShouldInstrument = !doesFilenameMatchARegex(RealFilename, ExcludeRe);
497   } else if (ExcludeRe.empty()) {
498     ShouldInstrument = doesFilenameMatchARegex(RealFilename, FilterRe);
499   } else {
500     ShouldInstrument = doesFilenameMatchARegex(RealFilename, FilterRe) &&
501                        !doesFilenameMatchARegex(RealFilename, ExcludeRe);
502   }
503   InstrumentedFiles[Filename] = ShouldInstrument;
504   return ShouldInstrument;
505 }
506
507 std::string GCOVProfiler::mangleName(const DICompileUnit *CU,
508                                      GCovFileType OutputType) {
509   bool Notes = OutputType == GCovFileType::GCNO;
510
511   if (NamedMDNode *GCov = M->getNamedMetadata("llvm.gcov")) {
512     for (int i = 0, e = GCov->getNumOperands(); i != e; ++i) {
513       MDNode *N = GCov->getOperand(i);
514       bool ThreeElement = N->getNumOperands() == 3;
515       if (!ThreeElement && N->getNumOperands() != 2)
516         continue;
517       if (dyn_cast<MDNode>(N->getOperand(ThreeElement ? 2 : 1)) != CU)
518         continue;
519
520       if (ThreeElement) {
521         // These nodes have no mangling to apply, it's stored mangled in the
522         // bitcode.
523         MDString *NotesFile = dyn_cast<MDString>(N->getOperand(0));
524         MDString *DataFile = dyn_cast<MDString>(N->getOperand(1));
525         if (!NotesFile || !DataFile)
526           continue;
527         return std::string(Notes ? NotesFile->getString()
528                                  : DataFile->getString());
529       }
530
531       MDString *GCovFile = dyn_cast<MDString>(N->getOperand(0));
532       if (!GCovFile)
533         continue;
534
535       SmallString<128> Filename = GCovFile->getString();
536       sys::path::replace_extension(Filename, Notes ? "gcno" : "gcda");
537       return std::string(Filename.str());
538     }
539   }
540
541   SmallString<128> Filename = CU->getFilename();
542   sys::path::replace_extension(Filename, Notes ? "gcno" : "gcda");
543   StringRef FName = sys::path::filename(Filename);
544   SmallString<128> CurPath;
545   if (sys::fs::current_path(CurPath))
546     return std::string(FName);
547   sys::path::append(CurPath, FName);
548   return std::string(CurPath.str());
549 }
550
551 bool GCOVProfiler::runOnModule(
552     Module &M, std::function<const TargetLibraryInfo &(Function &F)> GetTLI) {
553   this->M = &M;
554   this->GetTLI = std::move(GetTLI);
555   Ctx = &M.getContext();
556
557   bool Modified = AddFlushBeforeForkAndExec();
558
559   FilterRe = createRegexesFromString(Options.Filter);
560   ExcludeRe = createRegexesFromString(Options.Exclude);
561
562   if (Options.EmitNotes) emitProfileNotes();
563   if (Options.EmitData)
564     Modified |= emitProfileArcs();
565   return Modified;
566 }
567
568 PreservedAnalyses GCOVProfilerPass::run(Module &M,
569                                         ModuleAnalysisManager &AM) {
570
571   GCOVProfiler Profiler(GCOVOpts);
572   FunctionAnalysisManager &FAM =
573       AM.getResult<FunctionAnalysisManagerModuleProxy>(M).getManager();
574
575   if (!Profiler.runOnModule(M, [&](Function &F) -> TargetLibraryInfo & {
576         return FAM.getResult<TargetLibraryAnalysis>(F);
577       }))
578     return PreservedAnalyses::all();
579
580   return PreservedAnalyses::none();
581 }
582
583 static bool functionHasLines(const Function &F, unsigned &EndLine) {
584   // Check whether this function actually has any source lines. Not only
585   // do these waste space, they also can crash gcov.
586   EndLine = 0;
587   for (auto &BB : F) {
588     for (auto &I : BB) {
589       // Debug intrinsic locations correspond to the location of the
590       // declaration, not necessarily any statements or expressions.
591       if (isa<DbgInfoIntrinsic>(&I)) continue;
592
593       const DebugLoc &Loc = I.getDebugLoc();
594       if (!Loc)
595         continue;
596
597       // Artificial lines such as calls to the global constructors.
598       if (Loc.getLine() == 0) continue;
599       EndLine = std::max(EndLine, Loc.getLine());
600
601       return true;
602     }
603   }
604   return false;
605 }
606
607 static bool isUsingScopeBasedEH(Function &F) {
608   if (!F.hasPersonalityFn()) return false;
609
610   EHPersonality Personality = classifyEHPersonality(F.getPersonalityFn());
611   return isScopedEHPersonality(Personality);
612 }
613
614 static bool shouldKeepInEntry(BasicBlock::iterator It) {
615         if (isa<AllocaInst>(*It)) return true;
616         if (isa<DbgInfoIntrinsic>(*It)) return true;
617         if (auto *II = dyn_cast<IntrinsicInst>(It)) {
618                 if (II->getIntrinsicID() == llvm::Intrinsic::localescape) return true;
619         }
620
621         return false;
622 }
623
624 bool GCOVProfiler::AddFlushBeforeForkAndExec() {
625   SmallVector<CallInst *, 2> Forks;
626   SmallVector<CallInst *, 2> Execs;
627   for (auto &F : M->functions()) {
628     auto *TLI = &GetTLI(F);
629     for (auto &I : instructions(F)) {
630       if (CallInst *CI = dyn_cast<CallInst>(&I)) {
631         if (Function *Callee = CI->getCalledFunction()) {
632           LibFunc LF;
633           if (TLI->getLibFunc(*Callee, LF)) {
634             if (LF == LibFunc_fork) {
635 #if !defined(_WIN32)
636               Forks.push_back(CI);
637 #endif
638             } else if (LF == LibFunc_execl || LF == LibFunc_execle ||
639                        LF == LibFunc_execlp || LF == LibFunc_execv ||
640                        LF == LibFunc_execvp || LF == LibFunc_execve ||
641                        LF == LibFunc_execvpe || LF == LibFunc_execvP) {
642               Execs.push_back(CI);
643             }
644           }
645         }
646       }
647     }
648   }
649
650   for (auto F : Forks) {
651     IRBuilder<> Builder(F);
652     BasicBlock *Parent = F->getParent();
653     auto NextInst = ++F->getIterator();
654
655     // We've a fork so just reset the counters in the child process
656     FunctionType *FTy = FunctionType::get(Builder.getInt32Ty(), {}, false);
657     FunctionCallee GCOVFork = M->getOrInsertFunction("__gcov_fork", FTy);
658     F->setCalledFunction(GCOVFork);
659
660     // We split just after the fork to have a counter for the lines after
661     // Anyway there's a bug:
662     // void foo() { fork(); }
663     // void bar() { foo(); blah(); }
664     // then "blah();" will be called 2 times but showed as 1
665     // because "blah()" belongs to the same block as "foo();"
666     Parent->splitBasicBlock(NextInst);
667
668     // back() is a br instruction with a debug location
669     // equals to the one from NextAfterFork
670     // So to avoid to have two debug locs on two blocks just change it
671     DebugLoc Loc = F->getDebugLoc();
672     Parent->back().setDebugLoc(Loc);
673   }
674
675   for (auto E : Execs) {
676     IRBuilder<> Builder(E);
677     BasicBlock *Parent = E->getParent();
678     auto NextInst = ++E->getIterator();
679
680     // Since the process is replaced by a new one we need to write out gcdas
681     // No need to reset the counters since they'll be lost after the exec**
682     FunctionType *FTy = FunctionType::get(Builder.getVoidTy(), {}, false);
683     FunctionCallee WriteoutF =
684         M->getOrInsertFunction("llvm_writeout_files", FTy);
685     Builder.CreateCall(WriteoutF);
686
687     DebugLoc Loc = E->getDebugLoc();
688     Builder.SetInsertPoint(&*NextInst);
689     // If the exec** fails we must reset the counters since they've been
690     // dumped
691     FunctionCallee ResetF = M->getOrInsertFunction("llvm_reset_counters", FTy);
692     Builder.CreateCall(ResetF)->setDebugLoc(Loc);
693     Parent->splitBasicBlock(NextInst);
694     Parent->back().setDebugLoc(Loc);
695   }
696
697   return !Forks.empty() || !Execs.empty();
698 }
699
700 void GCOVProfiler::emitProfileNotes() {
701   NamedMDNode *CU_Nodes = M->getNamedMetadata("llvm.dbg.cu");
702   if (!CU_Nodes) return;
703
704   int Version;
705   {
706     uint8_t c3 = Options.Version[0];
707     uint8_t c2 = Options.Version[1];
708     uint8_t c1 = Options.Version[2];
709     Version = c3 >= 'A' ? (c3 - 'A') * 100 + (c2 - '0') * 10 + c1 - '0'
710                         : (c3 - '0') * 10 + c1 - '0';
711   }
712
713   for (unsigned i = 0, e = CU_Nodes->getNumOperands(); i != e; ++i) {
714     // Each compile unit gets its own .gcno file. This means that whether we run
715     // this pass over the original .o's as they're produced, or run it after
716     // LTO, we'll generate the same .gcno files.
717
718     auto *CU = cast<DICompileUnit>(CU_Nodes->getOperand(i));
719
720     // Skip module skeleton (and module) CUs.
721     if (CU->getDWOId())
722       continue;
723
724     std::error_code EC;
725     raw_fd_ostream out(mangleName(CU, GCovFileType::GCNO), EC,
726                        sys::fs::OF_None);
727     if (EC) {
728       Ctx->emitError(Twine("failed to open coverage notes file for writing: ") +
729                      EC.message());
730       continue;
731     }
732
733     std::string EdgeDestinations;
734
735     Endian = M->getDataLayout().isLittleEndian() ? support::endianness::little
736                                                  : support::endianness::big;
737     unsigned FunctionIdent = 0;
738     for (auto &F : M->functions()) {
739       DISubprogram *SP = F.getSubprogram();
740       unsigned EndLine;
741       if (!SP) continue;
742       if (!functionHasLines(F, EndLine) || !isFunctionInstrumented(F))
743         continue;
744       // TODO: Functions using scope-based EH are currently not supported.
745       if (isUsingScopeBasedEH(F)) continue;
746
747       // gcov expects every function to start with an entry block that has a
748       // single successor, so split the entry block to make sure of that.
749       BasicBlock &EntryBlock = F.getEntryBlock();
750       BasicBlock::iterator It = EntryBlock.begin();
751       while (shouldKeepInEntry(It))
752         ++It;
753       EntryBlock.splitBasicBlock(It);
754
755       Funcs.push_back(std::make_unique<GCOVFunction>(this, &F, SP, EndLine,
756                                                      FunctionIdent++, Version));
757       GCOVFunction &Func = *Funcs.back();
758
759       // Add the function line number to the lines of the entry block
760       // to have a counter for the function definition.
761       uint32_t Line = SP->getLine();
762       auto Filename = getFilename(SP);
763
764       // Artificial functions such as global initializers
765       if (!SP->isArtificial())
766         Func.getBlock(&EntryBlock).getFile(Filename).addLine(Line);
767
768       for (auto &BB : F) {
769         GCOVBlock &Block = Func.getBlock(&BB);
770         Instruction *TI = BB.getTerminator();
771         if (int successors = TI->getNumSuccessors()) {
772           for (int i = 0; i != successors; ++i) {
773             Block.addEdge(Func.getBlock(TI->getSuccessor(i)));
774           }
775         } else if (isa<ReturnInst>(TI)) {
776           Block.addEdge(Func.getReturnBlock());
777         }
778
779         for (auto &I : BB) {
780           // Debug intrinsic locations correspond to the location of the
781           // declaration, not necessarily any statements or expressions.
782           if (isa<DbgInfoIntrinsic>(&I)) continue;
783
784           const DebugLoc &Loc = I.getDebugLoc();
785           if (!Loc)
786             continue;
787
788           // Artificial lines such as calls to the global constructors.
789           if (Loc.getLine() == 0 || Loc.isImplicitCode())
790             continue;
791
792           if (Line == Loc.getLine()) continue;
793           Line = Loc.getLine();
794           if (SP != getDISubprogram(Loc.getScope()))
795             continue;
796
797           GCOVLines &Lines = Block.getFile(Filename);
798           Lines.addLine(Loc.getLine());
799         }
800         Line = 0;
801       }
802       EdgeDestinations += Func.getEdgeDestinations();
803     }
804
805     char Tmp[4];
806     os = &out;
807     auto Stamp = static_cast<uint32_t>(hash_value(EdgeDestinations));
808     FileChecksums.push_back(Stamp);
809     if (Endian == support::endianness::big) {
810       out.write("gcno", 4);
811       out.write(Options.Version, 4);
812     } else {
813       out.write("oncg", 4);
814       std::reverse_copy(Options.Version, Options.Version + 4, Tmp);
815       out.write(Tmp, 4);
816     }
817     write(Stamp);
818     if (Version >= 90)
819       writeString(""); // unuseful current_working_directory
820     if (Version >= 80)
821       write(0); // unuseful has_unexecuted_blocks
822
823     for (auto &Func : Funcs)
824       Func->writeOut(Stamp);
825
826     write(0);
827     write(0);
828     out.close();
829   }
830 }
831
832 bool GCOVProfiler::emitProfileArcs() {
833   NamedMDNode *CU_Nodes = M->getNamedMetadata("llvm.dbg.cu");
834   if (!CU_Nodes) return false;
835
836   bool Result = false;
837   for (unsigned i = 0, e = CU_Nodes->getNumOperands(); i != e; ++i) {
838     SmallVector<std::pair<GlobalVariable *, MDNode *>, 8> CountersBySP;
839     for (auto &F : M->functions()) {
840       DISubprogram *SP = F.getSubprogram();
841       unsigned EndLine;
842       if (!SP) continue;
843       if (!functionHasLines(F, EndLine) || !isFunctionInstrumented(F))
844         continue;
845       // TODO: Functions using scope-based EH are currently not supported.
846       if (isUsingScopeBasedEH(F)) continue;
847
848       DenseMap<std::pair<BasicBlock *, BasicBlock *>, unsigned> EdgeToCounter;
849       unsigned Edges = 0;
850       for (auto &BB : F) {
851         Instruction *TI = BB.getTerminator();
852         if (isa<ReturnInst>(TI)) {
853           EdgeToCounter[{&BB, nullptr}] = Edges++;
854         } else {
855           for (BasicBlock *Succ : successors(TI)) {
856             EdgeToCounter[{&BB, Succ}] = Edges++;
857           }
858         }
859       }
860
861       ArrayType *CounterTy =
862         ArrayType::get(Type::getInt64Ty(*Ctx), Edges);
863       GlobalVariable *Counters =
864         new GlobalVariable(*M, CounterTy, false,
865                            GlobalValue::InternalLinkage,
866                            Constant::getNullValue(CounterTy),
867                            "__llvm_gcov_ctr");
868       CountersBySP.push_back(std::make_pair(Counters, SP));
869
870       // If a BB has several predecessors, use a PHINode to select
871       // the correct counter.
872       for (auto &BB : F) {
873         const unsigned EdgeCount =
874             std::distance(pred_begin(&BB), pred_end(&BB));
875         if (EdgeCount) {
876           // The phi node must be at the begin of the BB.
877           IRBuilder<> BuilderForPhi(&*BB.begin());
878           Type *Int64PtrTy = Type::getInt64PtrTy(*Ctx);
879           PHINode *Phi = BuilderForPhi.CreatePHI(Int64PtrTy, EdgeCount);
880           for (BasicBlock *Pred : predecessors(&BB)) {
881             auto It = EdgeToCounter.find({Pred, &BB});
882             assert(It != EdgeToCounter.end());
883             const unsigned Edge = It->second;
884             Value *EdgeCounter = BuilderForPhi.CreateConstInBoundsGEP2_64(
885                 Counters->getValueType(), Counters, 0, Edge);
886             Phi->addIncoming(EdgeCounter, Pred);
887           }
888
889           // Skip phis, landingpads.
890           IRBuilder<> Builder(&*BB.getFirstInsertionPt());
891           Value *Count = Builder.CreateLoad(Builder.getInt64Ty(), Phi);
892           Count = Builder.CreateAdd(Count, Builder.getInt64(1));
893           Builder.CreateStore(Count, Phi);
894
895           Instruction *TI = BB.getTerminator();
896           if (isa<ReturnInst>(TI)) {
897             auto It = EdgeToCounter.find({&BB, nullptr});
898             assert(It != EdgeToCounter.end());
899             const unsigned Edge = It->second;
900             Value *Counter = Builder.CreateConstInBoundsGEP2_64(
901                 Counters->getValueType(), Counters, 0, Edge);
902             Value *Count = Builder.CreateLoad(Builder.getInt64Ty(), Counter);
903             Count = Builder.CreateAdd(Count, Builder.getInt64(1));
904             Builder.CreateStore(Count, Counter);
905           }
906         }
907       }
908     }
909
910     Function *WriteoutF = insertCounterWriteout(CountersBySP);
911     Function *ResetF = insertReset(CountersBySP);
912     Function *FlushF = insertFlush(ResetF);
913
914     // Create a small bit of code that registers the "__llvm_gcov_writeout" to
915     // be executed at exit and the "__llvm_gcov_flush" function to be executed
916     // when "__gcov_flush" is called.
917     FunctionType *FTy = FunctionType::get(Type::getVoidTy(*Ctx), false);
918     Function *F = Function::Create(FTy, GlobalValue::InternalLinkage,
919                                    "__llvm_gcov_init", M);
920     F->setUnnamedAddr(GlobalValue::UnnamedAddr::Global);
921     F->setLinkage(GlobalValue::InternalLinkage);
922     F->addFnAttr(Attribute::NoInline);
923     if (Options.NoRedZone)
924       F->addFnAttr(Attribute::NoRedZone);
925
926     BasicBlock *BB = BasicBlock::Create(*Ctx, "entry", F);
927     IRBuilder<> Builder(BB);
928
929     FTy = FunctionType::get(Type::getVoidTy(*Ctx), false);
930     Type *Params[] = {PointerType::get(FTy, 0), PointerType::get(FTy, 0),
931                       PointerType::get(FTy, 0)};
932     FTy = FunctionType::get(Builder.getVoidTy(), Params, false);
933
934     // Initialize the environment and register the local writeout, flush and
935     // reset functions.
936     FunctionCallee GCOVInit = M->getOrInsertFunction("llvm_gcov_init", FTy);
937     Builder.CreateCall(GCOVInit, {WriteoutF, FlushF, ResetF});
938     Builder.CreateRetVoid();
939
940     appendToGlobalCtors(*M, F, 0);
941     Result = true;
942   }
943
944   return Result;
945 }
946
947 FunctionCallee GCOVProfiler::getStartFileFunc(const TargetLibraryInfo *TLI) {
948   Type *Args[] = {
949       Type::getInt8PtrTy(*Ctx), // const char *orig_filename
950       Type::getInt32Ty(*Ctx),   // uint32_t version
951       Type::getInt32Ty(*Ctx),   // uint32_t checksum
952   };
953   FunctionType *FTy = FunctionType::get(Type::getVoidTy(*Ctx), Args, false);
954   AttributeList AL;
955   if (auto AK = TLI->getExtAttrForI32Param(false))
956     AL = AL.addParamAttribute(*Ctx, 2, AK);
957   FunctionCallee Res = M->getOrInsertFunction("llvm_gcda_start_file", FTy, AL);
958   return Res;
959 }
960
961 FunctionCallee GCOVProfiler::getEmitFunctionFunc(const TargetLibraryInfo *TLI) {
962   Type *Args[] = {
963     Type::getInt32Ty(*Ctx),    // uint32_t ident
964     Type::getInt32Ty(*Ctx),    // uint32_t func_checksum
965     Type::getInt32Ty(*Ctx),    // uint32_t cfg_checksum
966   };
967   FunctionType *FTy = FunctionType::get(Type::getVoidTy(*Ctx), Args, false);
968   AttributeList AL;
969   if (auto AK = TLI->getExtAttrForI32Param(false)) {
970     AL = AL.addParamAttribute(*Ctx, 0, AK);
971     AL = AL.addParamAttribute(*Ctx, 1, AK);
972     AL = AL.addParamAttribute(*Ctx, 2, AK);
973   }
974   return M->getOrInsertFunction("llvm_gcda_emit_function", FTy);
975 }
976
977 FunctionCallee GCOVProfiler::getEmitArcsFunc(const TargetLibraryInfo *TLI) {
978   Type *Args[] = {
979     Type::getInt32Ty(*Ctx),     // uint32_t num_counters
980     Type::getInt64PtrTy(*Ctx),  // uint64_t *counters
981   };
982   FunctionType *FTy = FunctionType::get(Type::getVoidTy(*Ctx), Args, false);
983   AttributeList AL;
984   if (auto AK = TLI->getExtAttrForI32Param(false))
985     AL = AL.addParamAttribute(*Ctx, 0, AK);
986   return M->getOrInsertFunction("llvm_gcda_emit_arcs", FTy, AL);
987 }
988
989 FunctionCallee GCOVProfiler::getSummaryInfoFunc() {
990   FunctionType *FTy = FunctionType::get(Type::getVoidTy(*Ctx), false);
991   return M->getOrInsertFunction("llvm_gcda_summary_info", FTy);
992 }
993
994 FunctionCallee GCOVProfiler::getEndFileFunc() {
995   FunctionType *FTy = FunctionType::get(Type::getVoidTy(*Ctx), false);
996   return M->getOrInsertFunction("llvm_gcda_end_file", FTy);
997 }
998
999 Function *GCOVProfiler::insertCounterWriteout(
1000     ArrayRef<std::pair<GlobalVariable *, MDNode *> > CountersBySP) {
1001   FunctionType *WriteoutFTy = FunctionType::get(Type::getVoidTy(*Ctx), false);
1002   Function *WriteoutF = M->getFunction("__llvm_gcov_writeout");
1003   if (!WriteoutF)
1004     WriteoutF = Function::Create(WriteoutFTy, GlobalValue::InternalLinkage,
1005                                  "__llvm_gcov_writeout", M);
1006   WriteoutF->setUnnamedAddr(GlobalValue::UnnamedAddr::Global);
1007   WriteoutF->addFnAttr(Attribute::NoInline);
1008   if (Options.NoRedZone)
1009     WriteoutF->addFnAttr(Attribute::NoRedZone);
1010
1011   BasicBlock *BB = BasicBlock::Create(*Ctx, "entry", WriteoutF);
1012   IRBuilder<> Builder(BB);
1013
1014   auto *TLI = &GetTLI(*WriteoutF);
1015
1016   FunctionCallee StartFile = getStartFileFunc(TLI);
1017   FunctionCallee EmitFunction = getEmitFunctionFunc(TLI);
1018   FunctionCallee EmitArcs = getEmitArcsFunc(TLI);
1019   FunctionCallee SummaryInfo = getSummaryInfoFunc();
1020   FunctionCallee EndFile = getEndFileFunc();
1021
1022   NamedMDNode *CUNodes = M->getNamedMetadata("llvm.dbg.cu");
1023   if (!CUNodes) {
1024     Builder.CreateRetVoid();
1025     return WriteoutF;
1026   }
1027
1028   // Collect the relevant data into a large constant data structure that we can
1029   // walk to write out everything.
1030   StructType *StartFileCallArgsTy = StructType::create(
1031       {Builder.getInt8PtrTy(), Builder.getInt32Ty(), Builder.getInt32Ty()});
1032   StructType *EmitFunctionCallArgsTy = StructType::create(
1033       {Builder.getInt32Ty(), Builder.getInt32Ty(), Builder.getInt32Ty()});
1034   StructType *EmitArcsCallArgsTy = StructType::create(
1035       {Builder.getInt32Ty(), Builder.getInt64Ty()->getPointerTo()});
1036   StructType *FileInfoTy =
1037       StructType::create({StartFileCallArgsTy, Builder.getInt32Ty(),
1038                           EmitFunctionCallArgsTy->getPointerTo(),
1039                           EmitArcsCallArgsTy->getPointerTo()});
1040
1041   Constant *Zero32 = Builder.getInt32(0);
1042   // Build an explicit array of two zeros for use in ConstantExpr GEP building.
1043   Constant *TwoZero32s[] = {Zero32, Zero32};
1044
1045   SmallVector<Constant *, 8> FileInfos;
1046   for (int i : llvm::seq<int>(0, CUNodes->getNumOperands())) {
1047     auto *CU = cast<DICompileUnit>(CUNodes->getOperand(i));
1048
1049     // Skip module skeleton (and module) CUs.
1050     if (CU->getDWOId())
1051       continue;
1052
1053     std::string FilenameGcda = mangleName(CU, GCovFileType::GCDA);
1054     uint32_t CfgChecksum = FileChecksums.empty() ? 0 : FileChecksums[i];
1055     auto *StartFileCallArgs = ConstantStruct::get(
1056         StartFileCallArgsTy,
1057         {Builder.CreateGlobalStringPtr(FilenameGcda),
1058          Builder.getInt32(endian::read32be(Options.Version)),
1059          Builder.getInt32(CfgChecksum)});
1060
1061     SmallVector<Constant *, 8> EmitFunctionCallArgsArray;
1062     SmallVector<Constant *, 8> EmitArcsCallArgsArray;
1063     for (int j : llvm::seq<int>(0, CountersBySP.size())) {
1064       uint32_t FuncChecksum = Funcs.empty() ? 0 : Funcs[j]->getFuncChecksum();
1065       EmitFunctionCallArgsArray.push_back(ConstantStruct::get(
1066           EmitFunctionCallArgsTy,
1067           {Builder.getInt32(j),
1068            Builder.getInt32(FuncChecksum),
1069            Builder.getInt32(CfgChecksum)}));
1070
1071       GlobalVariable *GV = CountersBySP[j].first;
1072       unsigned Arcs = cast<ArrayType>(GV->getValueType())->getNumElements();
1073       EmitArcsCallArgsArray.push_back(ConstantStruct::get(
1074           EmitArcsCallArgsTy,
1075           {Builder.getInt32(Arcs), ConstantExpr::getInBoundsGetElementPtr(
1076                                        GV->getValueType(), GV, TwoZero32s)}));
1077     }
1078     // Create global arrays for the two emit calls.
1079     int CountersSize = CountersBySP.size();
1080     assert(CountersSize == (int)EmitFunctionCallArgsArray.size() &&
1081            "Mismatched array size!");
1082     assert(CountersSize == (int)EmitArcsCallArgsArray.size() &&
1083            "Mismatched array size!");
1084     auto *EmitFunctionCallArgsArrayTy =
1085         ArrayType::get(EmitFunctionCallArgsTy, CountersSize);
1086     auto *EmitFunctionCallArgsArrayGV = new GlobalVariable(
1087         *M, EmitFunctionCallArgsArrayTy, /*isConstant*/ true,
1088         GlobalValue::InternalLinkage,
1089         ConstantArray::get(EmitFunctionCallArgsArrayTy,
1090                            EmitFunctionCallArgsArray),
1091         Twine("__llvm_internal_gcov_emit_function_args.") + Twine(i));
1092     auto *EmitArcsCallArgsArrayTy =
1093         ArrayType::get(EmitArcsCallArgsTy, CountersSize);
1094     EmitFunctionCallArgsArrayGV->setUnnamedAddr(
1095         GlobalValue::UnnamedAddr::Global);
1096     auto *EmitArcsCallArgsArrayGV = new GlobalVariable(
1097         *M, EmitArcsCallArgsArrayTy, /*isConstant*/ true,
1098         GlobalValue::InternalLinkage,
1099         ConstantArray::get(EmitArcsCallArgsArrayTy, EmitArcsCallArgsArray),
1100         Twine("__llvm_internal_gcov_emit_arcs_args.") + Twine(i));
1101     EmitArcsCallArgsArrayGV->setUnnamedAddr(GlobalValue::UnnamedAddr::Global);
1102
1103     FileInfos.push_back(ConstantStruct::get(
1104         FileInfoTy,
1105         {StartFileCallArgs, Builder.getInt32(CountersSize),
1106          ConstantExpr::getInBoundsGetElementPtr(EmitFunctionCallArgsArrayTy,
1107                                                 EmitFunctionCallArgsArrayGV,
1108                                                 TwoZero32s),
1109          ConstantExpr::getInBoundsGetElementPtr(
1110              EmitArcsCallArgsArrayTy, EmitArcsCallArgsArrayGV, TwoZero32s)}));
1111   }
1112
1113   // If we didn't find anything to actually emit, bail on out.
1114   if (FileInfos.empty()) {
1115     Builder.CreateRetVoid();
1116     return WriteoutF;
1117   }
1118
1119   // To simplify code, we cap the number of file infos we write out to fit
1120   // easily in a 32-bit signed integer. This gives consistent behavior between
1121   // 32-bit and 64-bit systems without requiring (potentially very slow) 64-bit
1122   // operations on 32-bit systems. It also seems unreasonable to try to handle
1123   // more than 2 billion files.
1124   if ((int64_t)FileInfos.size() > (int64_t)INT_MAX)
1125     FileInfos.resize(INT_MAX);
1126
1127   // Create a global for the entire data structure so we can walk it more
1128   // easily.
1129   auto *FileInfoArrayTy = ArrayType::get(FileInfoTy, FileInfos.size());
1130   auto *FileInfoArrayGV = new GlobalVariable(
1131       *M, FileInfoArrayTy, /*isConstant*/ true, GlobalValue::InternalLinkage,
1132       ConstantArray::get(FileInfoArrayTy, FileInfos),
1133       "__llvm_internal_gcov_emit_file_info");
1134   FileInfoArrayGV->setUnnamedAddr(GlobalValue::UnnamedAddr::Global);
1135
1136   // Create the CFG for walking this data structure.
1137   auto *FileLoopHeader =
1138       BasicBlock::Create(*Ctx, "file.loop.header", WriteoutF);
1139   auto *CounterLoopHeader =
1140       BasicBlock::Create(*Ctx, "counter.loop.header", WriteoutF);
1141   auto *FileLoopLatch = BasicBlock::Create(*Ctx, "file.loop.latch", WriteoutF);
1142   auto *ExitBB = BasicBlock::Create(*Ctx, "exit", WriteoutF);
1143
1144   // We always have at least one file, so just branch to the header.
1145   Builder.CreateBr(FileLoopHeader);
1146
1147   // The index into the files structure is our loop induction variable.
1148   Builder.SetInsertPoint(FileLoopHeader);
1149   PHINode *IV =
1150       Builder.CreatePHI(Builder.getInt32Ty(), /*NumReservedValues*/ 2);
1151   IV->addIncoming(Builder.getInt32(0), BB);
1152   auto *FileInfoPtr = Builder.CreateInBoundsGEP(
1153       FileInfoArrayTy, FileInfoArrayGV, {Builder.getInt32(0), IV});
1154   auto *StartFileCallArgsPtr =
1155       Builder.CreateStructGEP(FileInfoTy, FileInfoPtr, 0);
1156   auto *StartFileCall = Builder.CreateCall(
1157       StartFile,
1158       {Builder.CreateLoad(StartFileCallArgsTy->getElementType(0),
1159                           Builder.CreateStructGEP(StartFileCallArgsTy,
1160                                                   StartFileCallArgsPtr, 0)),
1161        Builder.CreateLoad(StartFileCallArgsTy->getElementType(1),
1162                           Builder.CreateStructGEP(StartFileCallArgsTy,
1163                                                   StartFileCallArgsPtr, 1)),
1164        Builder.CreateLoad(StartFileCallArgsTy->getElementType(2),
1165                           Builder.CreateStructGEP(StartFileCallArgsTy,
1166                                                   StartFileCallArgsPtr, 2))});
1167   if (auto AK = TLI->getExtAttrForI32Param(false))
1168     StartFileCall->addParamAttr(2, AK);
1169   auto *NumCounters =
1170       Builder.CreateLoad(FileInfoTy->getElementType(1),
1171                          Builder.CreateStructGEP(FileInfoTy, FileInfoPtr, 1));
1172   auto *EmitFunctionCallArgsArray =
1173       Builder.CreateLoad(FileInfoTy->getElementType(2),
1174                          Builder.CreateStructGEP(FileInfoTy, FileInfoPtr, 2));
1175   auto *EmitArcsCallArgsArray =
1176       Builder.CreateLoad(FileInfoTy->getElementType(3),
1177                          Builder.CreateStructGEP(FileInfoTy, FileInfoPtr, 3));
1178   auto *EnterCounterLoopCond =
1179       Builder.CreateICmpSLT(Builder.getInt32(0), NumCounters);
1180   Builder.CreateCondBr(EnterCounterLoopCond, CounterLoopHeader, FileLoopLatch);
1181
1182   Builder.SetInsertPoint(CounterLoopHeader);
1183   auto *JV = Builder.CreatePHI(Builder.getInt32Ty(), /*NumReservedValues*/ 2);
1184   JV->addIncoming(Builder.getInt32(0), FileLoopHeader);
1185   auto *EmitFunctionCallArgsPtr = Builder.CreateInBoundsGEP(
1186       EmitFunctionCallArgsTy, EmitFunctionCallArgsArray, JV);
1187   auto *EmitFunctionCall = Builder.CreateCall(
1188       EmitFunction,
1189       {Builder.CreateLoad(EmitFunctionCallArgsTy->getElementType(0),
1190                           Builder.CreateStructGEP(EmitFunctionCallArgsTy,
1191                                                   EmitFunctionCallArgsPtr, 0)),
1192        Builder.CreateLoad(EmitFunctionCallArgsTy->getElementType(1),
1193                           Builder.CreateStructGEP(EmitFunctionCallArgsTy,
1194                                                   EmitFunctionCallArgsPtr, 1)),
1195        Builder.CreateLoad(EmitFunctionCallArgsTy->getElementType(2),
1196                           Builder.CreateStructGEP(EmitFunctionCallArgsTy,
1197                                                   EmitFunctionCallArgsPtr,
1198                                                   2))});
1199   if (auto AK = TLI->getExtAttrForI32Param(false)) {
1200     EmitFunctionCall->addParamAttr(0, AK);
1201     EmitFunctionCall->addParamAttr(1, AK);
1202     EmitFunctionCall->addParamAttr(2, AK);
1203   }
1204   auto *EmitArcsCallArgsPtr =
1205       Builder.CreateInBoundsGEP(EmitArcsCallArgsTy, EmitArcsCallArgsArray, JV);
1206   auto *EmitArcsCall = Builder.CreateCall(
1207       EmitArcs,
1208       {Builder.CreateLoad(
1209            EmitArcsCallArgsTy->getElementType(0),
1210            Builder.CreateStructGEP(EmitArcsCallArgsTy, EmitArcsCallArgsPtr, 0)),
1211        Builder.CreateLoad(EmitArcsCallArgsTy->getElementType(1),
1212                           Builder.CreateStructGEP(EmitArcsCallArgsTy,
1213                                                   EmitArcsCallArgsPtr, 1))});
1214   if (auto AK = TLI->getExtAttrForI32Param(false))
1215     EmitArcsCall->addParamAttr(0, AK);
1216   auto *NextJV = Builder.CreateAdd(JV, Builder.getInt32(1));
1217   auto *CounterLoopCond = Builder.CreateICmpSLT(NextJV, NumCounters);
1218   Builder.CreateCondBr(CounterLoopCond, CounterLoopHeader, FileLoopLatch);
1219   JV->addIncoming(NextJV, CounterLoopHeader);
1220
1221   Builder.SetInsertPoint(FileLoopLatch);
1222   Builder.CreateCall(SummaryInfo, {});
1223   Builder.CreateCall(EndFile, {});
1224   auto *NextIV = Builder.CreateAdd(IV, Builder.getInt32(1));
1225   auto *FileLoopCond =
1226       Builder.CreateICmpSLT(NextIV, Builder.getInt32(FileInfos.size()));
1227   Builder.CreateCondBr(FileLoopCond, FileLoopHeader, ExitBB);
1228   IV->addIncoming(NextIV, FileLoopLatch);
1229
1230   Builder.SetInsertPoint(ExitBB);
1231   Builder.CreateRetVoid();
1232
1233   return WriteoutF;
1234 }
1235
1236 Function *GCOVProfiler::insertReset(
1237     ArrayRef<std::pair<GlobalVariable *, MDNode *>> CountersBySP) {
1238   FunctionType *FTy = FunctionType::get(Type::getVoidTy(*Ctx), false);
1239   Function *ResetF = M->getFunction("__llvm_gcov_reset");
1240   if (!ResetF)
1241     ResetF = Function::Create(FTy, GlobalValue::InternalLinkage,
1242                               "__llvm_gcov_reset", M);
1243   ResetF->setUnnamedAddr(GlobalValue::UnnamedAddr::Global);
1244   ResetF->addFnAttr(Attribute::NoInline);
1245   if (Options.NoRedZone)
1246     ResetF->addFnAttr(Attribute::NoRedZone);
1247
1248   BasicBlock *Entry = BasicBlock::Create(*Ctx, "entry", ResetF);
1249   IRBuilder<> Builder(Entry);
1250
1251   // Zero out the counters.
1252   for (const auto &I : CountersBySP) {
1253     GlobalVariable *GV = I.first;
1254     Constant *Null = Constant::getNullValue(GV->getValueType());
1255     Builder.CreateStore(Null, GV);
1256   }
1257
1258   Type *RetTy = ResetF->getReturnType();
1259   if (RetTy->isVoidTy())
1260     Builder.CreateRetVoid();
1261   else if (RetTy->isIntegerTy())
1262     // Used if __llvm_gcov_reset was implicitly declared.
1263     Builder.CreateRet(ConstantInt::get(RetTy, 0));
1264   else
1265     report_fatal_error("invalid return type for __llvm_gcov_reset");
1266
1267   return ResetF;
1268 }
1269
1270 Function *GCOVProfiler::insertFlush(Function *ResetF) {
1271   FunctionType *FTy = FunctionType::get(Type::getVoidTy(*Ctx), false);
1272   Function *FlushF = M->getFunction("__llvm_gcov_flush");
1273   if (!FlushF)
1274     FlushF = Function::Create(FTy, GlobalValue::InternalLinkage,
1275                               "__llvm_gcov_flush", M);
1276   FlushF->setUnnamedAddr(GlobalValue::UnnamedAddr::Global);
1277   FlushF->addFnAttr(Attribute::NoInline);
1278   if (Options.NoRedZone)
1279     FlushF->addFnAttr(Attribute::NoRedZone);
1280
1281   BasicBlock *Entry = BasicBlock::Create(*Ctx, "entry", FlushF);
1282
1283   // Write out the current counters.
1284   Function *WriteoutF = M->getFunction("__llvm_gcov_writeout");
1285   assert(WriteoutF && "Need to create the writeout function first!");
1286
1287   IRBuilder<> Builder(Entry);
1288   Builder.CreateCall(WriteoutF, {});
1289   Builder.CreateCall(ResetF, {});
1290
1291   Type *RetTy = FlushF->getReturnType();
1292   if (RetTy->isVoidTy())
1293     Builder.CreateRetVoid();
1294   else if (RetTy->isIntegerTy())
1295     // Used if __llvm_gcov_flush was implicitly declared.
1296     Builder.CreateRet(ConstantInt::get(RetTy, 0));
1297   else
1298     report_fatal_error("invalid return type for __llvm_gcov_flush");
1299
1300   return FlushF;
1301 }