LLVM 19.0.0git
Macros | Enumerations | Functions | Variables
NumericalStabilitySanitizer.cpp File Reference
#include "llvm/Transforms/Instrumentation/NumericalStabilitySanitizer.h"
#include "llvm/ADT/DenseMap.h"
#include "llvm/ADT/SmallString.h"
#include "llvm/ADT/SmallVector.h"
#include "llvm/ADT/Statistic.h"
#include "llvm/ADT/StringExtras.h"
#include "llvm/Analysis/TargetLibraryInfo.h"
#include "llvm/Analysis/ValueTracking.h"
#include "llvm/IR/DataLayout.h"
#include "llvm/IR/Function.h"
#include "llvm/IR/IRBuilder.h"
#include "llvm/IR/IntrinsicInst.h"
#include "llvm/IR/Intrinsics.h"
#include "llvm/IR/LLVMContext.h"
#include "llvm/IR/MDBuilder.h"
#include "llvm/IR/Metadata.h"
#include "llvm/IR/Module.h"
#include "llvm/IR/Type.h"
#include "llvm/InitializePasses.h"
#include "llvm/Support/CommandLine.h"
#include "llvm/Support/Debug.h"
#include "llvm/Support/MathExtras.h"
#include "llvm/Support/Regex.h"
#include "llvm/Support/raw_ostream.h"
#include "llvm/Transforms/Instrumentation.h"
#include "llvm/Transforms/Utils/BasicBlockUtils.h"
#include "llvm/Transforms/Utils/EscapeEnumerator.h"
#include "llvm/Transforms/Utils/Local.h"
#include "llvm/Transforms/Utils/ModuleUtils.h"
#include <cstdint>

Go to the source code of this file.

Macros

#define DEBUG_TYPE   "nsan"
 
#define MOVE_FLAG(attr, setter)
 

Enumerations

enum class  ContinuationType { ContinueWithShadow = 0 , ResumeFromValue = 1 }
 

Functions

 STATISTIC (NumInstrumentedFTLoads, "Number of instrumented floating-point loads")
 
 STATISTIC (NumInstrumentedFTCalls, "Number of instrumented floating-point calls")
 
 STATISTIC (NumInstrumentedFTRets, "Number of instrumented floating-point returns")
 
 STATISTIC (NumInstrumentedFTStores, "Number of instrumented floating-point stores")
 
 STATISTIC (NumInstrumentedNonFTStores, "Number of instrumented non floating-point stores")
 
 STATISTIC (NumInstrumentedNonFTMemcpyStores, "Number of instrumented non floating-point stores with memcpy semantics")
 
 STATISTIC (NumInstrumentedFCmp, "Number of instrumented fcmps")
 
constexpr StringLiteral kNsanModuleCtorName ("nsan.module_ctor")
 
constexpr StringLiteral kNsanInitName ("__nsan_init")
 
static GlobalValuecreateThreadLocalGV (const char *Name, Module &M, Type *Ty)
 
static bool shouldCheckArgs (CallBase &CI, const TargetLibraryInfo &TLI, const std::optional< Regex > &CheckFunctionsFilter)
 
static FunctionTypemakeDoubleDouble (LLVMContext &C)
 
static FunctionTypemakeX86FP80X86FP80 (LLVMContext &C)
 
static FunctionTypemakeDoubleDoubleI32 (LLVMContext &C)
 
static FunctionTypemakeX86FP80X86FP80I32 (LLVMContext &C)
 
static FunctionTypemakeDoubleDoubleDouble (LLVMContext &C)
 
static FunctionTypemakeX86FP80X86FP80X86FP80 (LLVMContext &C)
 
static FunctionTypemakeDoubleDoubleDoubleDouble (LLVMContext &C)
 
static FunctionTypemakeX86FP80X86FP80X86FP80X86FP80 (LLVMContext &C)
 
static const chargetIntrinsicFromLibfunc (Function &Fn, Type *VT, const TargetLibraryInfo &TLI)
 
