12 #ifndef TOOLS_PP_EXTRACT_PP_EXTRACT_H_
13 #define TOOLS_PP_EXTRACT_PP_EXTRACT_H_
15 #include "Utils/ADT/kvec.h"
16 #include "Utils/ADT/kvec_ext.h"
17 #include "Utils/StringUtils.h"
18 #include <llvm/IR/DebugInfo.h>
19 #include <llvm/Support/Allocator.h>
20 #include <unordered_map>
26 BumpPtrAllocator string_allocator;
29 StringRef synthesize_file_path(StringRef File, StringRef Dir,
30 kvec_str<initN> &path_result) {
33 StringRef path_have_root_name;
35 if (!sys::path::is_absolute(File)) {
38 path_result.fill(Dir.data(), Dir.size());
39 path_have_root_name = Dir;
41 path_have_root_name = File;
46 char input_bc_path_sep =
'/';
47 if (path_have_root_name.size() >= 3 && (path_have_root_name[1] ==
':') &&
48 (path_have_root_name[2] ==
'\\')) {
49 input_bc_path_sep =
'\\';
52 bool first_comp =
true;
53 for (sys::path::const_iterator it = sys::path::begin(File),
54 ie = sys::path::end(File);
55 it != ie; ++it, first_comp =
false) {
56 StringRef component = *it;
58 if (component ==
"..") {
59 int pos = path_result.rfind(input_bc_path_sep);
61 path_result.erase_substr(pos);
65 }
else if (component !=
".") {
73 if (component == sys::path::root_name(File)) {
80 size_t last_bslash = component.rfind(
"/");
81 if (last_bslash != StringRef::npos) {
82 component = component.substr(last_bslash);
95 if (!component.startswith(StringRef(&input_bc_path_sep, 1)) &&
96 (path_result.empty() || path_result.back() != input_bc_path_sep))
97 path_result.push_back(input_bc_path_sep);
100 path_result.append_str(component.data(), component.size());
106 StringRef file_name(path_result.c_str(), path_result.size());
107 file_name = hooked_format_str(string_allocator,
"%s", path_result.c_str());
111 std::unique_ptr<std::unordered_map<const Function *, StringRef>>
112 getFunctionSrcFiles(Module &M) {
114 auto pFuncSrcFileCache =
115 std::unique_ptr<std::unordered_map<const Function *, StringRef>>(
116 new std::unordered_map<const Function *, StringRef>());
119 DebugInfoFinder DbgFinder;
120 DbgFinder.processModule(M);
121 kvec_str<512> tmp_src_path;
124 auto it_func_range = DbgFinder.subprograms();
125 for (
auto it = it_func_range.begin(), ie = it_func_range.end(); it != ie;
127 const DISubprogram &f_loc = *it;
129 Function *F = f_loc.getFunction();
130 StringRef File = f_loc.getFilename();
131 StringRef Dir = f_loc.getDirectory();
132 if (File.data() && Dir.data()) {
133 (*pFuncSrcFileCache)[F] = synthesize_file_path(File, Dir, tmp_src_path);
135 (*pFuncSrcFileCache)[F] =
"";
138 return pFuncSrcFileCache;
SEGRegionNode * findUnitRegion(SEGNodeBase *cond_node, bool cond) const
Return nullptr if the node does not exist.
Definition: SymbolicExprGraph.cpp:1213
Definition: SEGStoreMemNode.h:23
std::map< const SEGSiteBase *, std::set< const SEGOperandNode * > > Sources
Taint sources.
Definition: SailfishFunctionChecker.h:56
SymbolicExprGraph * getOrCreateSymbolicExprGraph(Function *F)
Definition: SymbolicExprGraphBuilder.cpp:1354
void dot(const char *FileName) const
Dot this graph to a file with filename.
Definition: SymbolicExprGraph.cpp:891
Definition: SEGArgumentNode.h:89
Definition: SailfishParamSummaryBuilder.h:13
Definition: SEGPhiNode.h:33
const std::set< CDGCond > * getBlockCond(BasicBlock *BB) const
Definition: SymbolicExprGraph.h:1235
Definition: BotUpParallelPass.h:187
@ CK_FUGE
1 0 1 1 True if unordered, greater than, or equal
Definition: SymbolicExprGraph.h:583
Definition: SymbolicExprGraph.h:456
void inlineCalleeSummaryEndWithReturn(const SEGCallSite *CS, TraceSummary *Smry, const SEGCallSiteOutputNode *CallSiteOutput, Vulnerability::ValueSitePairType Src, unsigned InlineDepth, int Case=0)
Definition: SailfishFunctionChecker.cpp:1221
SymbolicExprGraph * buildSymbolicExprGraph(Function &F)
It undertakes real SEG construction job for the function F.
Definition: OCValueFlowBuilder.cpp:69
Definition: SEGArgumentNode.h:121
SEGOpcodeNode * modelGEPOperator(GEPOperator *GEP, BasicBlock *B, SymbolicExprGraph *G)
Model GEP operator.
Definition: OCValueFlowBuilder.cpp:640
@ CK_FOGE
0 0 1 1 True if ordered and greater than or equal
Definition: SymbolicExprGraph.h:575
virtual SMTExprVec getPhiGated(const SEGPhiNode *PhiNode, const SEGPhiNode::IncomeNode InNode, void *Args=nullptr)
Definition: SymbolicExprGraphSolver.cpp:1187
@ CK_ISGT
signed greater than
Definition: SymbolicExprGraph.h:596
std::pair< const SEGOperandNode *, const SEGSiteBase * > ValueSitePairType
Definition: Vulnerability.h:90
@ CK_FOEq
0 0 0 1 True if ordered and equal
Definition: SymbolicExprGraph.h:573
virtual void dot(raw_fd_ostream &O) const
Dot its self to the given output stream.
Definition: SEGBinaryWithIntConstNode.cpp:38
Definition: SEGCallSiteOutputNode.h:19
Definition: SEGSimpleOpcodeNode.h:18
virtual bool internallyDepends(unsigned TaskAID, unsigned TaskBID)=0
Definition: SEGCallSite.h:52
SEGOpcodeNode::CodeKind getOpcode(int LLVMInstOpcode, int Predicate=0)
Definition: OCValueFlowBuilder.cpp:500
std::map< const SEGReturnNode *, SymbolicSummary * > RetValSummaryMap
Recording the symbolic summary of each return node.
Definition: SummaryMapper.h:34
@ CK_FOrd
0 1 1 1 True if ordered (no nans)
Definition: SymbolicExprGraph.h:579
void dot(raw_fd_ostream &O) const override
Dot its self to the given output stream.
Definition: SymbolicExprGraph.cpp:345
@ CK_FONE
0 1 1 0 True if ordered and operands are unequal
Definition: SymbolicExprGraph.h:578
Definition: SymbolicExprGraphBuilder.cpp:1379
CodeKind
Definition: SymbolicExprGraph.h:522
@ CK_FOLE
0 1 0 1 True if ordered and less than or equal
Definition: SymbolicExprGraph.h:577
Definition: SailfishStateBuilder.h:12
Definition: SEGCallSiteArgumentSummaryNode.h:17
Definition: SEGMapBase.h:20
Definition: SEGCastNode.h:18
void search(const SEGNodeBase *CurrentNode, const SEGNodeBase *PreviousNode, Vulnerability::ValueSitePairType Src, unsigned InlineDepth)
Definition: SailfishFunctionChecker.cpp:143
Definition: SEGArgumentNode.h:42
@ CK_FULT
1 1 0 0 True if unordered or less than
Definition: SymbolicExprGraph.h:584
std::unordered_map< std::string, const SEGNodeBase * > NodeSymbolNameMap
map the symbol name used by Z3 in context ctx to the SEG node
Definition: SymbolicExprGraphSolver.h:54
virtual SMTExprVec getDataDeps(const SEGNodeBase *N, void *Args=nullptr)
Model node n's data dependence.
Definition: SymbolicExprGraphSolver.cpp:144
Definition: SymbolicExprGraph.h:707
void processUseSite(Vulnerability::ValueSitePairType Src, const SEGOperandNode *Node, const SEGSiteBase *UseSite, Vulnerability::SiteType USTy, unsigned InlineDepth)
It processes use sites according to the type of use sites.
Definition: SailfishFunctionChecker.cpp:605
SMTExpr encodeOpcodeNode(const SEGOpcodeNode *N)
Definition: SymbolicExprGraphSolver.cpp:240
@ CK_ISLE
signed less or equal
Definition: SymbolicExprGraph.h:599
@ CK_IULT
unsigned less than
Definition: SymbolicExprGraph.h:594
Definition: SEGCallSiteOutputNode.h:50
bool inlineReturnSymbolicSummary(const SEGCallSiteOutputNode *Symbol)
Definition: SailfishFunctionChecker.cpp:854
SEGOperandNode * modelConstantExpr(ConstantExpr *CE, SymbolicExprGraph *SEG)
Model constant expr.
Definition: OCValueFlowBuilder.cpp:751
void inlineCalleeSummaryStartWithParam(const SEGCallSite *CS, TraceSummary *Smry, Vulnerability::ValueSitePairType Src, const SEGOperandNode *ActualNode, unsigned InlineDepth, int Case=0)
Definition: SailfishFunctionChecker.cpp:1117
SummaryMapper * SailfishSummaryMapper
Definition: SummaryMapper.h:38
SailfishSummary * Smry
the summary of this function
Definition: SailfishFunctionChecker.h:31
@ CK_IULE
unsigned less or equal
Definition: SymbolicExprGraph.h:595
SEGNodeBase(SEGObjectKind K, Type *Ty, SymbolicExprGraph *SEG, BasicBlock *BB, bool fromDisk)
Definition: SymbolicExprGraph.cpp:161
bool toCheck(const Function *Func)
return true if the function should be in the dependence graph
Definition: BotUpParallelPass.h:238
SEGOperandNode(SEGObjectKind K, Type *Ty, SymbolicExprGraph *SEG, BasicBlock *BB, bool fromDisk)
A node whose value which will be set to null.
Definition: SymbolicExprGraph.cpp:223
SiteType
Definition: Vulnerability.h:58
Definition: SailfishSrcWpSummaryBuilder.h:13
@ CK_IEq
equal
Definition: SymbolicExprGraph.h:590
Definition: SEGArgumentNode.h:18
void addCachedConstraintsToSummary(SummaryBase *S)
Add the cached constraints to build summary.
Definition: SailfishFunctionChecker.cpp:129
Definition: SEGCallSiteReturnSummaryNode.h:20
Definition: SEGSimpleSite.h:75
Definition: SEGSimpleSite.h:32
Definition: SymbolicExprGraph.h:726
std::shared_ptr< Vulnerability > TSV
The vulnerability instance.
Definition: SailfishFunctionChecker.h:53
std::set< TraceSummary * > ErSrcSummarySet
Recording value-flow summaries starting from an error-specific source.
Definition: SummaryMapper.h:24
SMTExprVec getCtrlDeps(const SEGNodeBase *N, void *Args=nullptr)
Get the condition of paths reaching node n.
Definition: SymbolicExprGraphSolver.cpp:84
@ CK_IUGT
unsigned greater than
Definition: SymbolicExprGraph.h:592
Value * getValue()
Get Value.
Definition: SEGValue.h:66
Definition: SEGReturnNode.h:56
virtual SMTExprVec getCtrlDeps(BasicBlock *B, const SymbolicExprGraph *G, void *Args=nullptr)
Definition: SymbolicExprGraphSolver.cpp:1176
SEGOperandNode * findNode(Value *) const
Definition: SymbolicExprGraph.cpp:790
virtual bool externallyDepends(unsigned CallerTaskID, unsigned CalleeTaskID)=0
Definition: SailfishErSrcSummaryBuilder.h:13
virtual SMTExprVec getDeps(const SEGNodeBase *N, const SEGNodeBase *M)
Definition: SymbolicExprGraphSolver.cpp:1445
@ CK_FUno
1 0 0 0 True if unordered: isnan(X) | isnan(Y)
Definition: SymbolicExprGraph.h:580
std::unordered_map< const SEGNodeBase *, SMTExpr > NodeExprMap
each node in seg is a z3 variable
Definition: SymbolicExprGraphSolver.h:51
virtual bool internallyDepends(unsigned TaskAID, unsigned TaskBID) override
Definition: SailfishChecker.cpp:226
Definition: SymbolicExprGraphBuilder.h:37
void downstreamSearch(const SEGNodeBase *CurrentNode, const SEGNodeBase *PreviousNode, Vulnerability::ValueSitePairType Src, unsigned InlineDepth)
Definition: SailfishFunctionChecker.cpp:323
Definition: SEGReturnSite.h:18
void addIncomeValue(SEGNodeBase *InValue, BasicBlock *BB, SEGNodeBase *condValue, bool Cond)
Add a incoming edge during construction.
Definition: SEGPhiNode.h:60
@ CK_ISGE
signed greater or equal
Definition: SymbolicExprGraph.h:597
Definition: SymbolicExprGraph.h:76
virtual std::pair< SMTExprVec, SMTExprVec > getCtrlDepsPair(BasicBlock *B, const SymbolicExprGraph *G, void *Args=nullptr)
Definition: SymbolicExprGraphSolver.h:79
@ CK_IUGE
unsigned greater or equal
Definition: SymbolicExprGraph.h:593
SEGRegionNode * findOrRegion(SEGRegionNode *region1, SEGRegionNode *region2) const
Return nullptr if the node does not exist.
Definition: SymbolicExprGraph.cpp:1271
virtual void dot(raw_fd_ostream &O) const
Dot its self to the given output stream.
Definition: SEGCastNode.cpp:36
SEGOperandNode * findOrCreateNode(SymbolicExprGraph *SEG, Value *V)
Find or create a node in SEG.
Definition: OCValueFlowBuilder.cpp:915
SEGOperandNode * getNode(Value *val)
Return the SEG node of a value.
Definition: SymbolicExprGraphBuilder.cpp:1490
virtual bool externallyDepends(unsigned CallerTaskID, unsigned CalleeTaskID) override
Definition: SailfishChecker.cpp:234
Definition: cb-check.cpp:344
Definition: SEGValue.h:38
Definition: SEGPhiNode.h:28
@ CK_FOGT
0 0 1 0 True if ordered and greater than
Definition: SymbolicExprGraph.h:574
@ CK_FUEq
1 0 0 1 True if unordered or equal
Definition: SymbolicExprGraph.h:581
int checkUseSite(const SEGOperandNode *Node, const SEGSiteBase *UseSite, std::unordered_map< const BasicBlock *, SMTSolver::SMTResultType > &, bool UpdateCache)
Definition: SailfishFunctionChecker.cpp:541
Definition: SEGRegionNode.h:34
Type * getLLVMType() const
get the type size of the node
Definition: SymbolicExprGraph.h:284
@ CK_ISLT
signed less than
Definition: SymbolicExprGraph.h:598
void modelIntrinsics(CallSite CS, SymbolicExprGraph *G)
Model intrinsics CS in the SEG G of a function.
Definition: OCValueFlowBuilder.cpp:866
virtual SMTExprVec getDataDeps(const SEGNodeBase *N, void *Args=nullptr)
Definition: SymbolicExprGraphSolver.cpp:1195
const DomTree * DT
dom tree and post-dom tree
Definition: SailfishFunctionChecker.h:34
Definition: SEGSimpleOperandNode.h:19
@ CK_FULE
1 1 0 1 True if unordered, less than, or equal
Definition: SymbolicExprGraph.h:585
SEGRegionNode * findAndRegion(SEGRegionNode *region1, SEGRegionNode *region2) const
Return nullptr if the node does not exist.
Definition: SymbolicExprGraph.cpp:1231
std::set< TraceSummary * > CSOutSummarySet
Recording value-flow summaries starting from a call-site output.
Definition: SummaryMapper.h:31
virtual bool releaseMemory(Function &F) override
Definition: SailfishChecker.cpp:249
void modelInstruction(Instruction &I, BasicBlock *B, SymbolicExprGraph *SEG)
Model instructions.
Definition: OCValueFlowBuilder.cpp:138
Timer * TimeChecker
Definition: SailfishFunctionChecker.h:50
@ CK_FUGT
1 0 1 0 True if unordered or greater than
Definition: SymbolicExprGraph.h:582
Definition: SEGCallSiteOutputNode.h:76
virtual std::pair< SMTExprVec, SMTExprVec > getDepsPair(const SEGNodeBase *N, const SEGNodeBase *M)
Definition: SymbolicExprGraphSolver.cpp:1080
void dot(raw_fd_ostream &O) const override
Dot its self to the given output stream.
Definition: SEGStoreMemNode.cpp:66
@ CK_FTrue
1 1 1 1 Always true (always folded)
Definition: SymbolicExprGraph.h:587
void dot(raw_fd_ostream &O) const
Dot its self to the given output stream.
Definition: SEGPhiNode.cpp:37
@ CK_FUNE
1 1 1 0 True if unordered or not equal
Definition: SymbolicExprGraph.h:586
void dot(raw_fd_ostream &O) const
Dot its self to the given output stream.
Definition: SEGLoadMemNode.cpp:48
Definition: SailfishChecker.h:42
Definition: SEGReturnNode.h:76
Definition: SailfishCSOutSummaryBuilder.h:13
void matchFormalActual(SummaryBase *Smry, const SEGCallSite *CS, std::unordered_map< std::string, SMTExpr > &)
Add constraints: "formal == actual".
Definition: SailfishFunctionChecker.cpp:788
Definition: SymbolicExprGraph.h:519
SailfishStateBuilder * StateBuilder
Definition: SailfishFunctionChecker.h:46
Definition: BotUpParallelPass.h:21
Definition: SEGSimpleSite.h:90
Definition: SailfishFunctionChecker.h:22
const SymbolicExprGraph * SEG
the symbolic expr graph IR
Definition: SailfishFunctionChecker.h:37
SiteTy * findSite(Instruction *I) const
Definition: SymbolicExprGraph.h:1176
void validate()
validate this is a DAG
Definition: SymbolicExprGraph.cpp:1015
Definition: SailfishChecker.h:37
Definition: SymbolicExprGraph.h:663
The return node.
Definition: SEGReturnNode.h:25
Definition: SEGSimpleSite.h:103
Function * F
current function
Definition: SailfishFunctionChecker.h:28
std::set< TraceSummary * > SrcWpSummarySet
Definition: SummaryMapper.h:28
SEGRegionNode * findNotRegion(SEGRegionNode *region1) const
Return nullptr if the node does not exist.
Definition: SymbolicExprGraph.cpp:1315
bool isFuncBuildable(const Function *F) const
Check the function is suitable for SEGBuilder.
Definition: SEGMapBase.cpp:49
virtual void dot(raw_fd_ostream &O) const
Dot its self to the given output stream.
Definition: SymbolicExprGraph.cpp:377
std::unordered_map< const Function *, SymbolicExprGraph * > SEGMap
SEG vector of functions.
Definition: SEGMapBase.h:23
Definition: BotUpParallelPass.h:163
virtual SMTExprVec getDeps(const SEGNodeBase *N, const SEGNodeBase *M)
Definition: SymbolicExprGraphSolver.cpp:1013
@ CK_INE
not equal
Definition: SymbolicExprGraph.h:591
Definition: SEGSimpleSite.h:141
Definition: SummaryMapper.h:41
virtual bool releaseMemory(Function &F)=0
Definition: SEGLoadMemNode.h:21
The node base of symbolic expression graph.
Definition: SymbolicExprGraph.h:244
std::set< TraceSummary * > ParamSummarySet
Recording value-flow summaries starting from a function parameter.
Definition: SummaryMapper.h:21
Various summaries generated for each function in pipelined PSA checker.
Definition: SummaryMapper.h:19
Definition: SEGBinaryWithIntConstNode.h:19
@ CK_FOLT
0 1 0 0 True if ordered and less than
Definition: SymbolicExprGraph.h:576
Definition: SailfishRetValSummaryBuilder.h:13
void collectVarMapping(const std::vector< SummaryCacheItem > &ConstraintsCache, std::string Suffix, std::unordered_map< std::string, SMTExpr > &VariableMapping)
Definition: SailfishFunctionChecker.cpp:110
@ CK_FFalse
0 0 0 0 Always false (always folded)
Definition: SymbolicExprGraph.h:572
Definition: SEGTrace.h:21
SailfishChecker * Parent
the parent checker
Definition: SailfishFunctionChecker.h:25
SEGOpcodeNode(SEGObjectKind K, CodeKind Opcode, Type *Ty, SymbolicExprGraph *SEG, BasicBlock *BB, bool fromDisk)
This constructor will set the field Inst as nullptr.
Definition: SymbolicExprGraph.cpp:366