class FortifiedLibCallSimplifier

Declaration

class FortifiedLibCallSimplifier { /* full declaration omitted */ };

Description

This class implements simplifications for calls to fortified library functions (__st*cpy_chk, __memcpy_chk, __memmove_chk, __memset_chk), to, when possible, replace them with their non-checking counterparts. Other optimizations can also be done, but it's possible to disable them and only simplify needless use of the checking versions (when the object size is unknown) by passing true for OnlyLowerUnknownSize.

Declared at: llvm/include/llvm/Transforms/Utils/SimplifyLibCalls.h:38

Member Variables

private const llvm::TargetLibraryInfo* TLI
private bool OnlyLowerUnknownSize

Method Overview

  • public FortifiedLibCallSimplifier(const llvm::TargetLibraryInfo * TLI, bool OnlyLowerUnknownSize = false)
  • private bool isFortifiedCallFoldable(llvm::CallInst * CI, unsigned int ObjSizeOp, Optional<unsigned int> SizeOp = None, Optional<unsigned int> StrOp = None, Optional<unsigned int> FlagsOp = None)
  • public llvm::Value * optimizeCall(llvm::CallInst * CI, llvm::IRBuilderBase & B)
  • private llvm::Value * optimizeMemCCpyChk(llvm::CallInst * CI, llvm::IRBuilderBase & B)
  • private llvm::Value * optimizeMemCpyChk(llvm::CallInst * CI, llvm::IRBuilderBase & B)
  • private llvm::Value * optimizeMemMoveChk(llvm::CallInst * CI, llvm::IRBuilderBase & B)
  • private llvm::Value * optimizeMemPCpyChk(llvm::CallInst * CI, llvm::IRBuilderBase & B)
  • private llvm::Value * optimizeMemSetChk(llvm::CallInst * CI, llvm::IRBuilderBase & B)
  • private llvm::Value * optimizeSNPrintfChk(llvm::CallInst * CI, llvm::IRBuilderBase & B)
  • private llvm::Value * optimizeSPrintfChk(llvm::CallInst * CI, llvm::IRBuilderBase & B)
  • private llvm::Value * optimizeStrCatChk(llvm::CallInst * CI, llvm::IRBuilderBase & B)
  • private llvm::Value * optimizeStrLCat(llvm::CallInst * CI, llvm::IRBuilderBase & B)
  • private llvm::Value * optimizeStrLCpyChk(llvm::CallInst * CI, llvm::IRBuilderBase & B)
  • private llvm::Value * optimizeStrLenChk(llvm::CallInst * CI, llvm::IRBuilderBase & B)
  • private llvm::Value * optimizeStrNCatChk(llvm::CallInst * CI, llvm::IRBuilderBase & B)
  • private llvm::Value * optimizeStrpCpyChk(llvm::CallInst * CI, llvm::IRBuilderBase & B, llvm::LibFunc Func)
  • private llvm::Value * optimizeStrpNCpyChk(llvm::CallInst * CI, llvm::IRBuilderBase & B, llvm::LibFunc Func)
  • private llvm::Value * optimizeVSNPrintfChk(llvm::CallInst * CI, llvm::IRBuilderBase & B)
  • private llvm::Value * optimizeVSPrintfChk(llvm::CallInst * CI, llvm::IRBuilderBase & B)

Methods

FortifiedLibCallSimplifier(
    const llvm::TargetLibraryInfo* TLI,
    bool OnlyLowerUnknownSize = false)

Declared at: llvm/include/llvm/Transforms/Utils/SimplifyLibCalls.h:44

Parameters

const llvm::TargetLibraryInfo* TLI
bool OnlyLowerUnknownSize = false

bool isFortifiedCallFoldable(
    llvm::CallInst* CI,
    unsigned int ObjSizeOp,
    Optional<unsigned int> SizeOp = None,
    Optional<unsigned int> StrOp = None,
    Optional<unsigned int> FlagsOp = None)

Description

Checks whether the call \p CI to a fortified libcall is foldable to the non-fortified version.

Declared at: llvm/include/llvm/Transforms/Utils/SimplifyLibCalls.h:91

Parameters

llvm::CallInst* CI
the call to the fortified libcall.
unsigned int ObjSizeOp
the index of the object size parameter of this chk function. Not optional since this is mandatory.
Optional<unsigned int> SizeOp = None
optionally set to the parameter index of an explicit buffer size argument. For instance, set to '2' for __strncpy_chk.
Optional<unsigned int> StrOp = None
optionally set to the parameter index of the source string parameter to strcpy-like functions, where only the strlen of the source will be writtin into the destination.
Optional<unsigned int> FlagsOp = None
optionally set to the parameter index of a 'flags' parameter. These are used by an implementation to opt-into stricter checking.

llvm::Value* optimizeCall(llvm::CallInst* CI,
                          llvm::IRBuilderBase& B)

Description

Take the given call instruction and return a more optimal value to replace the instruction with or 0 if a more optimal form can't be found. The call must not be an indirect call.

Declared at: llvm/include/llvm/Transforms/Utils/SimplifyLibCalls.h:51

Parameters

llvm::CallInst* CI
llvm::IRBuilderBase& B