static void moveFastMathFlags (Function &F, std::vector< Instruction * > &Instructions)
 

Variables

static cl::opt< std::string > ClShadowMapping ("nsan-shadow-type-mapping", cl::init("dqq"), cl::desc("One shadow type id for each of `float`, `double`, `long double`. " "`d`,`l`,`q`,`e` mean double, x86_fp80, fp128 (quad) and " "ppc_fp128 (extended double) respectively. The default is to " "shadow `float` as `double`, and `double` and `x86_fp80` as " "`fp128`"), cl::Hidden)
 
static cl::opt< boolClInstrumentFCmp ("nsan-instrument-fcmp", cl::init(true), cl::desc("Instrument floating-point comparisons"), cl::Hidden)
 
static cl::opt< std::string > ClCheckFunctionsFilter ("check-functions-filter", cl::desc("Only emit checks for arguments of functions " "whose names match the given regular expression"), cl::value_desc("regex"))
 
static cl::opt< boolClTruncateFCmpEq ("nsan-truncate-fcmp-eq", cl::init(true), cl::desc("This flag controls the behaviour of fcmp equality comparisons." "For equality comparisons such as `x == 0.0f`, we can perform the " "shadow check in the shadow (`x_shadow == 0.0) == (x == 0.0f)`) or app " " domain (`(trunc(x_shadow) == 0.0f) == (x == 0.0f)`). This helps " "catch the case when `x_shadow` is accurate enough (and therefore " "close enough to zero) so that `trunc(x_shadow)` is zero even though " "both `x` and `x_shadow` are not"), cl::Hidden)
 
static cl::opt< boolClCheckLoads ("nsan-check-loads", cl::desc("Check floating-point load"), cl::Hidden)
 
static cl::opt< boolClCheckStores ("nsan-check-stores", cl::init(true), cl::desc("Check floating-point stores"), cl::Hidden)
 
static cl::opt< boolClCheckRet ("nsan-check-ret", cl::init(true), cl::desc("Check floating-point return values"), cl::Hidden)
 
static cl::opt< boolClPropagateNonFTConstStoresAsFT ("nsan-propagate-non-ft-const-stores-as-ft", cl::desc("Propagate non floating-point const stores as floating point values." "For debugging purposes only"), cl::Hidden)
 
constexpr int kShadowScale = 2
 
constexpr int kMaxVectorWidth = 8
 
constexpr int kMaxNumArgs = 128
 
constexpr int kMaxShadowTypeSizeBytes = 16
 

Macro Definition Documentation

◆ DEBUG_TYPE

#define DEBUG_TYPE   "nsan"

Definition at line 51 of file NumericalStabilitySanitizer.cpp.

◆ MOVE_FLAG

#define MOVE_FLAG (   attr,
  setter 
)
Value:
if (F.getFnAttribute(attr).getValueAsString() == "true") { \
F.removeFnAttr(attr); \
FMF.set##setter(); \
}
#define F(x, y, z)
Definition: MD5.cpp:55

Enumeration Type Documentation

◆ ContinuationType

enum class ContinuationType
strong
Enumerator
ContinueWithShadow 
ResumeFromValue 

Definition at line 833 of file NumericalStabilitySanitizer.cpp.

Function Documentation

◆ createThreadLocalGV()

static GlobalValue * createThreadLocalGV ( const char Name,
Module M,
Type Ty 
)
static

Definition at line 592 of file NumericalStabilitySanitizer.cpp.

References Name.

◆ getIntrinsicFromLibfunc()

static const char * getIntrinsicFromLibfunc ( Function Fn,
Type VT,
const TargetLibraryInfo TLI 
)
static

◆ kNsanInitName()

constexpr StringLiteral kNsanInitName ( "__nsan_init"  )
constexpr

◆ kNsanModuleCtorName()

