mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-10-30 23:42:52 +01:00
ee12d58370
infrastructure. This was essentially work toward PGO based on a design that had several flaws, partially dating from a time when LLVM had a different architecture, and with an effort to modernize it abandoned without being completed. Since then, it has bitrotted for several years further. The result is nearly unusable, and isn't helping any of the modern PGO efforts. Instead, it is getting in the way, adding confusion about PGO in LLVM and distracting everyone with maintenance on essentially dead code. Removing it paves the way for modern efforts around PGO. Among other effects, this removes the last of the runtime libraries from LLVM. Those are being developed in the separate 'compiler-rt' project now, with somewhat different licensing specifically more approriate for runtimes. llvm-svn: 191835
133 lines
5.4 KiB
C++
133 lines
5.4 KiB
C++
//===- Transforms/Instrumentation.h - Instrumentation passes ----*- C++ -*-===//
|
|
//
|
|
// The LLVM Compiler Infrastructure
|
|
//
|
|
// This file is distributed under the University of Illinois Open Source
|
|
// License. See LICENSE.TXT for details.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
//
|
|
// This file defines constructor functions for instrumentation passes.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#ifndef LLVM_TRANSFORMS_INSTRUMENTATION_H
|
|
#define LLVM_TRANSFORMS_INSTRUMENTATION_H
|
|
|
|
#include "llvm/ADT/StringRef.h"
|
|
|
|
#if defined(__GNUC__) && defined(__linux__)
|
|
inline void *getDFSanArgTLSPtrForJIT() {
|
|
extern __thread __attribute__((tls_model("initial-exec")))
|
|
void *__dfsan_arg_tls;
|
|
return (void *)&__dfsan_arg_tls;
|
|
}
|
|
|
|
inline void *getDFSanRetValTLSPtrForJIT() {
|
|
extern __thread __attribute__((tls_model("initial-exec")))
|
|
void *__dfsan_retval_tls;
|
|
return (void *)&__dfsan_retval_tls;
|
|
}
|
|
#endif
|
|
|
|
namespace llvm {
|
|
|
|
class ModulePass;
|
|
class FunctionPass;
|
|
|
|
// Insert GCOV profiling instrumentation
|
|
struct GCOVOptions {
|
|
static GCOVOptions getDefault();
|
|
|
|
// Specify whether to emit .gcno files.
|
|
bool EmitNotes;
|
|
|
|
// Specify whether to modify the program to emit .gcda files when run.
|
|
bool EmitData;
|
|
|
|
// A four-byte version string. The meaning of a version string is described in
|
|
// gcc's gcov-io.h
|
|
char Version[4];
|
|
|
|
// Emit a "cfg checksum" that follows the "line number checksum" of a
|
|
// function. This affects both .gcno and .gcda files.
|
|
bool UseCfgChecksum;
|
|
|
|
// Add the 'noredzone' attribute to added runtime library calls.
|
|
bool NoRedZone;
|
|
|
|
// Emit the name of the function in the .gcda files. This is redundant, as
|
|
// the function identifier can be used to find the name from the .gcno file.
|
|
bool FunctionNamesInData;
|
|
};
|
|
ModulePass *createGCOVProfilerPass(const GCOVOptions &Options =
|
|
GCOVOptions::getDefault());
|
|
|
|
// Insert AddressSanitizer (address sanity checking) instrumentation
|
|
FunctionPass *createAddressSanitizerFunctionPass(
|
|
bool CheckInitOrder = true, bool CheckUseAfterReturn = false,
|
|
bool CheckLifetime = false, StringRef BlacklistFile = StringRef(),
|
|
bool ZeroBaseShadow = false);
|
|
ModulePass *createAddressSanitizerModulePass(
|
|
bool CheckInitOrder = true, StringRef BlacklistFile = StringRef(),
|
|
bool ZeroBaseShadow = false);
|
|
|
|
// Insert MemorySanitizer instrumentation (detection of uninitialized reads)
|
|
FunctionPass *createMemorySanitizerPass(bool TrackOrigins = false,
|
|
StringRef BlacklistFile = StringRef());
|
|
|
|
// Insert ThreadSanitizer (race detection) instrumentation
|
|
FunctionPass *createThreadSanitizerPass(StringRef BlacklistFile = StringRef());
|
|
|
|
// Insert DataFlowSanitizer (dynamic data flow analysis) instrumentation
|
|
ModulePass *createDataFlowSanitizerPass(StringRef ABIListFile = StringRef(),
|
|
void *(*getArgTLS)() = 0,
|
|
void *(*getRetValTLS)() = 0);
|
|
|
|
#if defined(__GNUC__) && defined(__linux__)
|
|
inline ModulePass *createDataFlowSanitizerPassForJIT(StringRef ABIListFile =
|
|
StringRef()) {
|
|
return createDataFlowSanitizerPass(ABIListFile, getDFSanArgTLSPtrForJIT,
|
|
getDFSanRetValTLSPtrForJIT);
|
|
}
|
|
#endif
|
|
|
|
// BoundsChecking - This pass instruments the code to perform run-time bounds
|
|
// checking on loads, stores, and other memory intrinsics.
|
|
FunctionPass *createBoundsCheckingPass();
|
|
|
|
/// createDebugIRPass - Enable interactive stepping through LLVM IR in LLDB (or
|
|
/// GDB) and generate a file with the LLVM IR to be
|
|
/// displayed in the debugger.
|
|
///
|
|
/// Existing debug metadata is preserved (but may be modified) in order to allow
|
|
/// accessing variables in the original source. The line table and file
|
|
/// information is modified to correspond to the lines in the LLVM IR. If
|
|
/// Filename and Directory are empty, a file name is generated based on existing
|
|
/// debug information. If no debug information is available, a temporary file
|
|
/// name is generated.
|
|
///
|
|
/// @param HideDebugIntrinsics Omit debug intrinsics in emitted IR source file.
|
|
/// @param HideDebugMetadata Omit debug metadata in emitted IR source file.
|
|
/// @param Directory Embed this directory in the debug information.
|
|
/// @param Filename Embed this file name in the debug information.
|
|
ModulePass *createDebugIRPass(bool HideDebugIntrinsics,
|
|
bool HideDebugMetadata,
|
|
StringRef Directory = StringRef(),
|
|
StringRef Filename = StringRef());
|
|
|
|
/// createDebugIRPass - Enable interactive stepping through LLVM IR in LLDB
|
|
/// (or GDB) with an existing IR file on disk. When creating
|
|
/// a DebugIR pass with this function, no source file is
|
|
/// output to disk and the existing one is unmodified. Debug
|
|
/// metadata in the Module is created/updated to point to
|
|
/// the existing textual IR file on disk.
|
|
/// NOTE: If the IR file to be debugged is not on disk, use the version of this
|
|
/// function with parameters in order to generate the file that will be
|
|
/// seen by the debugger.
|
|
ModulePass *createDebugIRPass();
|
|
|
|
} // End llvm namespace
|
|
|
|
#endif
|