Thanks to visit codestin.com
Credit goes to llvm.org

LLVM 22.0.0git
NumericalStabilitySanitizer.cpp File Reference

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)
static uint64_t GetMemOpSize (Value *V)

Variables

static cl::opt< std::stringClShadowMapping ("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::stringClCheckFunctionsFilter ("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 47 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

Referenced by moveFastMathFlags().

Enumeration Type Documentation

◆ ContinuationType

enum class ContinuationType
strong
Enumerator
ContinueWithShadow 
ResumeFromValue 

Definition at line 888 of file NumericalStabilitySanitizer.cpp.

Function Documentation

◆ createThreadLocalGV()

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

◆ getIntrinsicFromLibfunc()

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

◆ GetMemOpSize()

uint64_t GetMemOpSize ( Value * V)
static

Definition at line 2183 of file NumericalStabilitySanitizer.cpp.

References llvm::CallingConv::C, and llvm::dyn_cast().

◆ kNsanInitName()

StringLiteral kNsanInitName ( "__nsan_init" )
constexpr

◆ kNsanModuleCtorName()

StringLiteral kNsanModuleCtorName ( "nsan.module_ctor" )
constexpr

◆ makeDoubleDouble()

FunctionType * makeDoubleDouble ( LLVMContext & C)
static

◆ makeDoubleDoubleDouble()

FunctionType * makeDoubleDoubleDouble ( LLVMContext & C)
static

◆ makeDoubleDoubleDoubleDouble()

FunctionType * makeDoubleDoubleDoubleDouble ( LLVMContext & C)
static

◆ makeDoubleDoubleI32()

◆ makeX86FP80X86FP80()

FunctionType * makeX86FP80X86FP80 ( LLVMContext & C)
static

◆ makeX86FP80X86FP80I32()

◆ makeX86FP80X86FP80X86FP80()

FunctionType * makeX86FP80X86FP80X86FP80 ( LLVMContext & C)
static

◆ makeX86FP80X86FP80X86FP80X86FP80()

FunctionType * makeX86FP80X86FP80X86FP80X86FP80 ( LLVMContext & C)
static

◆ moveFastMathFlags()

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

Definition at line 2015 of file NumericalStabilitySanitizer.cpp.

References F, llvm::CallingConv::Fast, I, llvm::isa(), and MOVE_FLAG.

◆ shouldCheckArgs()

◆ 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

int kMaxNumArgs = 128
constexpr

Definition at line 140 of file NumericalStabilitySanitizer.cpp.

◆ kMaxShadowTypeSizeBytes

int kMaxShadowTypeSizeBytes = 16
constexpr

Definition at line 141 of file NumericalStabilitySanitizer.cpp.

◆ kMaxVectorWidth

int kMaxVectorWidth = 8
constexpr

Definition at line 139 of file NumericalStabilitySanitizer.cpp.

◆ kShadowScale

int kShadowScale = 2
constexpr

Definition at line 138 of file NumericalStabilitySanitizer.cpp.