1//===- Transforms/Instrumentation.h - Instrumentation passes ----*- C++ -*-===//
2//
3//                     The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// This file defines constructor functions for instrumentation passes.
11//
12//===----------------------------------------------------------------------===//
13
14#ifndef LLVM_TRANSFORMS_INSTRUMENTATION_H
15#define LLVM_TRANSFORMS_INSTRUMENTATION_H
16
17#include "llvm/ADT/StringRef.h"
18#include <vector>
19
20#if defined(__GNUC__) && defined(__linux__) && !defined(ANDROID)
21inline void *getDFSanArgTLSPtrForJIT() {
22  extern __thread __attribute__((tls_model("initial-exec")))
23    void *__dfsan_arg_tls;
24  return (void *)&__dfsan_arg_tls;
25}
26
27inline void *getDFSanRetValTLSPtrForJIT() {
28  extern __thread __attribute__((tls_model("initial-exec")))
29    void *__dfsan_retval_tls;
30  return (void *)&__dfsan_retval_tls;
31}
32#endif
33
34namespace llvm {
35
36class ModulePass;
37class FunctionPass;
38
39// Insert GCOV profiling instrumentation
40struct GCOVOptions {
41  static GCOVOptions getDefault();
42
43  // Specify whether to emit .gcno files.
44  bool EmitNotes;
45
46  // Specify whether to modify the program to emit .gcda files when run.
47  bool EmitData;
48
49  // A four-byte version string. The meaning of a version string is described in
50  // gcc's gcov-io.h
51  char Version[4];
52
53  // Emit a "cfg checksum" that follows the "line number checksum" of a
54  // function. This affects both .gcno and .gcda files.
55  bool UseCfgChecksum;
56
57  // Add the 'noredzone' attribute to added runtime library calls.
58  bool NoRedZone;
59
60  // Emit the name of the function in the .gcda files. This is redundant, as
61  // the function identifier can be used to find the name from the .gcno file.
62  bool FunctionNamesInData;
63
64  // Emit the exit block immediately after the start block, rather than after
65  // all of the function body's blocks.
66  bool ExitBlockBeforeBody;
67};
68ModulePass *createGCOVProfilerPass(const GCOVOptions &Options =
69                                   GCOVOptions::getDefault());
70
71/// Options for the frontend instrumentation based profiling pass.
72struct InstrProfOptions {
73  InstrProfOptions() : NoRedZone(false) {}
74
75  // Add the 'noredzone' attribute to added runtime library calls.
76  bool NoRedZone;
77};
78
79/// Insert frontend instrumentation based profiling.
80ModulePass *createInstrProfilingPass(
81    const InstrProfOptions &Options = InstrProfOptions());
82
83// Insert AddressSanitizer (address sanity checking) instrumentation
84FunctionPass *createAddressSanitizerFunctionPass();
85ModulePass *createAddressSanitizerModulePass();
86
87// Insert MemorySanitizer instrumentation (detection of uninitialized reads)
88FunctionPass *createMemorySanitizerPass(int TrackOrigins = 0);
89
90// Insert ThreadSanitizer (race detection) instrumentation
91FunctionPass *createThreadSanitizerPass();
92
93// Insert DataFlowSanitizer (dynamic data flow analysis) instrumentation
94ModulePass *createDataFlowSanitizerPass(
95    const std::vector<std::string> &ABIListFiles = std::vector<std::string>(),
96    void *(*getArgTLS)() = nullptr, void *(*getRetValTLS)() = nullptr);
97
98// Insert SanitizerCoverage instrumentation.
99ModulePass *createSanitizerCoverageModulePass(int CoverageLevel);
100
101#if defined(__GNUC__) && defined(__linux__) && !defined(ANDROID)
102inline ModulePass *createDataFlowSanitizerPassForJIT(
103    const std::vector<std::string> &ABIListFiles = std::vector<std::string>()) {
104  return createDataFlowSanitizerPass(ABIListFiles, getDFSanArgTLSPtrForJIT,
105                                     getDFSanRetValTLSPtrForJIT);
106}
107#endif
108
109// BoundsChecking - This pass instruments the code to perform run-time bounds
110// checking on loads, stores, and other memory intrinsics.
111FunctionPass *createBoundsCheckingPass();
112
113} // End llvm namespace
114
115#endif
116