llvm::Value* optimizeMemCCpyChk(
    llvm::CallInst* CI,
    llvm::IRBuilderBase& B)

Declared at: llvm/include/llvm/Transforms/Utils/SimplifyLibCalls.h:63

Parameters

llvm::CallInst* CI
llvm::IRBuilderBase& B

llvm::Value* optimizeMemCpyChk(
    llvm::CallInst* CI,
    llvm::IRBuilderBase& B)

Declared at: llvm/include/llvm/Transforms/Utils/SimplifyLibCalls.h:54

Parameters

llvm::CallInst* CI
llvm::IRBuilderBase& B

llvm::Value* optimizeMemMoveChk(
    llvm::CallInst* CI,
    llvm::IRBuilderBase& B)

Declared at: llvm/include/llvm/Transforms/Utils/SimplifyLibCalls.h:55

Parameters

llvm::CallInst* CI
llvm::IRBuilderBase& B

llvm::Value* optimizeMemPCpyChk(
    llvm::CallInst* CI,
    llvm::IRBuilderBase& B)

Declared at: llvm/include/llvm/Transforms/Utils/SimplifyLibCalls.h:62

Parameters

llvm::CallInst* CI
llvm::IRBuilderBase& B

llvm::Value* optimizeMemSetChk(
    llvm::CallInst* CI,
    llvm::IRBuilderBase& B)

Declared at: llvm/include/llvm/Transforms/Utils/SimplifyLibCalls.h:56

Parameters

llvm::CallInst* CI
llvm::IRBuilderBase& B

llvm::Value* optimizeSNPrintfChk(
    llvm::CallInst* CI,
    llvm::IRBuilderBase& B)

Declared at: llvm/include/llvm/Transforms/Utils/SimplifyLibCalls.h:64

Parameters

llvm::CallInst* CI
llvm::IRBuilderBase& B

llvm::Value* optimizeSPrintfChk(
    llvm::CallInst* CI,
    llvm::IRBuilderBase& B)

Declared at: llvm/include/llvm/Transforms/Utils/SimplifyLibCalls.h:65

Parameters

llvm::CallInst* CI
llvm::IRBuilderBase& B

llvm::Value* optimizeStrCatChk(
    llvm::CallInst* CI,
    llvm::IRBuilderBase& B)

Declared at: llvm/include/llvm/Transforms/Utils/SimplifyLibCalls.h:66

Parameters

llvm::CallInst* CI
llvm::IRBuilderBase& B

llvm::Value* optimizeStrLCat(
    llvm::CallInst* CI,
    llvm::IRBuilderBase& B)

Declared at: llvm/include/llvm/Transforms/Utils/SimplifyLibCalls.h:67

Parameters

llvm::CallInst* CI
llvm::IRBuilderBase& B

llvm::Value* optimizeStrLCpyChk(
    llvm::CallInst* CI,
    llvm::IRBuilderBase& B)

Declared at: llvm/include/llvm/Transforms/Utils/SimplifyLibCalls.h:69

Parameters

llvm::CallInst* CI
llvm::IRBuilderBase& B

llvm::Value* optimizeStrLenChk(
    llvm::CallInst* CI,
    llvm::IRBuilderBase& B)

Declared at: llvm/include/llvm/Transforms/Utils/SimplifyLibCalls.h:61

Parameters

llvm::CallInst* CI
llvm::IRBuilderBase& B

llvm::Value* optimizeStrNCatChk(
    llvm::CallInst* CI,
    llvm::IRBuilderBase& B)

Declared at: llvm/include/llvm/Transforms/Utils/SimplifyLibCalls.h:68

Parameters

llvm::CallInst* CI
llvm::IRBuilderBase& B

llvm::Value* optimizeStrpCpyChk(
    llvm::CallInst* CI,
    llvm::IRBuilderBase& B,
    llvm::LibFunc Func)

Description

Str/Stp cpy are similar enough to be handled in the same functions.

Declared at: llvm/include/llvm/Transforms/Utils/SimplifyLibCalls.h:59

Parameters

llvm::CallInst* CI
llvm::IRBuilderBase& B
llvm::LibFunc Func

llvm::Value* optimizeStrpNCpyChk(
    llvm::CallInst* CI,
    llvm::IRBuilderBase& B,
    llvm::LibFunc Func)

Declared at: llvm/include/llvm/Transforms/Utils/SimplifyLibCalls.h:60

Parameters

llvm::CallInst* CI
llvm::IRBuilderBase& B
llvm::LibFunc Func

llvm::Value* optimizeVSNPrintfChk(
    llvm::CallInst* CI,
    llvm::IRBuilderBase& B)

Declared at: llvm/include/llvm/Transforms/Utils/SimplifyLibCalls.h:70

Parameters

llvm::CallInst* CI
llvm::IRBuilderBase& B

llvm::Value* optimizeVSPrintfChk(
    llvm::CallInst* CI,
    llvm::IRBuilderBase& B)

Declared at: llvm/include/llvm/Transforms/Utils/SimplifyLibCalls.h:71

Parameters

llvm::CallInst* CI
llvm::IRBuilderBase& B