constexpr StringLiteral kNsanModuleCtorName ( "nsan.module_ctor"  )
constexpr

◆ makeDoubleDouble()

static FunctionType * makeDoubleDouble ( LLVMContext C)
static

◆ makeDoubleDoubleDouble()

static FunctionType * makeDoubleDoubleDouble ( LLVMContext C)
static

◆ makeDoubleDoubleDoubleDouble()

static FunctionType * makeDoubleDoubleDoubleDouble ( LLVMContext C)
static

◆ makeDoubleDoubleI32()

static FunctionType * makeDoubleDoubleI32 ( LLVMContext C)
static

◆ makeX86FP80X86FP80()

static FunctionType * makeX86FP80X86FP80 ( LLVMContext C)
static

◆ makeX86FP80X86FP80I32()

static FunctionType * makeX86FP80X86FP80I32 ( LLVMContext C)
static

◆ makeX86FP80X86FP80X86FP80()

static FunctionType * makeX86FP80X86FP80X86FP80 ( LLVMContext C)
static

◆ makeX86FP80X86FP80X86FP80X86FP80()

static FunctionType * makeX86FP80X86FP80X86FP80X86FP80 ( LLVMContext C)
static

◆ moveFastMathFlags()

static void moveFastMathFlags ( Function F,
std::vector< Instruction * > &  Instructions 
)
static

Definition at line 1957 of file NumericalStabilitySanitizer.cpp.

References llvm::CallingConv::Fast, I, and MOVE_FLAG.

◆ shouldCheckArgs()

static bool shouldCheckArgs ( CallBase CI,
const TargetLibraryInfo TLI,
const std::optional< Regex > &  CheckFunctionsFilter 
)
static

◆ STATISTIC() [1/7]

STATISTIC ( NumInstrumentedFCmp  ,
"Number of instrumented fcmps"   
)

◆ STATISTIC() [2/7]

STATISTIC ( NumInstrumentedFTCalls  ,
"Number of instrumented floating-point calls"   
)

◆ STATISTIC() [3/7]

STATISTIC ( NumInstrumentedFTLoads  ,
"Number of instrumented floating-point loads"   
)

◆ STATISTIC() [4/7]

STATISTIC ( NumInstrumentedFTRets  ,
"Number of instrumented floating-point returns"   
)

◆ STATISTIC() [5/7]

STATISTIC ( NumInstrumentedFTStores  ,
"Number of instrumented floating-point stores"   
)

◆ STATISTIC() [6/7]

STATISTIC ( NumInstrumentedNonFTMemcpyStores  ,
"Number of instrumented non floating-point stores with memcpy semantics"   
)

◆ STATISTIC() [7/7]

STATISTIC ( NumInstrumentedNonFTStores  ,
"Number of instrumented non floating-point stores"   
)

Variable Documentation

◆ ClCheckFunctionsFilter

cl::opt< std::string > ClCheckFunctionsFilter("check-functions-filter", cl::desc("Only emit checks for arguments of functions " "whose names match the given regular expression"), cl::value_desc("regex")) ( "check-functions-filter"  ,
cl::desc("Only emit checks for arguments of functions " "whose names match the given regular expression")  ,
cl::value_desc("regex")   
)
static

◆ ClCheckLoads

cl::opt< bool > ClCheckLoads("nsan-check-loads", cl::desc("Check floating-point load"), cl::Hidden) ( "nsan-check-loads"  ,
cl::desc("Check floating-point load")  ,
cl::Hidden   
)
static

◆ ClCheckRet

cl::opt< bool > ClCheckRet("nsan-check-ret", cl::init(true), cl::desc("Check floating-point return values"), cl::Hidden) ( "nsan-check-ret"  ,
cl::init(true ,
cl::desc("Check floating-point return values")  ,
cl::Hidden   
)
static

◆ ClCheckStores

cl::opt< bool > ClCheckStores("nsan-check-stores", cl::init(true), cl::desc("Check floating-point stores"), cl::Hidden) ( "nsan-check-stores"  ,
cl::init(true ,
cl::desc("Check floating-point stores")  ,
cl::Hidden   
)
static

◆ ClInstrumentFCmp

cl::opt< bool > ClInstrumentFCmp("nsan-instrument-fcmp", cl::init(true), cl::desc("Instrument floating-point comparisons"), cl::Hidden) ( "nsan-instrument-fcmp"  ,
cl::init(true ,
cl::desc("Instrument floating-point comparisons")  ,
cl::Hidden   
)
static

◆ ClPropagateNonFTConstStoresAsFT

cl::opt< bool > ClPropagateNonFTConstStoresAsFT("nsan-propagate-non-ft-const-stores-as-ft", cl::desc( "Propagate non floating-point const stores as floating point values." "For debugging purposes only"), cl::Hidden) ( "nsan-propagate-non-ft-const-stores-as-ft"  ,
cl::desc( "Propagate non floating-point const stores as floating point values." "For debugging purposes only")  ,
cl::Hidden   
)
static

◆ ClShadowMapping

cl::opt< std::string > ClShadowMapping("nsan-shadow-type-mapping", cl::init("dqq"), cl::desc("One shadow type id for each of `float`, `double`, `long double`. " "`d`,`l`,`q`,`e` mean double, x86_fp80, fp128 (quad) and " "ppc_fp128 (extended double) respectively. The default is to " "shadow `float` as `double`, and `double` and `x86_fp80` as " "`fp128`"), cl::Hidden) ( "nsan-shadow-type-mapping"  ,
cl::init("dqq")  ,
cl::desc("One shadow type id for each of `float`, `double`, `long double`. " "`d`,`l`,`q`,`e` mean double, x86_fp80, fp128 (quad) and " "ppc_fp128 (extended double) respectively. The default is to " "shadow `float` as `double`, and `double` and `x86_fp80` as " "`fp128`")  ,
cl::Hidden   
)
static

◆ ClTruncateFCmpEq

cl::opt< bool > ClTruncateFCmpEq("nsan-truncate-fcmp-eq", cl::init(true), cl::desc( "This flag controls the behaviour of fcmp equality comparisons." "For equality comparisons such as `x == 0.0f`, we can perform the " "shadow check in the shadow (`x_shadow == 0.0) == (x == 0.0f)`) or app " " domain (`(trunc(x_shadow) == 0.0f) == (x == 0.0f)`). This helps " "catch the case when `x_shadow` is accurate enough (and therefore " "close enough to zero) so that `trunc(x_shadow)` is zero even though " "both `x` and `x_shadow` are not"), cl::Hidden) ( "nsan-truncate-fcmp-eq"  ,
cl::init(true ,
cl::desc("This flag controls the behaviour of fcmp equality comparisons." "For equality comparisons such as `x == 0.0f`, we can perform the " "shadow check in the shadow (`x_shadow == 0.0) == (x == 0.0f)`) or app " " domain (`(trunc(x_shadow) == 0.0f) == (x == 0.0f)`). This helps " "catch the case when `x_shadow` is accurate enough (and therefore " "close enough to zero) so that `trunc(x_shadow)` is zero even though " "both `x` and `x_shadow` are not"   
)
static

◆ kMaxNumArgs

constexpr int kMaxNumArgs = 128
constexpr

Definition at line 144 of file NumericalStabilitySanitizer.cpp.

◆ kMaxShadowTypeSizeBytes

constexpr int kMaxShadowTypeSizeBytes = 16
constexpr

Definition at line 145 of file NumericalStabilitySanitizer.cpp.

◆ kMaxVectorWidth

constexpr int kMaxVectorWidth = 8
constexpr

Definition at line 143 of file NumericalStabilitySanitizer.cpp.

◆ kShadowScale

constexpr int kShadowScale = 2
constexpr

Definition at line 142 of file NumericalStabilitySanitizer.cpp.