svf-tools 1.0.618 → 1.0.620
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/SVF-doxygen/html/html/AndersenSCD_8cpp_source.html +2 -2
- package/SVF-doxygen/html/html/Andersen_8cpp_source.html +8 -8
- package/SVF-doxygen/html/html/Andersen_8h_source.html +4 -3
- package/SVF-doxygen/html/html/CFLAlias_8cpp_source.html +3 -3
- package/SVF-doxygen/html/html/CFLBase_8cpp_source.html +4 -4
- package/SVF-doxygen/html/html/CFLGraphBuilder_8cpp_source.html +2 -2
- package/SVF-doxygen/html/html/CFLVF_8cpp_source.html +3 -3
- package/SVF-doxygen/html/html/CHGBuilder_8cpp_source.html +2 -2
- package/SVF-doxygen/html/html/CommandLine_8h.html +129 -0
- package/SVF-doxygen/html/html/CommandLine_8h_source.html +132 -0
- package/SVF-doxygen/html/html/ConsGNode_8h_source.html +5 -5
- package/SVF-doxygen/html/html/ConsG_8cpp_source.html +4 -4
- package/SVF-doxygen/html/html/ContextDDA_8cpp_source.html +2 -2
- package/SVF-doxygen/html/html/DCHG_8cpp_source.html +2 -2
- package/SVF-doxygen/html/html/DDAPass_8cpp_source.html +20 -19
- package/SVF-doxygen/html/html/DDAPass_8h_source.html +9 -9
- package/SVF-doxygen/html/html/DoubleFreeChecker_8cpp_source.html +2 -2
- package/SVF-doxygen/html/html/FSMPTA_8cpp_source.html +6 -6
- package/SVF-doxygen/html/html/FlowDDA_8cpp_source.html +1 -1
- package/SVF-doxygen/html/html/FlowSensitive_8cpp_source.html +7 -7
- package/SVF-doxygen/html/html/ICFGBuilder_8cpp_source.html +1 -1
- package/SVF-doxygen/html/html/ICFG_8cpp_source.html +2 -2
- package/SVF-doxygen/html/html/IRGraph_8cpp_source.html +2 -2
- package/SVF-doxygen/html/html/LLVMLoopAnalysis_8cpp_source.html +2 -2
- package/SVF-doxygen/html/html/LLVMModule_8cpp_source.html +21 -20
- package/SVF-doxygen/html/html/LLVMModule_8h_source.html +17 -17
- package/SVF-doxygen/html/html/LLVMUtil_8cpp_source.html +2 -2
- package/SVF-doxygen/html/html/LeakChecker_8cpp_source.html +2 -2
- package/SVF-doxygen/html/html/LockResultValidator_8cpp_source.html +2 -2
- package/SVF-doxygen/html/html/MHP_8cpp_source.html +2 -2
- package/SVF-doxygen/html/html/MTAAnnotator_8cpp_source.html +3 -3
- package/SVF-doxygen/html/html/MTAResultValidator_8cpp_source.html +2 -2
- package/SVF-doxygen/html/html/MTAStat_8cpp_source.html +2 -2
- package/SVF-doxygen/html/html/MTA_8cpp_source.html +1 -1
- package/SVF-doxygen/html/html/MemRegion_8cpp_source.html +2 -2
- package/SVF-doxygen/html/html/MemSSA_8cpp_source.html +3 -3
- package/SVF-doxygen/html/html/NodeIDAllocator_8cpp_source.html +6 -6
- package/SVF-doxygen/html/html/Options_8cpp.html +1 -0
- package/SVF-doxygen/html/html/Options_8cpp_source.html +123 -119
- package/SVF-doxygen/html/html/Options_8h.html +1 -1
- package/SVF-doxygen/html/html/Options_8h_source.html +124 -120
- package/SVF-doxygen/html/html/PCG_8cpp.html +2 -1
- package/SVF-doxygen/html/html/PCG_8cpp_source.html +13 -12
- package/SVF-doxygen/html/html/PCG_8h_source.html +12 -12
- package/SVF-doxygen/html/html/PointerAnalysisImpl_8cpp_source.html +4 -4
- package/SVF-doxygen/html/html/PointerAnalysis_8cpp_source.html +13 -13
- package/SVF-doxygen/html/html/PointsTo_8cpp_source.html +1 -1
- package/SVF-doxygen/html/html/SVFGBuilder_8cpp_source.html +5 -5
- package/SVF-doxygen/html/html/SVFGOPT_8cpp_source.html +5 -5
- package/SVF-doxygen/html/html/SVFG_8cpp_source.html +4 -4
- package/SVF-doxygen/html/html/SVFIR2ItvExeState_8cpp_source.html +2 -2
- package/SVF-doxygen/html/html/SVFIRBuilder_8cpp_source.html +4 -3
- package/SVF-doxygen/html/html/SVFIRBuilder_8h_source.html +1 -1
- package/SVF-doxygen/html/html/SVFIR_8cpp_source.html +5 -4
- package/SVF-doxygen/html/html/SVFStat_8cpp_source.html +3 -3
- package/SVF-doxygen/html/html/SVFStatements_8cpp_source.html +2 -2
- package/SVF-doxygen/html/html/SVFType_8h.html +2 -2
- package/SVF-doxygen/html/html/SVFUtil_8cpp_source.html +2 -2
- package/SVF-doxygen/html/html/SVFVariables_8cpp_source.html +2 -2
- package/SVF-doxygen/html/html/SaberCondAllocator_8cpp_source.html +2 -2
- package/SVF-doxygen/html/html/SrcSnkDDA_8cpp_source.html +5 -5
- package/SVF-doxygen/html/html/SymbolTableBuilder_8cpp_source.html +7 -7
- package/SVF-doxygen/html/html/SymbolTableInfo_8cpp_source.html +4 -4
- package/SVF-doxygen/html/html/TCT_8cpp_source.html +2 -2
- package/SVF-doxygen/html/html/TypeAnalysis_8cpp_source.html +2 -2
- package/SVF-doxygen/html/html/VFG_8cpp_source.html +2 -2
- package/SVF-doxygen/html/html/VersionedFlowSensitive_8cpp_source.html +4 -4
- package/SVF-doxygen/html/html/WPAPass_8cpp_source.html +10 -9
- package/SVF-doxygen/html/html/WPAPass_8h_source.html +4 -4
- package/SVF-doxygen/html/html/Z3Expr_8cpp_source.html +2 -2
- package/SVF-doxygen/html/html/annotated.html +6 -2
- package/SVF-doxygen/html/html/cfl_8cpp.html +3 -85
- package/SVF-doxygen/html/html/cfl_8cpp_source.html +3 -5
- package/SVF-doxygen/html/html/classOption-members.html +99 -0
- package/SVF-doxygen/html/html/classOption.html +567 -0
- package/SVF-doxygen/html/html/classOption.png +0 -0
- package/SVF-doxygen/html/html/classOptionBase-members.html +95 -0
- package/SVF-doxygen/html/html/classOptionBase.html +823 -0
- package/SVF-doxygen/html/html/classOptionBase.png +0 -0
- package/SVF-doxygen/html/html/classOptionMap-members.html +97 -0
- package/SVF-doxygen/html/html/classOptionMap.html +428 -0
- package/SVF-doxygen/html/html/classOptionMap.png +0 -0
- package/SVF-doxygen/html/html/classOptionMultiple-members.html +97 -0
- package/SVF-doxygen/html/html/classOptionMultiple.html +460 -0
- package/SVF-doxygen/html/html/classOptionMultiple.png +0 -0
- package/SVF-doxygen/html/html/classSVF_1_1AddrStmt.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1Andersen.html +16 -15
- package/SVF-doxygen/html/html/classSVF_1_1AndersenBase.html +9 -9
- package/SVF-doxygen/html/html/classSVF_1_1AndersenSCD.html +6 -6
- package/SVF-doxygen/html/html/classSVF_1_1BVDataPTAImpl.html +6 -6
- package/SVF-doxygen/html/html/classSVF_1_1BinaryOPStmt.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1BranchStmt.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1CFLAlias.html +6 -6
- package/SVF-doxygen/html/html/classSVF_1_1CFLBase.html +7 -7
- package/SVF-doxygen/html/html/classSVF_1_1CFLGraphBuilder.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1CFLNode.html +4 -4
- package/SVF-doxygen/html/html/classSVF_1_1CFLVF.html +5 -5
- package/SVF-doxygen/html/html/classSVF_1_1CHGBuilder.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1CallPE.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1CmpStmt.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1CondStdSet.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1ConstraintNode-members.html +26 -26
- package/SVF-doxygen/html/html/classSVF_1_1ConstraintNode.html +72 -72
- package/SVF-doxygen/html/html/classSVF_1_1ContextDDA.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1CopyStmt.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1CoreBitVector.html +8 -8
- package/SVF-doxygen/html/html/classSVF_1_1DCHGraph.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1DDAPass.html +36 -35
- package/SVF-doxygen/html/html/classSVF_1_1DoubleFreeChecker.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1ExeState.html +4 -4
- package/SVF-doxygen/html/html/classSVF_1_1FIObjVar.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1FlowDDA.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1FlowSensitive.html +11 -11
- package/SVF-doxygen/html/html/classSVF_1_1GenericNode.html +22 -8
- package/SVF-doxygen/html/html/classSVF_1_1GenericNode.png +0 -0
- package/SVF-doxygen/html/html/classSVF_1_1GepObjVar.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1GepStmt.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1GepValVar.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1ICFG.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1ICFGBuilder.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1IntervalExeState.html +8 -8
- package/SVF-doxygen/html/html/classSVF_1_1LLVMLoopAnalysis.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1LLVMModuleSet.html +73 -72
- package/SVF-doxygen/html/html/classSVF_1_1LeakChecker.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1LoadStmt.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1LockResultValidator.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1MHP.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1MRGenerator.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1MTA.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1MTAAnnotator.html +10 -10
- package/SVF-doxygen/html/html/classSVF_1_1MTAResultValidator.html +6 -6
- package/SVF-doxygen/html/html/classSVF_1_1MTASVFGBuilder.html +12 -12
- package/SVF-doxygen/html/html/classSVF_1_1MTAStat.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1MemSSA.html +4 -4
- package/SVF-doxygen/html/html/classSVF_1_1NodeIDAllocator.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1NodeIDAllocator_1_1Clusterer.html +8 -8
- package/SVF-doxygen/html/html/classSVF_1_1ObjTypeInfo.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1ObjVar.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1Options-members.html +120 -120
- package/SVF-doxygen/html/html/classSVF_1_1Options.html +613 -613
- package/SVF-doxygen/html/html/classSVF_1_1PCG.html +28 -28
- package/SVF-doxygen/html/html/classSVF_1_1PhiStmt.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1PointerAnalysis.html +18 -18
- package/SVF-doxygen/html/html/classSVF_1_1PointsTo.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1RaceResultValidator.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1RetPE.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1SVFG.html +3 -3
- package/SVF-doxygen/html/html/classSVF_1_1SVFGBuilder.html +7 -7
- package/SVF-doxygen/html/html/classSVF_1_1SVFGOPT.html +9 -9
- package/SVF-doxygen/html/html/classSVF_1_1SVFIR.html +9 -8
- package/SVF-doxygen/html/html/classSVF_1_1SVFIR2ItvExeState.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1SVFIRBuilder.html +18 -18
- package/SVF-doxygen/html/html/classSVF_1_1SVFStat.html +6 -6
- package/SVF-doxygen/html/html/classSVF_1_1SVFType.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1SaberCondAllocator.html +3 -3
- package/SVF-doxygen/html/html/classSVF_1_1SelectStmt.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1SrcSnkDDA.html +9 -9
- package/SVF-doxygen/html/html/classSVF_1_1StoreStmt.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1SymbolTableBuilder.html +11 -11
- package/SVF-doxygen/html/html/classSVF_1_1SymbolTableInfo.html +10 -10
- package/SVF-doxygen/html/html/classSVF_1_1TCT.html +4 -4
- package/SVF-doxygen/html/html/classSVF_1_1TDForkPE.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1TDJoinPE.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1TypeAnalysis.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1UnaryOPStmt.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1VFG.html +8 -8
- package/SVF-doxygen/html/html/classSVF_1_1ValVar.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1VersionedFlowSensitive.html +6 -6
- package/SVF-doxygen/html/html/classSVF_1_1WPAPass.html +27 -26
- package/SVF-doxygen/html/html/classSVF_1_1Z3Expr.html +6 -6
- package/SVF-doxygen/html/html/classes.html +113 -112
- package/SVF-doxygen/html/html/dda_8cpp.html +51 -248
- package/SVF-doxygen/html/html/dda_8cpp_source.html +9 -10
- package/SVF-doxygen/html/html/dir_95e22971b5dbae2382075a3453e365b4.html +2 -0
- package/SVF-doxygen/html/html/files.html +18 -17
- package/SVF-doxygen/html/html/functions_a.html +7 -7
- package/SVF-doxygen/html/html/functions_b.html +9 -6
- package/SVF-doxygen/html/html/functions_c.html +48 -46
- package/SVF-doxygen/html/html/functions_d.html +20 -17
- package/SVF-doxygen/html/html/functions_e.html +6 -3
- package/SVF-doxygen/html/html/functions_f.html +19 -16
- package/SVF-doxygen/html/html/functions_func_b.html +5 -2
- package/SVF-doxygen/html/html/functions_func_c.html +36 -30
- package/SVF-doxygen/html/html/functions_func_e.html +5 -2
- package/SVF-doxygen/html/html/functions_func_f.html +4 -1
- package/SVF-doxygen/html/html/functions_func_g.html +12 -6
- package/SVF-doxygen/html/html/functions_func_i.html +18 -7
- package/SVF-doxygen/html/html/functions_func_n.html +4 -1
- package/SVF-doxygen/html/html/functions_func_o.html +28 -13
- package/SVF-doxygen/html/html/functions_func_p.html +13 -4
- package/SVF-doxygen/html/html/functions_func_s.html +20 -19
- package/SVF-doxygen/html/html/functions_func_u.html +3 -0
- package/SVF-doxygen/html/html/functions_g.html +16 -10
- package/SVF-doxygen/html/html/functions_h.html +1 -1
- package/SVF-doxygen/html/html/functions_i.html +38 -23
- package/SVF-doxygen/html/html/functions_k.html +1 -1
- package/SVF-doxygen/html/html/functions_l.html +7 -7
- package/SVF-doxygen/html/html/functions_m.html +12 -12
- package/SVF-doxygen/html/html/functions_n.html +6 -2
- package/SVF-doxygen/html/html/functions_o.html +46 -25
- package/SVF-doxygen/html/html/functions_p.html +55 -33
- package/SVF-doxygen/html/html/functions_r.html +6 -6
- package/SVF-doxygen/html/html/functions_s.html +30 -29
- package/SVF-doxygen/html/html/functions_t.html +4 -4
- package/SVF-doxygen/html/html/functions_type_o.html +7 -0
- package/SVF-doxygen/html/html/functions_type_p.html +6 -0
- package/SVF-doxygen/html/html/functions_u.html +6 -3
- package/SVF-doxygen/html/html/functions_v.html +10 -8
- package/SVF-doxygen/html/html/functions_vars_a.html +7 -7
- package/SVF-doxygen/html/html/functions_vars_b.html +1 -1
- package/SVF-doxygen/html/html/functions_vars_c.html +12 -12
- package/SVF-doxygen/html/html/functions_vars_d.html +18 -15
- package/SVF-doxygen/html/html/functions_vars_e.html +2 -2
- package/SVF-doxygen/html/html/functions_vars_f.html +6 -6
- package/SVF-doxygen/html/html/functions_vars_g.html +2 -2
- package/SVF-doxygen/html/html/functions_vars_h.html +1 -1
- package/SVF-doxygen/html/html/functions_vars_i.html +10 -6
- package/SVF-doxygen/html/html/functions_vars_k.html +1 -1
- package/SVF-doxygen/html/html/functions_vars_l.html +4 -4
- package/SVF-doxygen/html/html/functions_vars_m.html +11 -11
- package/SVF-doxygen/html/html/functions_vars_n.html +3 -2
- package/SVF-doxygen/html/html/functions_vars_o.html +5 -2
- package/SVF-doxygen/html/html/functions_vars_p.html +28 -21
- package/SVF-doxygen/html/html/functions_vars_r.html +5 -5
- package/SVF-doxygen/html/html/functions_vars_s.html +10 -10
- package/SVF-doxygen/html/html/functions_vars_t.html +4 -4
- package/SVF-doxygen/html/html/functions_vars_u.html +3 -3
- package/SVF-doxygen/html/html/functions_vars_v.html +6 -4
- package/SVF-doxygen/html/html/functions_vars_w.html +3 -3
- package/SVF-doxygen/html/html/functions_w.html +11 -7
- package/SVF-doxygen/html/html/globals_d.html +4 -4
- package/SVF-doxygen/html/html/globals_e.html +6 -6
- package/SVF-doxygen/html/html/globals_f.html +2 -2
- package/SVF-doxygen/html/html/globals_func.html +6 -58
- package/SVF-doxygen/html/html/globals_i.html +4 -12
- package/SVF-doxygen/html/html/globals_l.html +2 -2
- package/SVF-doxygen/html/html/globals_r.html +4 -4
- package/SVF-doxygen/html/html/globals_s.html +0 -4
- package/SVF-doxygen/html/html/globals_type.html +3 -0
- package/SVF-doxygen/html/html/globals_u.html +3 -0
- package/SVF-doxygen/html/html/globals_vars.html +43 -12
- package/SVF-doxygen/html/html/hierarchy.html +197 -182
- package/SVF-doxygen/html/html/include_2MTA_2MTAResultValidator_8h_source.html +1 -1
- package/SVF-doxygen/html/html/menudata.js +1 -2
- package/SVF-doxygen/html/html/mta_8cpp.html +4 -47
- package/SVF-doxygen/html/html/mta_8cpp_source.html +4 -4
- package/SVF-doxygen/html/html/namespaceSVF_1_1SVFUtil.html +1 -1
- package/SVF-doxygen/html/html/saber_8cpp.html +38 -136
- package/SVF-doxygen/html/html/saber_8cpp_source.html +8 -7
- package/SVF-doxygen/html/html/search/all_1.js +7 -7
- package/SVF-doxygen/html/html/search/all_10.js +31 -26
- package/SVF-doxygen/html/html/search/all_11.js +8 -8
- package/SVF-doxygen/html/html/search/all_12.js +19 -20
- package/SVF-doxygen/html/html/search/all_13.js +7 -7
- package/SVF-doxygen/html/html/search/all_14.js +5 -4
- package/SVF-doxygen/html/html/search/all_15.js +6 -6
- package/SVF-doxygen/html/html/search/all_16.js +4 -4
- package/SVF-doxygen/html/html/search/all_2.js +2 -1
- package/SVF-doxygen/html/html/search/all_3.js +16 -14
- package/SVF-doxygen/html/html/search/all_4.js +18 -17
- package/SVF-doxygen/html/html/search/all_5.js +6 -5
- package/SVF-doxygen/html/html/search/all_6.js +9 -8
- package/SVF-doxygen/html/html/search/all_7.js +4 -2
- package/SVF-doxygen/html/html/search/all_8.js +1 -1
- package/SVF-doxygen/html/html/search/all_9.js +12 -9
- package/SVF-doxygen/html/html/search/all_b.js +2 -2
- package/SVF-doxygen/html/html/search/all_c.js +7 -7
- package/SVF-doxygen/html/html/search/all_d.js +12 -12
- package/SVF-doxygen/html/html/search/all_e.js +4 -3
- package/SVF-doxygen/html/html/search/all_f.js +24 -6
- package/SVF-doxygen/html/html/search/classes_c.js +15 -0
- package/SVF-doxygen/html/html/search/files_2.js +1 -0
- package/SVF-doxygen/html/html/search/functions_1.js +1 -0
- package/SVF-doxygen/html/html/search/functions_10.js +0 -2
- package/SVF-doxygen/html/html/search/functions_11.js +1 -2
- package/SVF-doxygen/html/html/search/functions_13.js +1 -0
- package/SVF-doxygen/html/html/search/functions_2.js +1 -0
- package/SVF-doxygen/html/html/search/functions_3.js +0 -2
- package/SVF-doxygen/html/html/search/functions_4.js +1 -3
- package/SVF-doxygen/html/html/search/functions_5.js +2 -1
- package/SVF-doxygen/html/html/search/functions_6.js +2 -0
- package/SVF-doxygen/html/html/search/functions_8.js +3 -1
- package/SVF-doxygen/html/html/search/functions_b.js +1 -1
- package/SVF-doxygen/html/html/search/functions_d.js +1 -0
- package/SVF-doxygen/html/html/search/functions_e.js +5 -1
- package/SVF-doxygen/html/html/search/functions_f.js +2 -0
- package/SVF-doxygen/html/html/search/typedefs_12.js +1 -1
- package/SVF-doxygen/html/html/search/typedefs_7.js +1 -1
- package/SVF-doxygen/html/html/search/typedefs_d.js +2 -0
- package/SVF-doxygen/html/html/search/typedefs_e.js +2 -0
- package/SVF-doxygen/html/html/search/variables_1.js +7 -7
- package/SVF-doxygen/html/html/search/variables_10.js +23 -21
- package/SVF-doxygen/html/html/search/variables_11.js +7 -5
- package/SVF-doxygen/html/html/search/variables_12.js +10 -10
- package/SVF-doxygen/html/html/search/variables_13.js +7 -7
- package/SVF-doxygen/html/html/search/variables_14.js +3 -3
- package/SVF-doxygen/html/html/search/variables_15.js +4 -4
- package/SVF-doxygen/html/html/search/variables_16.js +3 -3
- package/SVF-doxygen/html/html/search/variables_2.js +1 -1
- package/SVF-doxygen/html/html/search/variables_3.js +12 -12
- package/SVF-doxygen/html/html/search/variables_4.js +18 -15
- package/SVF-doxygen/html/html/search/variables_5.js +5 -2
- package/SVF-doxygen/html/html/search/variables_6.js +7 -6
- package/SVF-doxygen/html/html/search/variables_7.js +2 -2
- package/SVF-doxygen/html/html/search/variables_8.js +1 -1
- package/SVF-doxygen/html/html/search/variables_9.js +7 -6
- package/SVF-doxygen/html/html/search/variables_b.js +1 -1
- package/SVF-doxygen/html/html/search/variables_c.js +5 -4
- package/SVF-doxygen/html/html/search/variables_d.js +11 -11
- package/SVF-doxygen/html/html/search/variables_e.js +3 -3
- package/SVF-doxygen/html/html/search/variables_f.js +3 -2
- package/SVF-doxygen/html/html/structSVF_1_1DOTGraphTraits_3_01ConstraintGraph_01_5_01_4.html +4 -4
- package/SVF-doxygen/html/html/structSVF_1_1DOTGraphTraits_3_01IRGraph_01_5_01_4.html +1 -1
- package/SVF-doxygen/html/html/structSVF_1_1DOTGraphTraits_3_01SVFG_01_5_01_4.html +2 -2
- package/SVF-doxygen/html/html/structSVF_1_1GrammarBase_1_1Symbol.html +4 -4
- package/SVF-doxygen/html/html/svf-ex_8cpp.html +12 -55
- package/SVF-doxygen/html/html/svf-ex_8cpp_source.html +8 -8
- package/SVF-doxygen/html/html/tools_2MTA_2MTAResultValidator_8h_source.html +1 -1
- package/SVF-doxygen/html/html/wpa_8cpp.html +4 -47
- package/SVF-doxygen/html/html/wpa_8cpp_source.html +4 -4
- package/include/Util/CommandLine.h +527 -0
- package/include/Util/Options.h +124 -124
- package/include/WPA/Andersen.h +5 -5
- package/lib/AbstractExecution/SVFIR2ItvExeState.cpp +2 -2
- package/lib/CFL/CFLAlias.cpp +5 -5
- package/lib/CFL/CFLBase.cpp +4 -4
- package/lib/CFL/CFLGraphBuilder.cpp +2 -2
- package/lib/CFL/CFLVF.cpp +5 -5
- package/lib/CMakeLists.txt +8 -4
- package/lib/DDA/ContextDDA.cpp +1 -1
- package/lib/DDA/DDAPass.cpp +14 -13
- package/lib/DDA/FlowDDA.cpp +1 -1
- package/lib/Graphs/ConsG.cpp +10 -10
- package/lib/Graphs/ICFG.cpp +1 -1
- package/lib/Graphs/IRGraph.cpp +2 -2
- package/lib/Graphs/SVFG.cpp +5 -5
- package/lib/Graphs/SVFGOPT.cpp +5 -5
- package/lib/Graphs/VFG.cpp +1 -1
- package/lib/MSSA/MemRegion.cpp +2 -2
- package/lib/MSSA/MemSSA.cpp +4 -4
- package/lib/MSSA/SVFGBuilder.cpp +4 -4
- package/lib/MTA/FSMPTA.cpp +13 -13
- package/lib/MTA/MHP.cpp +1 -1
- package/lib/MTA/MTA.cpp +2 -2
- package/lib/MTA/MTAStat.cpp +1 -1
- package/lib/MTA/PCG.cpp +8 -2
- package/lib/MTA/TCT.cpp +2 -2
- package/lib/MemoryModel/PointerAnalysis.cpp +13 -13
- package/lib/MemoryModel/PointerAnalysisImpl.cpp +13 -13
- package/lib/MemoryModel/PointsTo.cpp +1 -1
- package/lib/SABER/DoubleFreeChecker.cpp +1 -1
- package/lib/SABER/LeakChecker.cpp +1 -1
- package/lib/SABER/SaberCondAllocator.cpp +1 -1
- package/lib/SABER/SrcSnkDDA.cpp +5 -5
- package/lib/SVF-LLVM/CHGBuilder.cpp +1 -1
- package/lib/SVF-LLVM/DCHG.cpp +1 -1
- package/lib/SVF-LLVM/LLVMLoopAnalysis.cpp +2 -2
- package/lib/SVF-LLVM/LLVMModule.cpp +10 -4
- package/lib/SVF-LLVM/SVFIRBuilder.cpp +8 -8
- package/lib/SVF-LLVM/SymbolTableBuilder.cpp +5 -5
- package/lib/SVFIR/SVFIR.cpp +4 -4
- package/lib/SVFIR/SVFStatements.cpp +16 -16
- package/lib/SVFIR/SVFVariables.cpp +5 -5
- package/lib/SVFIR/SymbolTableInfo.cpp +6 -6
- package/lib/Util/NodeIDAllocator.cpp +9 -9
- package/lib/Util/Options.cpp +426 -412
- package/lib/Util/SVFStat.cpp +5 -5
- package/lib/Util/SVFUtil.cpp +1 -1
- package/lib/Util/Z3Expr.cpp +2 -2
- package/lib/WPA/Andersen.cpp +13 -13
- package/lib/WPA/AndersenSCD.cpp +3 -3
- package/lib/WPA/FlowSensitive.cpp +8 -8
- package/lib/WPA/TypeAnalysis.cpp +1 -1
- package/lib/WPA/VersionedFlowSensitive.cpp +4 -4
- package/lib/WPA/WPAPass.cpp +10 -9
- package/package.json +1 -1
- package/tools/CFL/cfl.cpp +6 -14
- package/tools/DDA/dda.cpp +39 -29
- package/tools/Example/svf-ex.cpp +5 -8
- package/tools/MTA/LockResultValidator.cpp +2 -2
- package/tools/MTA/MTAAnnotator.cpp +5 -5
- package/tools/MTA/MTAResultValidator.cpp +8 -8
- package/tools/MTA/mta.cpp +5 -8
- package/tools/SABER/saber.cpp +23 -17
- package/tools/WPA/wpa.cpp +6 -9
|
@@ -66,7 +66,7 @@ $(function() {
|
|
|
66
66
|
<div class="title">DCHG.cpp</div> </div>
|
|
67
67
|
</div><!--header-->
|
|
68
68
|
<div class="contents">
|
|
69
|
-
<a href="DCHG_8cpp.html">Go to the documentation of this file.</a><div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span> <span class="comment">//===----- DCHG.cpp CHG using DWARF debug info ------------------------//</span></div><div class="line"><a name="l00002"></a><span class="lineno"> 2</span> <span class="comment">//</span></div><div class="line"><a name="l00003"></a><span class="lineno"> 3</span> <span class="comment">/*</span></div><div class="line"><a name="l00004"></a><span class="lineno"> 4</span> <span class="comment"> * DCHG.cpp</span></div><div class="line"><a name="l00005"></a><span class="lineno"> 5</span> <span class="comment"> *</span></div><div class="line"><a name="l00006"></a><span class="lineno"> 6</span> <span class="comment"> * Created on: Aug 24, 2019</span></div><div class="line"><a name="l00007"></a><span class="lineno"> 7</span> <span class="comment"> * Author: Mohamad Barbar</span></div><div class="line"><a name="l00008"></a><span class="lineno"> 8</span> <span class="comment"> */</span></div><div class="line"><a name="l00009"></a><span class="lineno"> 9</span> </div><div class="line"><a name="l00010"></a><span class="lineno"> 10</span> <span class="preprocessor">#include <sstream></span></div><div class="line"><a name="l00011"></a><span class="lineno"> 11</span> </div><div class="line"><a name="l00012"></a><span class="lineno"> 12</span> <span class="preprocessor">#include "<a class="code" href="Options_8h.html">Util/Options.h</a>"</span></div><div class="line"><a name="l00013"></a><span class="lineno"> 13</span> <span class="preprocessor">#include "<a class="code" href="DCHG_8h.html">SVF-LLVM/DCHG.h</a>"</span></div><div class="line"><a name="l00014"></a><span class="lineno"> 14</span> <span class="preprocessor">#include "<a class="code" href="CPPUtil_8h.html">SVF-LLVM/CPPUtil.h</a>"</span></div><div class="line"><a name="l00015"></a><span class="lineno"> 15</span> <span class="preprocessor">#include "<a class="code" href="SVFUtil_8h.html">Util/SVFUtil.h</a>"</span></div><div class="line"><a name="l00016"></a><span class="lineno"> 16</span> <span class="preprocessor">#include "<a class="code" href="LLVMUtil_8h.html">SVF-LLVM/LLVMUtil.h</a>"</span></div><div class="line"><a name="l00017"></a><span class="lineno"> 17</span> </div><div class="line"><a name="l00018"></a><span class="lineno"> 18</span> <span class="keyword">using namespace </span><a class="code" href="namespaceSVF.html">SVF</a>;</div><div class="line"><a name="l00019"></a><span class="lineno"> 19</span> </div><div class="line"><a name="l00020"></a><span class="lineno"> 20</span> </div><div class="line"><a name="l00021"></a><span class="lineno"><a class="line" href="classSVF_1_1DCHGraph.html#a86bf48776ccf53092f4cb742cf95f8eb"> 21</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1DCHGraph.html#a86bf48776ccf53092f4cb742cf95f8eb">DCHGraph::handleDIBasicType</a>(<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#ada0513be7e25325325ccc9183aeca278">DIBasicType</a> *basicType)</div><div class="line"><a name="l00022"></a><span class="lineno"> 22</span> {</div><div class="line"><a name="l00023"></a><span class="lineno"> 23</span>  <a class="code" href="classSVF_1_1DCHGraph.html#a9ed6b91fad334605f514049a2072b538">getOrCreateNode</a>(basicType);</div><div class="line"><a name="l00024"></a><span class="lineno"> 24</span> }</div><div class="line"><a name="l00025"></a><span class="lineno"> 25</span> </div><div class="line"><a name="l00026"></a><span class="lineno"><a class="line" href="classSVF_1_1DCHGraph.html#a3ce75cbe92a1fa7d34c6fca2d2ca1b0f"> 26</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1DCHGraph.html#a3ce75cbe92a1fa7d34c6fca2d2ca1b0f">DCHGraph::handleDICompositeType</a>(<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#aded9b991c77acc5284ccead0739e84f1">DICompositeType</a> *compositeType)</div><div class="line"><a name="l00027"></a><span class="lineno"> 27</span> {</div><div class="line"><a name="l00028"></a><span class="lineno"> 28</span>  <span class="keywordflow">switch</span> (compositeType->getTag())</div><div class="line"><a name="l00029"></a><span class="lineno"> 29</span>  {</div><div class="line"><a name="l00030"></a><span class="lineno"> 30</span>  <span class="keywordflow">case</span> dwarf::DW_TAG_array_type:</div><div class="line"><a name="l00031"></a><span class="lineno"> 31</span>  <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1DCHGraph.html#aa6f49dfc9e3580d3f2d8c257395eb11e">extended</a>) <a class="code" href="classSVF_1_1DCHGraph.html#a9ed6b91fad334605f514049a2072b538">getOrCreateNode</a>(compositeType);</div><div class="line"><a name="l00032"></a><span class="lineno"> 32</span>  <a class="code" href="classSVF_1_1DCHGraph.html#a8fcbea9435a77beb27ad64d5a3175b0b">gatherAggs</a>(compositeType);</div><div class="line"><a name="l00033"></a><span class="lineno"> 33</span>  <span class="keywordflow">break</span>;</div><div class="line"><a name="l00034"></a><span class="lineno"> 34</span>  <span class="keywordflow">case</span> dwarf::DW_TAG_class_type:</div><div class="line"><a name="l00035"></a><span class="lineno"> 35</span>  <span class="keywordflow">case</span> dwarf::DW_TAG_structure_type:</div><div class="line"><a name="l00036"></a><span class="lineno"> 36</span>  <a class="code" href="classSVF_1_1DCHGraph.html#a9ed6b91fad334605f514049a2072b538">getOrCreateNode</a>(compositeType);</div><div class="line"><a name="l00037"></a><span class="lineno"> 37</span>  <span class="comment">// If we're extending, we need to add the first-field relation.</span></div><div class="line"><a name="l00038"></a><span class="lineno"> 38</span>  <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1DCHGraph.html#aa6f49dfc9e3580d3f2d8c257395eb11e">extended</a>)</div><div class="line"><a name="l00039"></a><span class="lineno"> 39</span>  {</div><div class="line"><a name="l00040"></a><span class="lineno"> 40</span>  <a class="code" href="namespaceSVF.html#a0f825e73d115173b05ca54fb8ec65003">DINodeArray</a> fields = compositeType->getElements();</div><div class="line"><a name="l00041"></a><span class="lineno"> 41</span>  <span class="keywordflow">if</span> (!fields.empty())</div><div class="line"><a name="l00042"></a><span class="lineno"> 42</span>  {</div><div class="line"><a name="l00043"></a><span class="lineno"> 43</span>  <span class="comment">// We want the first non-static, non-function member; it may not exist.</span></div><div class="line"><a name="l00044"></a><span class="lineno"> 44</span>  <a class="code" href="namespaceSVF.html#a852e75c562139237fcc754c7461533e6">DIDerivedType</a> *firstMember = <span class="keyword">nullptr</span>;</div><div class="line"><a name="l00045"></a><span class="lineno"> 45</span>  <span class="keywordflow">for</span> (<a class="code" href="namespaceSVF.html#a758f3bee97ed46a719d64a2d4f2bc62d">DINode</a> *<a class="code" href="cJSON_8cpp.html#ab6e2ea6dc7bd57d1483413449998230a">n</a> : fields)</div><div class="line"><a name="l00046"></a><span class="lineno"> 46</span>  {</div><div class="line"><a name="l00047"></a><span class="lineno"> 47</span>  <span class="keywordflow">if</span> (<a class="code" href="namespaceSVF.html#a852e75c562139237fcc754c7461533e6">DIDerivedType</a> *fm = SVFUtil::dyn_cast<DIDerivedType>(<a class="code" href="cJSON_8cpp.html#ab6e2ea6dc7bd57d1483413449998230a">n</a>))</div><div class="line"><a name="l00048"></a><span class="lineno"> 48</span>  {</div><div class="line"><a name="l00049"></a><span class="lineno"> 49</span>  <span class="keywordflow">if</span> (fm->getTag() == dwarf::DW_TAG_member && !fm->isStaticMember())</div><div class="line"><a name="l00050"></a><span class="lineno"> 50</span>  {</div><div class="line"><a name="l00051"></a><span class="lineno"> 51</span>  firstMember = fm;</div><div class="line"><a name="l00052"></a><span class="lineno"> 52</span>  <span class="keywordflow">break</span>;</div><div class="line"><a name="l00053"></a><span class="lineno"> 53</span>  }</div><div class="line"><a name="l00054"></a><span class="lineno"> 54</span>  }</div><div class="line"><a name="l00055"></a><span class="lineno"> 55</span>  }</div><div class="line"><a name="l00056"></a><span class="lineno"> 56</span> </div><div class="line"><a name="l00057"></a><span class="lineno"> 57</span>  <span class="keywordflow">if</span> (firstMember != <span class="keyword">nullptr</span>)</div><div class="line"><a name="l00058"></a><span class="lineno"> 58</span>  {</div><div class="line"><a name="l00059"></a><span class="lineno"> 59</span>  <span class="comment">// firstMember is a DW_TAG_member, we want the base type beneath it.</span></div><div class="line"><a name="l00060"></a><span class="lineno"> 60</span>  <a class="code" href="classSVF_1_1DCHGraph.html#a294a2075c97e1db8003393fb472c1def">addEdge</a>(compositeType, firstMember->getBaseType(), <a class="code" href="classSVF_1_1DCHEdge.html#a48f01c4a02c4e278a1ab70b16efdef4ba3b49b95b713f585b717810dce5ac6564">DCHEdge::FIRST_FIELD</a>);</div><div class="line"><a name="l00061"></a><span class="lineno"> 61</span>  }</div><div class="line"><a name="l00062"></a><span class="lineno"> 62</span>  }</div><div class="line"><a name="l00063"></a><span class="lineno"> 63</span>  }</div><div class="line"><a name="l00064"></a><span class="lineno"> 64</span> </div><div class="line"><a name="l00065"></a><span class="lineno"> 65</span>  <a class="code" href="classSVF_1_1DCHGraph.html#ab96874bc8f6461fe0c3eb53b7f5cedce">flatten</a>(compositeType);</div><div class="line"><a name="l00066"></a><span class="lineno"> 66</span>  <a class="code" href="classSVF_1_1DCHGraph.html#a8fcbea9435a77beb27ad64d5a3175b0b">gatherAggs</a>(compositeType);</div><div class="line"><a name="l00067"></a><span class="lineno"> 67</span> </div><div class="line"><a name="l00068"></a><span class="lineno"> 68</span>  <span class="keywordflow">break</span>;</div><div class="line"><a name="l00069"></a><span class="lineno"> 69</span>  <span class="keywordflow">case</span> dwarf::DW_TAG_union_type:</div><div class="line"><a name="l00070"></a><span class="lineno"> 70</span>  <a class="code" href="classSVF_1_1DCHGraph.html#a9ed6b91fad334605f514049a2072b538">getOrCreateNode</a>(compositeType);</div><div class="line"><a name="l00071"></a><span class="lineno"> 71</span>  <span class="comment">// All fields are first fields.</span></div><div class="line"><a name="l00072"></a><span class="lineno"> 72</span>  <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1DCHGraph.html#aa6f49dfc9e3580d3f2d8c257395eb11e">extended</a>)</div><div class="line"><a name="l00073"></a><span class="lineno"> 73</span>  {</div><div class="line"><a name="l00074"></a><span class="lineno"> 74</span>  <a class="code" href="namespaceSVF.html#a0f825e73d115173b05ca54fb8ec65003">DINodeArray</a> fields = compositeType->getElements();</div><div class="line"><a name="l00075"></a><span class="lineno"> 75</span>  <span class="keywordflow">for</span> (<a class="code" href="namespaceSVF.html#a758f3bee97ed46a719d64a2d4f2bc62d">DINode</a> *field : fields)</div><div class="line"><a name="l00076"></a><span class="lineno"> 76</span>  {</div><div class="line"><a name="l00077"></a><span class="lineno"> 77</span>  <span class="comment">// fields[0] gives a type which is DW_TAG_member, we want the member's type (getBaseType).</span></div><div class="line"><a name="l00078"></a><span class="lineno"> 78</span>  <a class="code" href="namespaceSVF.html#a852e75c562139237fcc754c7461533e6">DIDerivedType</a> *firstMember = <a class="code" href="namespaceSVF_1_1SVFUtil.html#af6e96694d983643a66c238cce01bff0e">SVFUtil::dyn_cast</a><<a class="code" href="namespaceSVF.html#a852e75c562139237fcc754c7461533e6">DIDerivedType</a>>(field);</div><div class="line"><a name="l00079"></a><span class="lineno"> 79</span>  assert(firstMember != <span class="keyword">nullptr</span> && <span class="stringliteral">"DCHG: expected member type"</span>);</div><div class="line"><a name="l00080"></a><span class="lineno"> 80</span>  <a class="code" href="classSVF_1_1DCHGraph.html#a294a2075c97e1db8003393fb472c1def">addEdge</a>(compositeType, firstMember->getBaseType(), <a class="code" href="classSVF_1_1DCHEdge.html#a48f01c4a02c4e278a1ab70b16efdef4ba3b49b95b713f585b717810dce5ac6564">DCHEdge::FIRST_FIELD</a>);</div><div class="line"><a name="l00081"></a><span class="lineno"> 81</span>  }</div><div class="line"><a name="l00082"></a><span class="lineno"> 82</span>  }</div><div class="line"><a name="l00083"></a><span class="lineno"> 83</span> </div><div class="line"><a name="l00084"></a><span class="lineno"> 84</span>  <span class="comment">// flatten(compositeType);</span></div><div class="line"><a name="l00085"></a><span class="lineno"> 85</span>  <a class="code" href="classSVF_1_1DCHGraph.html#a8fcbea9435a77beb27ad64d5a3175b0b">gatherAggs</a>(compositeType);</div><div class="line"><a name="l00086"></a><span class="lineno"> 86</span> </div><div class="line"><a name="l00087"></a><span class="lineno"> 87</span>  <span class="keywordflow">break</span>;</div><div class="line"><a name="l00088"></a><span class="lineno"> 88</span>  <span class="keywordflow">case</span> dwarf::DW_TAG_enumeration_type:</div><div class="line"><a name="l00089"></a><span class="lineno"> 89</span>  <a class="code" href="classSVF_1_1DCHGraph.html#a9ed6b91fad334605f514049a2072b538">getOrCreateNode</a>(compositeType);</div><div class="line"><a name="l00090"></a><span class="lineno"> 90</span>  <span class="keywordflow">break</span>;</div><div class="line"><a name="l00091"></a><span class="lineno"> 91</span>  <span class="keywordflow">default</span>:</div><div class="line"><a name="l00092"></a><span class="lineno"> 92</span>  assert(<span class="keyword">false</span> && <span class="stringliteral">"DCHGraph::buildCHG: unexpected CompositeType tag."</span>);</div><div class="line"><a name="l00093"></a><span class="lineno"> 93</span>  }</div><div class="line"><a name="l00094"></a><span class="lineno"> 94</span> }</div><div class="line"><a name="l00095"></a><span class="lineno"> 95</span> </div><div class="line"><a name="l00096"></a><span class="lineno"><a class="line" href="classSVF_1_1DCHGraph.html#a1a4162e68b22d53e9dca73c6780ed3e5"> 96</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1DCHGraph.html#a1a4162e68b22d53e9dca73c6780ed3e5">DCHGraph::handleDIDerivedType</a>(<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a852e75c562139237fcc754c7461533e6">DIDerivedType</a> *derivedType)</div><div class="line"><a name="l00097"></a><span class="lineno"> 97</span> {</div><div class="line"><a name="l00098"></a><span class="lineno"> 98</span>  <span class="keywordflow">switch</span> (derivedType->getTag())</div><div class="line"><a name="l00099"></a><span class="lineno"> 99</span>  {</div><div class="line"><a name="l00100"></a><span class="lineno"> 100</span>  <span class="keywordflow">case</span> dwarf::DW_TAG_inheritance:</div><div class="line"><a name="l00101"></a><span class="lineno"> 101</span>  {</div><div class="line"><a name="l00102"></a><span class="lineno"> 102</span>  assert(SVFUtil::isa<DIType>(derivedType->getScope()) && <span class="stringliteral">"inheriting from non-type?"</span>);</div><div class="line"><a name="l00103"></a><span class="lineno"> 103</span>  <a class="code" href="classSVF_1_1DCHEdge.html">DCHEdge</a> *edge = <a class="code" href="classSVF_1_1DCHGraph.html#a294a2075c97e1db8003393fb472c1def">addEdge</a>(SVFUtil::dyn_cast<DIType>(derivedType->getScope()),</div><div class="line"><a name="l00104"></a><span class="lineno"> 104</span>  derivedType->getBaseType(), <a class="code" href="classSVF_1_1DCHEdge.html#a48f01c4a02c4e278a1ab70b16efdef4ba9c05805c60fe04033bd9815968059e90">DCHEdge::INHERITANCE</a>);</div><div class="line"><a name="l00105"></a><span class="lineno"> 105</span>  <span class="comment">// If the offset does not exist (for primary base), getConstantFieldIdx should return 0.</span></div><div class="line"><a name="l00106"></a><span class="lineno"> 106</span>  edge-><a class="code" href="classSVF_1_1DCHEdge.html#a70f757826082c95766c8324c1264e977">setOffset</a>(derivedType->getOffsetInBits());</div><div class="line"><a name="l00107"></a><span class="lineno"> 107</span>  <span class="keywordflow">break</span>;</div><div class="line"><a name="l00108"></a><span class="lineno"> 108</span>  }</div><div class="line"><a name="l00109"></a><span class="lineno"> 109</span>  <span class="keywordflow">case</span> dwarf::DW_TAG_member:</div><div class="line"><a name="l00110"></a><span class="lineno"> 110</span>  <span class="keywordflow">case</span> dwarf::DW_TAG_friend:</div><div class="line"><a name="l00111"></a><span class="lineno"> 111</span>  <span class="comment">// Don't care.</span></div><div class="line"><a name="l00112"></a><span class="lineno"> 112</span>  <span class="keywordflow">break</span>;</div><div class="line"><a name="l00113"></a><span class="lineno"> 113</span>  <span class="keywordflow">case</span> dwarf::DW_TAG_typedef:</div><div class="line"><a name="l00114"></a><span class="lineno"> 114</span>  <a class="code" href="classSVF_1_1DCHGraph.html#a6d97a772afe16c1483e65eea81f82603">handleTypedef</a>(derivedType);</div><div class="line"><a name="l00115"></a><span class="lineno"> 115</span>  <span class="keywordflow">break</span>;</div><div class="line"><a name="l00116"></a><span class="lineno"> 116</span>  <span class="keywordflow">case</span> dwarf::DW_TAG_pointer_type:</div><div class="line"><a name="l00117"></a><span class="lineno"> 117</span>  <span class="keywordflow">case</span> dwarf::DW_TAG_ptr_to_member_type:</div><div class="line"><a name="l00118"></a><span class="lineno"> 118</span>  <span class="keywordflow">case</span> dwarf::DW_TAG_reference_type:</div><div class="line"><a name="l00119"></a><span class="lineno"> 119</span>  <span class="keywordflow">case</span> dwarf::DW_TAG_rvalue_reference_type:</div><div class="line"><a name="l00120"></a><span class="lineno"> 120</span>  <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1DCHGraph.html#aa6f49dfc9e3580d3f2d8c257395eb11e">extended</a>) <a class="code" href="classSVF_1_1DCHGraph.html#a9ed6b91fad334605f514049a2072b538">getOrCreateNode</a>(derivedType);</div><div class="line"><a name="l00121"></a><span class="lineno"> 121</span>  <span class="keywordflow">break</span>;</div><div class="line"><a name="l00122"></a><span class="lineno"> 122</span>  <span class="keywordflow">case</span> dwarf::DW_TAG_const_type:</div><div class="line"><a name="l00123"></a><span class="lineno"> 123</span>  <span class="keywordflow">case</span> dwarf::DW_TAG_atomic_type:</div><div class="line"><a name="l00124"></a><span class="lineno"> 124</span>  <span class="keywordflow">case</span> dwarf::DW_TAG_volatile_type:</div><div class="line"><a name="l00125"></a><span class="lineno"> 125</span>  <span class="keywordflow">case</span> dwarf::DW_TAG_restrict_type:</div><div class="line"><a name="l00126"></a><span class="lineno"> 126</span>  <span class="keywordflow">break</span>;</div><div class="line"><a name="l00127"></a><span class="lineno"> 127</span>  <span class="keywordflow">default</span>:</div><div class="line"><a name="l00128"></a><span class="lineno"> 128</span>  assert(<span class="keyword">false</span> && <span class="stringliteral">"DCHGraph::buildCHG: unexpected DerivedType tag."</span>);</div><div class="line"><a name="l00129"></a><span class="lineno"> 129</span>  }</div><div class="line"><a name="l00130"></a><span class="lineno"> 130</span> }</div><div class="line"><a name="l00131"></a><span class="lineno"> 131</span> </div><div class="line"><a name="l00132"></a><span class="lineno"><a class="line" href="classSVF_1_1DCHGraph.html#a671f379ae54eef247b5e013478eb3f0c"> 132</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1DCHGraph.html#a671f379ae54eef247b5e013478eb3f0c">DCHGraph::handleDISubroutineType</a>(<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a090e0791e8c200104ed3ab6bab157129">DISubroutineType</a> *subroutineType)</div><div class="line"><a name="l00133"></a><span class="lineno"> 133</span> {</div><div class="line"><a name="l00134"></a><span class="lineno"> 134</span>  <a class="code" href="classSVF_1_1DCHGraph.html#a9ed6b91fad334605f514049a2072b538">getOrCreateNode</a>(subroutineType);</div><div class="line"><a name="l00135"></a><span class="lineno"> 135</span> }</div><div class="line"><a name="l00136"></a><span class="lineno"> 136</span> </div><div class="line"><a name="l00137"></a><span class="lineno"><a class="line" href="classSVF_1_1DCHGraph.html#a6d97a772afe16c1483e65eea81f82603"> 137</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1DCHGraph.html#a6d97a772afe16c1483e65eea81f82603">DCHGraph::handleTypedef</a>(<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#ad127b0ad478640ede3d426e3a58d2632">DIType</a> *typedefType)</div><div class="line"><a name="l00138"></a><span class="lineno"> 138</span> {</div><div class="line"><a name="l00139"></a><span class="lineno"> 139</span>  assert(typedefType && typedefType->getTag() == dwarf::DW_TAG_typedef);</div><div class="line"><a name="l00140"></a><span class="lineno"> 140</span> </div><div class="line"><a name="l00141"></a><span class="lineno"> 141</span>  <span class="comment">// Need to gather them in a set first because we don't know the base type till</span></div><div class="line"><a name="l00142"></a><span class="lineno"> 142</span>  <span class="comment">// we get to the bottom of the (potentially many) typedefs.</span></div><div class="line"><a name="l00143"></a><span class="lineno"> 143</span>  std::vector<const DIDerivedType *> typedefs;</div><div class="line"><a name="l00144"></a><span class="lineno"> 144</span>  <span class="comment">// Check for nullptr because you can typedef void.</span></div><div class="line"><a name="l00145"></a><span class="lineno"> 145</span>  <span class="keywordflow">while</span> (typedefType != <span class="keyword">nullptr</span> && typedefType->getTag() == dwarf::DW_TAG_typedef)</div><div class="line"><a name="l00146"></a><span class="lineno"> 146</span>  {</div><div class="line"><a name="l00147"></a><span class="lineno"> 147</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a852e75c562139237fcc754c7461533e6">DIDerivedType</a> *typedefDerivedType = <a class="code" href="namespaceSVF_1_1SVFUtil.html#af6e96694d983643a66c238cce01bff0e">SVFUtil::dyn_cast</a><<a class="code" href="namespaceSVF.html#a852e75c562139237fcc754c7461533e6">DIDerivedType</a>>(typedefType);</div><div class="line"><a name="l00148"></a><span class="lineno"> 148</span>  <span class="comment">// The typedef itself.</span></div><div class="line"><a name="l00149"></a><span class="lineno"> 149</span>  typedefs.push_back(typedefDerivedType);</div><div class="line"><a name="l00150"></a><span class="lineno"> 150</span> </div><div class="line"><a name="l00151"></a><span class="lineno"> 151</span>  <span class="comment">// Next in the typedef line.</span></div><div class="line"><a name="l00152"></a><span class="lineno"> 152</span>  typedefType = typedefDerivedType->getBaseType();</div><div class="line"><a name="l00153"></a><span class="lineno"> 153</span>  }</div><div class="line"><a name="l00154"></a><span class="lineno"> 154</span> </div><div class="line"><a name="l00155"></a><span class="lineno"> 155</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#ad127b0ad478640ede3d426e3a58d2632">DIType</a> *baseType = typedefType;</div><div class="line"><a name="l00156"></a><span class="lineno"> 156</span>  <a class="code" href="classSVF_1_1DCHNode.html">DCHNode</a> *baseTypeNode = <a class="code" href="classSVF_1_1DCHGraph.html#a9ed6b91fad334605f514049a2072b538">getOrCreateNode</a>(baseType);</div><div class="line"><a name="l00157"></a><span class="lineno"> 157</span> </div><div class="line"><a name="l00158"></a><span class="lineno"> 158</span>  <span class="keywordflow">for</span> (<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a852e75c562139237fcc754c7461533e6">DIDerivedType</a> *tdef : typedefs)</div><div class="line"><a name="l00159"></a><span class="lineno"> 159</span>  {</div><div class="line"><a name="l00160"></a><span class="lineno"> 160</span>  <span class="comment">// Base type needs to hold its typedefs.</span></div><div class="line"><a name="l00161"></a><span class="lineno"> 161</span>  baseTypeNode-><a class="code" href="classSVF_1_1DCHNode.html#a9d1016e3da3462664198b1125dfc8f6e">addTypedef</a>(tdef);</div><div class="line"><a name="l00162"></a><span class="lineno"> 162</span>  }</div><div class="line"><a name="l00163"></a><span class="lineno"> 163</span> }</div><div class="line"><a name="l00164"></a><span class="lineno"> 164</span> </div><div class="line"><a name="l00165"></a><span class="lineno"><a class="line" href="classSVF_1_1DCHGraph.html#a1215db390515a30fbc416fb14d2e863f"> 165</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1DCHGraph.html#a1215db390515a30fbc416fb14d2e863f">DCHGraph::buildVTables</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFModule.html">SVFModule</a> &module)</div><div class="line"><a name="l00166"></a><span class="lineno"> 166</span> {</div><div class="line"><a name="l00167"></a><span class="lineno"> 167</span>  <span class="keywordflow">for</span> (<a class="code" href="namespaceSVF.html#aa7a770b5dd5cd0e37d06a1088f252906">Module</a> &M : <a class="code" href="classSVF_1_1LLVMModuleSet.html#acf40310917909e4234282c0695a43160">LLVMModuleSet::getLLVMModuleSet</a>()->getLLVMModules())</div><div class="line"><a name="l00168"></a><span class="lineno"> 168</span>  {</div><div class="line"><a name="l00169"></a><span class="lineno"> 169</span>  <span class="keywordflow">for</span> (Module::const_global_iterator gvI = M.global_begin(); gvI != M.global_end(); ++gvI)</div><div class="line"><a name="l00170"></a><span class="lineno"> 170</span>  {</div><div class="line"><a name="l00171"></a><span class="lineno"> 171</span>  <span class="comment">// Though this will return more than GlobalVariables, we only care about GlobalVariables (for the vtbls).</span></div><div class="line"><a name="l00172"></a><span class="lineno"> 172</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a09f5fa3bc44bf53612a085e3a611cc4e">GlobalVariable</a> *gv = <a class="code" href="namespaceSVF_1_1SVFUtil.html#af6e96694d983643a66c238cce01bff0e">SVFUtil::dyn_cast</a><<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a09f5fa3bc44bf53612a085e3a611cc4e">GlobalVariable</a>>(&*gvI);</div><div class="line"><a name="l00173"></a><span class="lineno"> 173</span>  <span class="keywordflow">if</span> (gv == <span class="keyword">nullptr</span>) <span class="keywordflow">continue</span>;</div><div class="line"><a name="l00174"></a><span class="lineno"> 174</span>  <span class="keywordflow">if</span> (gv->hasMetadata(<a class="code" href="namespaceSVF_1_1cppUtil_1_1ctir.html#aa4630844aa25aa4801659304a2552058">cppUtil::ctir::vtMDName</a>) && gv->getNumOperands() > 0)</div><div class="line"><a name="l00175"></a><span class="lineno"> 175</span>  {</div><div class="line"><a name="l00176"></a><span class="lineno"> 176</span>  <a class="code" href="namespaceSVF.html#ad127b0ad478640ede3d426e3a58d2632">DIType</a> *<a class="code" href="cJSON_8cpp.html#a3f9a0d3265a6254722587175dac3e4dc">type</a> = <a class="code" href="namespaceSVF_1_1SVFUtil.html#af6e96694d983643a66c238cce01bff0e">SVFUtil::dyn_cast</a><<a class="code" href="namespaceSVF.html#ad127b0ad478640ede3d426e3a58d2632">DIType</a>>(gv->getMetadata(<a class="code" href="namespaceSVF_1_1cppUtil_1_1ctir.html#aa4630844aa25aa4801659304a2552058">cppUtil::ctir::vtMDName</a>));</div><div class="line"><a name="l00177"></a><span class="lineno"> 177</span>  assert(type && <span class="stringliteral">"DCHG::buildVTables: bad metadata for ctir.vt"</span>);</div><div class="line"><a name="l00178"></a><span class="lineno"> 178</span>  <a class="code" href="classSVF_1_1DCHNode.html">DCHNode</a> *node = <a class="code" href="classSVF_1_1DCHGraph.html#a9ed6b91fad334605f514049a2072b538">getOrCreateNode</a>(type);</div><div class="line"><a name="l00179"></a><span class="lineno"> 179</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFGlobalValue.html">SVFGlobalValue</a>* svfgv = <a class="code" href="classSVF_1_1LLVMModuleSet.html#acf40310917909e4234282c0695a43160">LLVMModuleSet::getLLVMModuleSet</a>()-><a class="code" href="classSVF_1_1LLVMModuleSet.html#a3cbba2eb702a3481478b2590dfffa352">getSVFGlobalValue</a>(gv);</div><div class="line"><a name="l00180"></a><span class="lineno"> 180</span>  node-><a class="code" href="classSVF_1_1DCHNode.html#ad3144bcf462769c687bc7b65ef2f1639">setVTable</a>(svfgv);</div><div class="line"><a name="l00181"></a><span class="lineno"> 181</span>  <a class="code" href="classSVF_1_1DCHGraph.html#a42f373998403f615a248ce94bc836b63">vtblToTypeMap</a>[svfgv] = <a class="code" href="classSVF_1_1DCHGraph.html#a079feacdcc3783f4a9108a3b2d2aed2c">getCanonicalType</a>(type);</div><div class="line"><a name="l00182"></a><span class="lineno"> 182</span> </div><div class="line"><a name="l00183"></a><span class="lineno"> 183</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a2b28f48dde0a9a91d251e654ce1f9477">ConstantStruct</a> *vtbls = <a class="code" href="namespaceSVF_1_1SVFUtil.html#af6e96694d983643a66c238cce01bff0e">SVFUtil::dyn_cast</a><<a class="code" href="namespaceSVF.html#a2b28f48dde0a9a91d251e654ce1f9477">ConstantStruct</a>>(gv->getOperand(0));</div><div class="line"><a name="l00184"></a><span class="lineno"> 184</span>  assert(vtbls && <span class="stringliteral">"unexpected vtable type"</span>);</div><div class="line"><a name="l00185"></a><span class="lineno"> 185</span>  <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> nthVtbl = 0; nthVtbl < vtbls->getNumOperands(); ++nthVtbl)</div><div class="line"><a name="l00186"></a><span class="lineno"> 186</span>  {</div><div class="line"><a name="l00187"></a><span class="lineno"> 187</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a5ae718cba37d8e34d2946530dc098c8e">ConstantArray</a> *vtbl = <a class="code" href="namespaceSVF_1_1SVFUtil.html#af6e96694d983643a66c238cce01bff0e">SVFUtil::dyn_cast</a><<a class="code" href="namespaceSVF.html#a5ae718cba37d8e34d2946530dc098c8e">ConstantArray</a>>(vtbls->getOperand(nthVtbl));</div><div class="line"><a name="l00188"></a><span class="lineno"> 188</span>  assert(vtbl && <span class="stringliteral">"Element of vtbl struct not an array"</span>);</div><div class="line"><a name="l00189"></a><span class="lineno"> 189</span> </div><div class="line"><a name="l00190"></a><span class="lineno"> 190</span>  std::vector<const Function* > &vfns = node-><a class="code" href="classSVF_1_1DCHNode.html#a41ba902b643e2aec828be1a89f4536af">getVfnVector</a>(nthVtbl);</div><div class="line"><a name="l00191"></a><span class="lineno"> 191</span> </div><div class="line"><a name="l00192"></a><span class="lineno"> 192</span>  <span class="comment">// Iterating over the vtbl, we will run into:</span></div><div class="line"><a name="l00193"></a><span class="lineno"> 193</span>  <span class="comment">// 1. i8* null (don't care for now).</span></div><div class="line"><a name="l00194"></a><span class="lineno"> 194</span>  <span class="comment">// 2. i8* inttoptr ... (don't care for now).</span></div><div class="line"><a name="l00195"></a><span class="lineno"> 195</span>  <span class="comment">// 3. i8* bitcast ... (we only care when a function pointer is being bitcasted).</span></div><div class="line"><a name="l00196"></a><span class="lineno"> 196</span>  <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> cN = 0; cN < vtbl->getNumOperands(); ++cN)</div><div class="line"><a name="l00197"></a><span class="lineno"> 197</span>  {</div><div class="line"><a name="l00198"></a><span class="lineno"> 198</span>  <a class="code" href="namespaceSVF.html#a7e230c0cba2e3a7c2e5a5f2ee7d88af9">Constant</a> *c = vtbl->getOperand(cN);</div><div class="line"><a name="l00199"></a><span class="lineno"> 199</span>  <span class="keywordflow">if</span> (SVFUtil::isa<ConstantPointerNull>(c))</div><div class="line"><a name="l00200"></a><span class="lineno"> 200</span>  {</div><div class="line"><a name="l00201"></a><span class="lineno"> 201</span>  <span class="comment">// Don't care for now.</span></div><div class="line"><a name="l00202"></a><span class="lineno"> 202</span>  <span class="keywordflow">continue</span>;</div><div class="line"><a name="l00203"></a><span class="lineno"> 203</span>  }</div><div class="line"><a name="l00204"></a><span class="lineno"> 204</span> </div><div class="line"><a name="l00205"></a><span class="lineno"> 205</span>  <a class="code" href="namespaceSVF.html#a911dbaab38cb42deb9c195c7f687853d">ConstantExpr</a> *ce = <a class="code" href="namespaceSVF_1_1SVFUtil.html#af6e96694d983643a66c238cce01bff0e">SVFUtil::dyn_cast</a><<a class="code" href="namespaceSVF.html#a911dbaab38cb42deb9c195c7f687853d">ConstantExpr</a>>(c);</div><div class="line"><a name="l00206"></a><span class="lineno"> 206</span>  assert(ce && <span class="stringliteral">"non-ConstantExpr, non-ConstantPointerNull in vtable?"</span>);</div><div class="line"><a name="l00207"></a><span class="lineno"> 207</span>  <span class="keywordflow">if</span> (ce->getOpcode() == Instruction::BitCast)</div><div class="line"><a name="l00208"></a><span class="lineno"> 208</span>  {</div><div class="line"><a name="l00209"></a><span class="lineno"> 209</span>  <span class="comment">// Could be a GlobalAlias which we don't care about, or a virtual/thunk function.</span></div><div class="line"><a name="l00210"></a><span class="lineno"> 210</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a5faee14fa1dd41447bc73ac365fe33c1">Function</a>* vfn = <a class="code" href="namespaceSVF_1_1SVFUtil.html#af6e96694d983643a66c238cce01bff0e">SVFUtil::dyn_cast</a><<a class="code" href="namespaceSVF.html#a5faee14fa1dd41447bc73ac365fe33c1">Function</a>>(ce->getOperand(0));</div><div class="line"><a name="l00211"></a><span class="lineno"> 211</span>  <span class="keywordflow">if</span> (vfn != <span class="keyword">nullptr</span>)</div><div class="line"><a name="l00212"></a><span class="lineno"> 212</span>  {</div><div class="line"><a name="l00213"></a><span class="lineno"> 213</span>  vfns.push_back(vfn);</div><div class="line"><a name="l00214"></a><span class="lineno"> 214</span>  }</div><div class="line"><a name="l00215"></a><span class="lineno"> 215</span>  }</div><div class="line"><a name="l00216"></a><span class="lineno"> 216</span>  }</div><div class="line"><a name="l00217"></a><span class="lineno"> 217</span>  }</div><div class="line"><a name="l00218"></a><span class="lineno"> 218</span>  }</div><div class="line"><a name="l00219"></a><span class="lineno"> 219</span>  }</div><div class="line"><a name="l00220"></a><span class="lineno"> 220</span>  }</div><div class="line"><a name="l00221"></a><span class="lineno"> 221</span> }</div><div class="line"><a name="l00222"></a><span class="lineno"> 222</span> </div><div class="line"><a name="l00223"></a><span class="lineno"><a class="line" href="classSVF_1_1DCHGraph.html#a0a3dfe1f2757eabd75082e2c4caec47a"> 223</a></span> <span class="keyword">const</span> <a class="code" href="classSVF_1_1SparseBitVector.html">NodeBS</a> &<a class="code" href="classSVF_1_1DCHGraph.html#a0a3dfe1f2757eabd75082e2c4caec47a">DCHGraph::cha</a>(<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#ad127b0ad478640ede3d426e3a58d2632">DIType</a> *<a class="code" href="cJSON_8cpp.html#a3f9a0d3265a6254722587175dac3e4dc">type</a>, <span class="keywordtype">bool</span> firstField)</div><div class="line"><a name="l00224"></a><span class="lineno"> 224</span> {</div><div class="line"><a name="l00225"></a><span class="lineno"> 225</span>  type = <a class="code" href="classSVF_1_1DCHGraph.html#a079feacdcc3783f4a9108a3b2d2aed2c">getCanonicalType</a>(type);</div><div class="line"><a name="l00226"></a><span class="lineno"> 226</span>  <a class="code" href="namespaceSVF.html#a8234d4b959abc9123993bcff4eee34c1">Map<const DIType *, NodeBS></a> &cacheMap = firstField ? <a class="code" href="classSVF_1_1DCHGraph.html#abe8d313b501182ab62f2276a19d670a4">chaFFMap</a> : <a class="code" href="classSVF_1_1DCHGraph.html#ac0d5f1e10f642aac5b64792bf5fcbd9d">chaMap</a>;</div><div class="line"><a name="l00227"></a><span class="lineno"> 227</span> </div><div class="line"><a name="l00228"></a><span class="lineno"> 228</span>  <span class="comment">// Check if we've already computed.</span></div><div class="line"><a name="l00229"></a><span class="lineno"> 229</span>  <span class="keywordflow">if</span> (cacheMap.find(type) != cacheMap.end())</div><div class="line"><a name="l00230"></a><span class="lineno"> 230</span>  {</div><div class="line"><a name="l00231"></a><span class="lineno"> 231</span>  <span class="keywordflow">return</span> cacheMap[<a class="code" href="cJSON_8cpp.html#a3f9a0d3265a6254722587175dac3e4dc">type</a>];</div><div class="line"><a name="l00232"></a><span class="lineno"> 232</span>  }</div><div class="line"><a name="l00233"></a><span class="lineno"> 233</span> </div><div class="line"><a name="l00234"></a><span class="lineno"> 234</span>  <a class="code" href="classSVF_1_1SparseBitVector.html">NodeBS</a> <a class="code" href="namespaceSVF.html#a67f454fa9341632d195fd5da619130f0">children</a>;</div><div class="line"><a name="l00235"></a><span class="lineno"> 235</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1DCHNode.html">DCHNode</a> *node = <a class="code" href="classSVF_1_1DCHGraph.html#a9ed6b91fad334605f514049a2072b538">getOrCreateNode</a>(type);</div><div class="line"><a name="l00236"></a><span class="lineno"> 236</span>  <span class="comment">// Consider oneself a child, otherwise the recursion will just come up with nothing.</span></div><div class="line"><a name="l00237"></a><span class="lineno"> 237</span>  children.<a class="code" href="classSVF_1_1SparseBitVector.html#a61bd86909a141f9de873d92c0f904832">set</a>(node-><a class="code" href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">getId</a>());</div><div class="line"><a name="l00238"></a><span class="lineno"> 238</span>  <span class="keywordflow">for</span> (<span class="keyword">const</span> <a class="code" href="classSVF_1_1DCHEdge.html">DCHEdge</a> *edge : node-><a class="code" href="classSVF_1_1GenericNode.html#afc8b5f86d7795b6a0dfc0687d942d79b">getInEdges</a>())</div><div class="line"><a name="l00239"></a><span class="lineno"> 239</span>  {</div><div class="line"><a name="l00240"></a><span class="lineno"> 240</span>  <span class="comment">// Don't care about anything but inheritance, first-field, and standard def. edges.</span></div><div class="line"><a name="l00241"></a><span class="lineno"> 241</span>  <span class="keywordflow">if</span> ( edge->getEdgeKind() != <a class="code" href="classSVF_1_1DCHEdge.html#a48f01c4a02c4e278a1ab70b16efdef4ba9c05805c60fe04033bd9815968059e90">DCHEdge::INHERITANCE</a></div><div class="line"><a name="l00242"></a><span class="lineno"> 242</span>  && edge->getEdgeKind() != <a class="code" href="classSVF_1_1DCHEdge.html#a48f01c4a02c4e278a1ab70b16efdef4ba3b49b95b713f585b717810dce5ac6564">DCHEdge::FIRST_FIELD</a></div><div class="line"><a name="l00243"></a><span class="lineno"> 243</span>  && edge->getEdgeKind() != <a class="code" href="classSVF_1_1DCHEdge.html#a48f01c4a02c4e278a1ab70b16efdef4ba8b07351616a1798fa34ec3828f485ebb">DCHEdge::STD_DEF</a>)</div><div class="line"><a name="l00244"></a><span class="lineno"> 244</span>  {</div><div class="line"><a name="l00245"></a><span class="lineno"> 245</span>  <span class="keywordflow">continue</span>;</div><div class="line"><a name="l00246"></a><span class="lineno"> 246</span>  }</div><div class="line"><a name="l00247"></a><span class="lineno"> 247</span> </div><div class="line"><a name="l00248"></a><span class="lineno"> 248</span>  <span class="comment">// We only care about first-field edges if the flag is on.</span></div><div class="line"><a name="l00249"></a><span class="lineno"> 249</span>  <span class="keywordflow">if</span> (!firstField && edge->getEdgeKind() == <a class="code" href="classSVF_1_1DCHEdge.html#a48f01c4a02c4e278a1ab70b16efdef4ba3b49b95b713f585b717810dce5ac6564">DCHEdge::FIRST_FIELD</a>)</div><div class="line"><a name="l00250"></a><span class="lineno"> 250</span>  {</div><div class="line"><a name="l00251"></a><span class="lineno"> 251</span>  <span class="keywordflow">continue</span>;</div><div class="line"><a name="l00252"></a><span class="lineno"> 252</span>  }</div><div class="line"><a name="l00253"></a><span class="lineno"> 253</span> </div><div class="line"><a name="l00254"></a><span class="lineno"> 254</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1SparseBitVector.html">NodeBS</a> &cchildren = <a class="code" href="classSVF_1_1DCHGraph.html#a0a3dfe1f2757eabd75082e2c4caec47a">cha</a>(edge->getSrcNode()->getType(), firstField);</div><div class="line"><a name="l00255"></a><span class="lineno"> 255</span>  <span class="comment">// Children's children are my children.</span></div><div class="line"><a name="l00256"></a><span class="lineno"> 256</span>  <span class="keywordflow">for</span> (<a class="code" href="namespaceSVF.html#a350ae9bf8606bdfe23c8679681b969dc">NodeID</a> cchild : cchildren)</div><div class="line"><a name="l00257"></a><span class="lineno"> 257</span>  {</div><div class="line"><a name="l00258"></a><span class="lineno"> 258</span>  children.<a class="code" href="classSVF_1_1SparseBitVector.html#a61bd86909a141f9de873d92c0f904832">set</a>(cchild);</div><div class="line"><a name="l00259"></a><span class="lineno"> 259</span>  }</div><div class="line"><a name="l00260"></a><span class="lineno"> 260</span>  }</div><div class="line"><a name="l00261"></a><span class="lineno"> 261</span> </div><div class="line"><a name="l00262"></a><span class="lineno"> 262</span>  <span class="comment">// Cache results.</span></div><div class="line"><a name="l00263"></a><span class="lineno"> 263</span>  cacheMap.insert({<a class="code" href="cJSON_8cpp.html#a3f9a0d3265a6254722587175dac3e4dc">type</a>, children});</div><div class="line"><a name="l00264"></a><span class="lineno"> 264</span>  <span class="comment">// Return the permanent object; we're returning a reference.</span></div><div class="line"><a name="l00265"></a><span class="lineno"> 265</span>  <span class="keywordflow">return</span> cacheMap[<a class="code" href="cJSON_8cpp.html#a3f9a0d3265a6254722587175dac3e4dc">type</a>];</div><div class="line"><a name="l00266"></a><span class="lineno"> 266</span> }</div><div class="line"><a name="l00267"></a><span class="lineno"> 267</span> </div><div class="line"><a name="l00268"></a><span class="lineno"><a class="line" href="classSVF_1_1DCHGraph.html#ab96874bc8f6461fe0c3eb53b7f5cedce"> 268</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1DCHGraph.html#ab96874bc8f6461fe0c3eb53b7f5cedce">DCHGraph::flatten</a>(<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#aded9b991c77acc5284ccead0739e84f1">DICompositeType</a> *<a class="code" href="cJSON_8cpp.html#a3f9a0d3265a6254722587175dac3e4dc">type</a>)</div><div class="line"><a name="l00269"></a><span class="lineno"> 269</span> {</div><div class="line"><a name="l00270"></a><span class="lineno"> 270</span>  type = <a class="code" href="namespaceSVF_1_1SVFUtil.html#af6e96694d983643a66c238cce01bff0e">SVFUtil::dyn_cast</a><<a class="code" href="namespaceSVF.html#aded9b991c77acc5284ccead0739e84f1">DICompositeType</a>>(<a class="code" href="classSVF_1_1DCHGraph.html#a079feacdcc3783f4a9108a3b2d2aed2c">getCanonicalType</a>(type));</div><div class="line"><a name="l00271"></a><span class="lineno"> 271</span>  assert(type && <span class="stringliteral">"DCHG::flatten: canon type of struct/class is not struct/class"</span>);</div><div class="line"><a name="l00272"></a><span class="lineno"> 272</span>  <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1DCHGraph.html#a574ec14099f1112b394b00a79f3fdf1a">fieldTypes</a>.find(type) != <a class="code" href="classSVF_1_1DCHGraph.html#a574ec14099f1112b394b00a79f3fdf1a">fieldTypes</a>.end())</div><div class="line"><a name="l00273"></a><span class="lineno"> 273</span>  {</div><div class="line"><a name="l00274"></a><span class="lineno"> 274</span>  <span class="comment">// Already done (necessary because of the recursion).</span></div><div class="line"><a name="l00275"></a><span class="lineno"> 275</span>  <span class="keywordflow">return</span>;</div><div class="line"><a name="l00276"></a><span class="lineno"> 276</span>  }</div><div class="line"><a name="l00277"></a><span class="lineno"> 277</span> </div><div class="line"><a name="l00278"></a><span class="lineno"> 278</span>  <span class="comment">// Create empty vector.</span></div><div class="line"><a name="l00279"></a><span class="lineno"> 279</span>  <a class="code" href="classSVF_1_1DCHGraph.html#a574ec14099f1112b394b00a79f3fdf1a">fieldTypes</a>[<a class="code" href="cJSON_8cpp.html#a3f9a0d3265a6254722587175dac3e4dc">type</a>];</div><div class="line"><a name="l00280"></a><span class="lineno"> 280</span> </div><div class="line"><a name="l00281"></a><span class="lineno"> 281</span>  assert(type != <span class="keyword">nullptr</span></div><div class="line"><a name="l00282"></a><span class="lineno"> 282</span>  && (type->getTag() == dwarf::DW_TAG_class_type</div><div class="line"><a name="l00283"></a><span class="lineno"> 283</span>  || type->getTag() == dwarf::DW_TAG_structure_type)</div><div class="line"><a name="l00284"></a><span class="lineno"> 284</span>  && <span class="stringliteral">"DCHG::flatten: expected a class/struct"</span>);</div><div class="line"><a name="l00285"></a><span class="lineno"> 285</span> </div><div class="line"><a name="l00286"></a><span class="lineno"> 286</span>  <span class="comment">// Sort the fields from getElements. Especially a problem for classes; it's all jumbled up.</span></div><div class="line"><a name="l00287"></a><span class="lineno"> 287</span>  std::vector<const DIDerivedType *> fields;</div><div class="line"><a name="l00288"></a><span class="lineno"> 288</span>  <a class="code" href="namespaceSVF.html#a0f825e73d115173b05ca54fb8ec65003">DINodeArray</a> fieldsDINA = type->getElements();</div><div class="line"><a name="l00289"></a><span class="lineno"> 289</span>  <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> i = 0; i < fieldsDINA.size(); ++i)</div><div class="line"><a name="l00290"></a><span class="lineno"> 290</span>  {</div><div class="line"><a name="l00291"></a><span class="lineno"> 291</span>  <span class="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a852e75c562139237fcc754c7461533e6">DIDerivedType</a> *dt = SVFUtil::dyn_cast<DIDerivedType>(fieldsDINA[i]))</div><div class="line"><a name="l00292"></a><span class="lineno"> 292</span>  {</div><div class="line"><a name="l00293"></a><span class="lineno"> 293</span>  <span class="comment">// Don't care about subprograms, only member/inheritance.</span></div><div class="line"><a name="l00294"></a><span class="lineno"> 294</span>  fields.push_back(dt);</div><div class="line"><a name="l00295"></a><span class="lineno"> 295</span>  }</div><div class="line"><a name="l00296"></a><span class="lineno"> 296</span>  }</div><div class="line"><a name="l00297"></a><span class="lineno"> 297</span> </div><div class="line"><a name="l00298"></a><span class="lineno"> 298</span>  <span class="comment">// TODO: virtual inheritance is not handled at all!</span></div><div class="line"><a name="l00299"></a><span class="lineno"> 299</span>  std::sort(fields.begin(), fields.end(),</div><div class="line"><a name="l00300"></a><span class="lineno"> 300</span>  [](<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a852e75c562139237fcc754c7461533e6">DIDerivedType</a> *&<a class="code" href="cJSON_8cpp.html#a8a1a0a26c50cc4becfc754bb68d1dc6b">a</a>, <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a852e75c562139237fcc754c7461533e6">DIDerivedType</a> *&<a class="code" href="cJSON_8h.html#a1a175e87536301df98c805ac0636ad7c">b</a>) -> <span class="keywordtype">bool</span></div><div class="line"><a name="l00301"></a><span class="lineno"> 301</span>  { <span class="keywordflow">return</span> a->getOffsetInBits() < <a class="code" href="cJSON_8h.html#a1a175e87536301df98c805ac0636ad7c">b</a>->getOffsetInBits(); });</div><div class="line"><a name="l00302"></a><span class="lineno"> 302</span> </div><div class="line"><a name="l00303"></a><span class="lineno"> 303</span>  <span class="keywordflow">for</span> (<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a852e75c562139237fcc754c7461533e6">DIDerivedType</a> *mt : fields)</div><div class="line"><a name="l00304"></a><span class="lineno"> 304</span>  {</div><div class="line"><a name="l00305"></a><span class="lineno"> 305</span>  assert((mt->getTag() == dwarf::DW_TAG_member || mt->getTag() == dwarf::DW_TAG_inheritance)</div><div class="line"><a name="l00306"></a><span class="lineno"> 306</span>  && <span class="stringliteral">"DCHG: expected member/inheritance"</span>);</div><div class="line"><a name="l00307"></a><span class="lineno"> 307</span>  <span class="comment">// Either we have a class, struct, array, or something not in need of flattening.</span></div><div class="line"><a name="l00308"></a><span class="lineno"> 308</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#ad127b0ad478640ede3d426e3a58d2632">DIType</a> *fieldType = mt->getBaseType();</div><div class="line"><a name="l00309"></a><span class="lineno"> 309</span>  <span class="keywordflow">if</span> (fieldType->getTag() == dwarf::DW_TAG_structure_type</div><div class="line"><a name="l00310"></a><span class="lineno"> 310</span>  || fieldType->getTag() == dwarf::DW_TAG_class_type)</div><div class="line"><a name="l00311"></a><span class="lineno"> 311</span>  {</div><div class="line"><a name="l00312"></a><span class="lineno"> 312</span>  <a class="code" href="classSVF_1_1DCHGraph.html#ab96874bc8f6461fe0c3eb53b7f5cedce">flatten</a>(SVFUtil::dyn_cast<DICompositeType>(fieldType));</div><div class="line"><a name="l00313"></a><span class="lineno"> 313</span>  <span class="keywordflow">for</span> (<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#ad127b0ad478640ede3d426e3a58d2632">DIType</a> *ft : <a class="code" href="classSVF_1_1DCHGraph.html#a574ec14099f1112b394b00a79f3fdf1a">fieldTypes</a>[fieldType])</div><div class="line"><a name="l00314"></a><span class="lineno"> 314</span>  {</div><div class="line"><a name="l00315"></a><span class="lineno"> 315</span>  <span class="comment">// ft is already a canonical type because the "root" additions insert</span></div><div class="line"><a name="l00316"></a><span class="lineno"> 316</span>  <span class="comment">// canonical types.</span></div><div class="line"><a name="l00317"></a><span class="lineno"> 317</span>  <a class="code" href="classSVF_1_1DCHGraph.html#a574ec14099f1112b394b00a79f3fdf1a">fieldTypes</a>[<a class="code" href="cJSON_8cpp.html#a3f9a0d3265a6254722587175dac3e4dc">type</a>].push_back(ft);</div><div class="line"><a name="l00318"></a><span class="lineno"> 318</span>  }</div><div class="line"><a name="l00319"></a><span class="lineno"> 319</span>  }</div><div class="line"><a name="l00320"></a><span class="lineno"> 320</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (fieldType->getTag() == dwarf::DW_TAG_array_type)</div><div class="line"><a name="l00321"></a><span class="lineno"> 321</span>  {</div><div class="line"><a name="l00322"></a><span class="lineno"> 322</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#aded9b991c77acc5284ccead0739e84f1">DICompositeType</a> *arrayType = <a class="code" href="namespaceSVF_1_1SVFUtil.html#af6e96694d983643a66c238cce01bff0e">SVFUtil::dyn_cast</a><<a class="code" href="namespaceSVF.html#aded9b991c77acc5284ccead0739e84f1">DICompositeType</a>>(fieldType);</div><div class="line"><a name="l00323"></a><span class="lineno"> 323</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#ad127b0ad478640ede3d426e3a58d2632">DIType</a> *baseType = arrayType->getBaseType();</div><div class="line"><a name="l00324"></a><span class="lineno"> 324</span>  <span class="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#aded9b991c77acc5284ccead0739e84f1">DICompositeType</a> *cbt = SVFUtil::dyn_cast<DICompositeType>(baseType))</div><div class="line"><a name="l00325"></a><span class="lineno"> 325</span>  {</div><div class="line"><a name="l00326"></a><span class="lineno"> 326</span>  <a class="code" href="classSVF_1_1DCHGraph.html#ab96874bc8f6461fe0c3eb53b7f5cedce">flatten</a>(cbt);</div><div class="line"><a name="l00327"></a><span class="lineno"> 327</span>  <span class="keywordflow">for</span> (<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#ad127b0ad478640ede3d426e3a58d2632">DIType</a> *ft : <a class="code" href="classSVF_1_1DCHGraph.html#a574ec14099f1112b394b00a79f3fdf1a">fieldTypes</a>[cbt])</div><div class="line"><a name="l00328"></a><span class="lineno"> 328</span>  {</div><div class="line"><a name="l00329"></a><span class="lineno"> 329</span>  <span class="comment">// ft is already a canonical type like above.</span></div><div class="line"><a name="l00330"></a><span class="lineno"> 330</span>  <a class="code" href="classSVF_1_1DCHGraph.html#a574ec14099f1112b394b00a79f3fdf1a">fieldTypes</a>[<a class="code" href="cJSON_8cpp.html#a3f9a0d3265a6254722587175dac3e4dc">type</a>].push_back(ft);</div><div class="line"><a name="l00331"></a><span class="lineno"> 331</span>  }</div><div class="line"><a name="l00332"></a><span class="lineno"> 332</span>  }</div><div class="line"><a name="l00333"></a><span class="lineno"> 333</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l00334"></a><span class="lineno"> 334</span>  {</div><div class="line"><a name="l00335"></a><span class="lineno"> 335</span>  <a class="code" href="classSVF_1_1DCHGraph.html#a574ec14099f1112b394b00a79f3fdf1a">fieldTypes</a>[<a class="code" href="cJSON_8cpp.html#a3f9a0d3265a6254722587175dac3e4dc">type</a>].push_back(<a class="code" href="classSVF_1_1DCHGraph.html#a079feacdcc3783f4a9108a3b2d2aed2c">getCanonicalType</a>(baseType));</div><div class="line"><a name="l00336"></a><span class="lineno"> 336</span>  }</div><div class="line"><a name="l00337"></a><span class="lineno"> 337</span>  }</div><div class="line"><a name="l00338"></a><span class="lineno"> 338</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l00339"></a><span class="lineno"> 339</span>  {</div><div class="line"><a name="l00340"></a><span class="lineno"> 340</span>  <a class="code" href="classSVF_1_1DCHGraph.html#a574ec14099f1112b394b00a79f3fdf1a">fieldTypes</a>[<a class="code" href="cJSON_8cpp.html#a3f9a0d3265a6254722587175dac3e4dc">type</a>].push_back(<a class="code" href="classSVF_1_1DCHGraph.html#a079feacdcc3783f4a9108a3b2d2aed2c">getCanonicalType</a>(fieldType));</div><div class="line"><a name="l00341"></a><span class="lineno"> 341</span>  }</div><div class="line"><a name="l00342"></a><span class="lineno"> 342</span>  }</div><div class="line"><a name="l00343"></a><span class="lineno"> 343</span> }</div><div class="line"><a name="l00344"></a><span class="lineno"> 344</span> </div><div class="line"><a name="l00345"></a><span class="lineno"><a class="line" href="classSVF_1_1DCHGraph.html#a9d2be5aec5216cbc1d1709b41f79c44b"> 345</a></span> <span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1DCHGraph.html#a9d2be5aec5216cbc1d1709b41f79c44b">DCHGraph::isAgg</a>(<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#ad127b0ad478640ede3d426e3a58d2632">DIType</a> *t)</div><div class="line"><a name="l00346"></a><span class="lineno"> 346</span> {</div><div class="line"><a name="l00347"></a><span class="lineno"> 347</span>  <span class="keywordflow">if</span> (t == <span class="keyword">nullptr</span>) <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l00348"></a><span class="lineno"> 348</span>  <span class="keywordflow">return</span> t->getTag() == dwarf::DW_TAG_array_type</div><div class="line"><a name="l00349"></a><span class="lineno"> 349</span>  || t->getTag() == dwarf::DW_TAG_structure_type</div><div class="line"><a name="l00350"></a><span class="lineno"> 350</span>  || t->getTag() == dwarf::DW_TAG_class_type;</div><div class="line"><a name="l00351"></a><span class="lineno"> 351</span> }</div><div class="line"><a name="l00352"></a><span class="lineno"> 352</span> </div><div class="line"><a name="l00353"></a><span class="lineno"><a class="line" href="classSVF_1_1DCHGraph.html#a8fcbea9435a77beb27ad64d5a3175b0b"> 353</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1DCHGraph.html#a8fcbea9435a77beb27ad64d5a3175b0b">DCHGraph::gatherAggs</a>(<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#aded9b991c77acc5284ccead0739e84f1">DICompositeType</a> *<a class="code" href="cJSON_8cpp.html#a3f9a0d3265a6254722587175dac3e4dc">type</a>)</div><div class="line"><a name="l00354"></a><span class="lineno"> 354</span> {</div><div class="line"><a name="l00355"></a><span class="lineno"> 355</span>  <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1DCHGraph.html#adc7a17f70ac3fa89624ad874dbd16ff9">containingAggs</a>.find(<a class="code" href="classSVF_1_1DCHGraph.html#a079feacdcc3783f4a9108a3b2d2aed2c">getCanonicalType</a>(type)) != <a class="code" href="classSVF_1_1DCHGraph.html#adc7a17f70ac3fa89624ad874dbd16ff9">containingAggs</a>.end())</div><div class="line"><a name="l00356"></a><span class="lineno"> 356</span>  {</div><div class="line"><a name="l00357"></a><span class="lineno"> 357</span>  <span class="keywordflow">return</span>;</div><div class="line"><a name="l00358"></a><span class="lineno"> 358</span>  }</div><div class="line"><a name="l00359"></a><span class="lineno"> 359</span> </div><div class="line"><a name="l00360"></a><span class="lineno"> 360</span>  <span class="comment">// Initialise an empty set. We want all aggregates to have a value in</span></div><div class="line"><a name="l00361"></a><span class="lineno"> 361</span>  <span class="comment">// this map, even if empty (e.g. struct has no aggs, only scalars).</span></div><div class="line"><a name="l00362"></a><span class="lineno"> 362</span>  <a class="code" href="classSVF_1_1DCHGraph.html#adc7a17f70ac3fa89624ad874dbd16ff9">containingAggs</a>[<a class="code" href="classSVF_1_1DCHGraph.html#a079feacdcc3783f4a9108a3b2d2aed2c">getCanonicalType</a>(type)];</div><div class="line"><a name="l00363"></a><span class="lineno"> 363</span> </div><div class="line"><a name="l00364"></a><span class="lineno"> 364</span>  <span class="keywordflow">if</span> (type->getTag() == dwarf::DW_TAG_array_type)</div><div class="line"><a name="l00365"></a><span class="lineno"> 365</span>  {</div><div class="line"><a name="l00366"></a><span class="lineno"> 366</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#ad127b0ad478640ede3d426e3a58d2632">DIType</a> *bt = type->getBaseType();</div><div class="line"><a name="l00367"></a><span class="lineno"> 367</span>  bt = <a class="code" href="classSVF_1_1DCHGraph.html#a175ed6ad0c9b23d5617f755ab96c76c4">stripQualifiers</a>(bt);</div><div class="line"><a name="l00368"></a><span class="lineno"> 368</span> </div><div class="line"><a name="l00369"></a><span class="lineno"> 369</span>  <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1DCHGraph.html#a9d2be5aec5216cbc1d1709b41f79c44b">isAgg</a>(bt))</div><div class="line"><a name="l00370"></a><span class="lineno"> 370</span>  {</div><div class="line"><a name="l00371"></a><span class="lineno"> 371</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#aded9b991c77acc5284ccead0739e84f1">DICompositeType</a> *cbt = <a class="code" href="namespaceSVF_1_1SVFUtil.html#af6e96694d983643a66c238cce01bff0e">SVFUtil::dyn_cast</a><<a class="code" href="namespaceSVF.html#aded9b991c77acc5284ccead0739e84f1">DICompositeType</a>>(bt);</div><div class="line"><a name="l00372"></a><span class="lineno"> 372</span>  <a class="code" href="classSVF_1_1DCHGraph.html#adc7a17f70ac3fa89624ad874dbd16ff9">containingAggs</a>[<a class="code" href="classSVF_1_1DCHGraph.html#a079feacdcc3783f4a9108a3b2d2aed2c">getCanonicalType</a>(type)].insert(<a class="code" href="classSVF_1_1DCHGraph.html#a079feacdcc3783f4a9108a3b2d2aed2c">getCanonicalType</a>(cbt));</div><div class="line"><a name="l00373"></a><span class="lineno"> 373</span>  <a class="code" href="classSVF_1_1DCHGraph.html#a8fcbea9435a77beb27ad64d5a3175b0b">gatherAggs</a>(cbt);</div><div class="line"><a name="l00374"></a><span class="lineno"> 374</span>  <span class="comment">// These must be canonical already because of aggs.insert above/below.</span></div><div class="line"><a name="l00375"></a><span class="lineno"> 375</span>  <a class="code" href="classSVF_1_1DCHGraph.html#adc7a17f70ac3fa89624ad874dbd16ff9">containingAggs</a>[<a class="code" href="classSVF_1_1DCHGraph.html#a079feacdcc3783f4a9108a3b2d2aed2c">getCanonicalType</a>(type)].insert(</div><div class="line"><a name="l00376"></a><span class="lineno"> 376</span>  <a class="code" href="classSVF_1_1DCHGraph.html#adc7a17f70ac3fa89624ad874dbd16ff9">containingAggs</a>[<a class="code" href="classSVF_1_1DCHGraph.html#a079feacdcc3783f4a9108a3b2d2aed2c">getCanonicalType</a>(cbt)].<a class="code" href="classSVF_1_1GenericGraph.html#a0d9744b1b0e7a09a6f7af29188e243b7">begin</a>(),</div><div class="line"><a name="l00377"></a><span class="lineno"> 377</span>  <a class="code" href="classSVF_1_1DCHGraph.html#adc7a17f70ac3fa89624ad874dbd16ff9">containingAggs</a>[<a class="code" href="classSVF_1_1DCHGraph.html#a079feacdcc3783f4a9108a3b2d2aed2c">getCanonicalType</a>(cbt)].<a class="code" href="classSVF_1_1GenericGraph.html#a4bef15157423cef48dc7333a803cd27d">end</a>());</div><div class="line"><a name="l00378"></a><span class="lineno"> 378</span>  }</div><div class="line"><a name="l00379"></a><span class="lineno"> 379</span>  }</div><div class="line"><a name="l00380"></a><span class="lineno"> 380</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l00381"></a><span class="lineno"> 381</span>  {</div><div class="line"><a name="l00382"></a><span class="lineno"> 382</span>  <a class="code" href="namespaceSVF.html#a0f825e73d115173b05ca54fb8ec65003">DINodeArray</a> fields = type->getElements();</div><div class="line"><a name="l00383"></a><span class="lineno"> 383</span>  <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> i = 0; i < fields.size(); ++i)</div><div class="line"><a name="l00384"></a><span class="lineno"> 384</span>  {</div><div class="line"><a name="l00385"></a><span class="lineno"> 385</span>  <span class="comment">// Unwrap the member (could be a subprogram, not type, so guard needed).</span></div><div class="line"><a name="l00386"></a><span class="lineno"> 386</span>  <span class="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a852e75c562139237fcc754c7461533e6">DIDerivedType</a> *mt = SVFUtil::dyn_cast<DIDerivedType>(fields[i]))</div><div class="line"><a name="l00387"></a><span class="lineno"> 387</span>  {</div><div class="line"><a name="l00388"></a><span class="lineno"> 388</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#ad127b0ad478640ede3d426e3a58d2632">DIType</a> *ft = mt->getBaseType();</div><div class="line"><a name="l00389"></a><span class="lineno"> 389</span>  ft = <a class="code" href="classSVF_1_1DCHGraph.html#a175ed6ad0c9b23d5617f755ab96c76c4">stripQualifiers</a>(ft);</div><div class="line"><a name="l00390"></a><span class="lineno"> 390</span> </div><div class="line"><a name="l00391"></a><span class="lineno"> 391</span>  <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1DCHGraph.html#a9d2be5aec5216cbc1d1709b41f79c44b">isAgg</a>(ft))</div><div class="line"><a name="l00392"></a><span class="lineno"> 392</span>  {</div><div class="line"><a name="l00393"></a><span class="lineno"> 393</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#aded9b991c77acc5284ccead0739e84f1">DICompositeType</a> *cft = <a class="code" href="namespaceSVF_1_1SVFUtil.html#af6e96694d983643a66c238cce01bff0e">SVFUtil::dyn_cast</a><<a class="code" href="namespaceSVF.html#aded9b991c77acc5284ccead0739e84f1">DICompositeType</a>>(ft);</div><div class="line"><a name="l00394"></a><span class="lineno"> 394</span>  <a class="code" href="classSVF_1_1DCHGraph.html#adc7a17f70ac3fa89624ad874dbd16ff9">containingAggs</a>[<a class="code" href="classSVF_1_1DCHGraph.html#a079feacdcc3783f4a9108a3b2d2aed2c">getCanonicalType</a>(type)].insert(<a class="code" href="classSVF_1_1DCHGraph.html#a079feacdcc3783f4a9108a3b2d2aed2c">getCanonicalType</a>(cft));</div><div class="line"><a name="l00395"></a><span class="lineno"> 395</span>  <a class="code" href="classSVF_1_1DCHGraph.html#a8fcbea9435a77beb27ad64d5a3175b0b">gatherAggs</a>(cft);</div><div class="line"><a name="l00396"></a><span class="lineno"> 396</span>  <span class="comment">// These must be canonical already because of aggs.insert above.</span></div><div class="line"><a name="l00397"></a><span class="lineno"> 397</span>  <a class="code" href="classSVF_1_1DCHGraph.html#adc7a17f70ac3fa89624ad874dbd16ff9">containingAggs</a>[<a class="code" href="classSVF_1_1DCHGraph.html#a079feacdcc3783f4a9108a3b2d2aed2c">getCanonicalType</a>(type)].insert(</div><div class="line"><a name="l00398"></a><span class="lineno"> 398</span>  <a class="code" href="classSVF_1_1DCHGraph.html#adc7a17f70ac3fa89624ad874dbd16ff9">containingAggs</a>[<a class="code" href="classSVF_1_1DCHGraph.html#a079feacdcc3783f4a9108a3b2d2aed2c">getCanonicalType</a>(cft)].<a class="code" href="classSVF_1_1GenericGraph.html#a0d9744b1b0e7a09a6f7af29188e243b7">begin</a>(),</div><div class="line"><a name="l00399"></a><span class="lineno"> 399</span>  <a class="code" href="classSVF_1_1DCHGraph.html#adc7a17f70ac3fa89624ad874dbd16ff9">containingAggs</a>[<a class="code" href="classSVF_1_1DCHGraph.html#a079feacdcc3783f4a9108a3b2d2aed2c">getCanonicalType</a>(cft)].<a class="code" href="classSVF_1_1GenericGraph.html#a4bef15157423cef48dc7333a803cd27d">end</a>());</div><div class="line"><a name="l00400"></a><span class="lineno"> 400</span>  }</div><div class="line"><a name="l00401"></a><span class="lineno"> 401</span>  }</div><div class="line"><a name="l00402"></a><span class="lineno"> 402</span>  }</div><div class="line"><a name="l00403"></a><span class="lineno"> 403</span>  }</div><div class="line"><a name="l00404"></a><span class="lineno"> 404</span> }</div><div class="line"><a name="l00405"></a><span class="lineno"> 405</span> </div><div class="line"><a name="l00406"></a><span class="lineno"><a class="line" href="classSVF_1_1DCHGraph.html#a9ed6b91fad334605f514049a2072b538"> 406</a></span> <a class="code" href="classSVF_1_1DCHNode.html">DCHNode</a> *<a class="code" href="classSVF_1_1DCHGraph.html#a9ed6b91fad334605f514049a2072b538">DCHGraph::getOrCreateNode</a>(<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#ad127b0ad478640ede3d426e3a58d2632">DIType</a> *<a class="code" href="cJSON_8cpp.html#a3f9a0d3265a6254722587175dac3e4dc">type</a>)</div><div class="line"><a name="l00407"></a><span class="lineno"> 407</span> {</div><div class="line"><a name="l00408"></a><span class="lineno"> 408</span>  type = <a class="code" href="classSVF_1_1DCHGraph.html#a079feacdcc3783f4a9108a3b2d2aed2c">getCanonicalType</a>(type);</div><div class="line"><a name="l00409"></a><span class="lineno"> 409</span> </div><div class="line"><a name="l00410"></a><span class="lineno"> 410</span>  <span class="comment">// Check, does the node for type exist?</span></div><div class="line"><a name="l00411"></a><span class="lineno"> 411</span>  <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1DCHGraph.html#a581ce71cbc7994f71c9a6b9b145d3b9f">diTypeToNodeMap</a>[type] != <span class="keyword">nullptr</span>)</div><div class="line"><a name="l00412"></a><span class="lineno"> 412</span>  {</div><div class="line"><a name="l00413"></a><span class="lineno"> 413</span>  <span class="keywordflow">return</span> <a class="code" href="classSVF_1_1DCHGraph.html#a581ce71cbc7994f71c9a6b9b145d3b9f">diTypeToNodeMap</a>[<a class="code" href="cJSON_8cpp.html#a3f9a0d3265a6254722587175dac3e4dc">type</a>];</div><div class="line"><a name="l00414"></a><span class="lineno"> 414</span>  }</div><div class="line"><a name="l00415"></a><span class="lineno"> 415</span> </div><div class="line"><a name="l00416"></a><span class="lineno"> 416</span>  <a class="code" href="classSVF_1_1DCHNode.html">DCHNode</a> *node = <span class="keyword">new</span> <a class="code" href="classSVF_1_1DCHNode.html">DCHNode</a>(type, <a class="code" href="classSVF_1_1DCHGraph.html#a76fd3154a31584bb64683f2d762cc56c">numTypes</a>++);</div><div class="line"><a name="l00417"></a><span class="lineno"> 417</span>  <a class="code" href="classSVF_1_1GenericGraph.html#a0a8831a5429005ff9d71adbd6bf3994f">addGNode</a>(node-><a class="code" href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">getId</a>(), node);</div><div class="line"><a name="l00418"></a><span class="lineno"> 418</span>  <a class="code" href="classSVF_1_1DCHGraph.html#a581ce71cbc7994f71c9a6b9b145d3b9f">diTypeToNodeMap</a>[<a class="code" href="cJSON_8cpp.html#a3f9a0d3265a6254722587175dac3e4dc">type</a>] = node;</div><div class="line"><a name="l00419"></a><span class="lineno"> 419</span>  <span class="comment">// TODO: handle templates.</span></div><div class="line"><a name="l00420"></a><span class="lineno"> 420</span> </div><div class="line"><a name="l00421"></a><span class="lineno"> 421</span>  <span class="keywordflow">return</span> node;</div><div class="line"><a name="l00422"></a><span class="lineno"> 422</span> }</div><div class="line"><a name="l00423"></a><span class="lineno"> 423</span> </div><div class="line"><a name="l00424"></a><span class="lineno"><a class="line" href="classSVF_1_1DCHGraph.html#a294a2075c97e1db8003393fb472c1def"> 424</a></span> <a class="code" href="classSVF_1_1DCHEdge.html">DCHEdge</a> *<a class="code" href="classSVF_1_1DCHGraph.html#a294a2075c97e1db8003393fb472c1def">DCHGraph::addEdge</a>(<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#ad127b0ad478640ede3d426e3a58d2632">DIType</a> *t1, <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#ad127b0ad478640ede3d426e3a58d2632">DIType</a> *t2, <a class="code" href="classSVF_1_1GenericEdge.html#a5aceeb48929f54264807b36569019a8a">DCHEdge::GEdgeKind</a> et)</div><div class="line"><a name="l00425"></a><span class="lineno"> 425</span> {</div><div class="line"><a name="l00426"></a><span class="lineno"> 426</span>  <a class="code" href="classSVF_1_1DCHNode.html">DCHNode</a> *src = <a class="code" href="classSVF_1_1DCHGraph.html#a9ed6b91fad334605f514049a2072b538">getOrCreateNode</a>(t1);</div><div class="line"><a name="l00427"></a><span class="lineno"> 427</span>  <a class="code" href="classSVF_1_1DCHNode.html">DCHNode</a> *dst = <a class="code" href="classSVF_1_1DCHGraph.html#a9ed6b91fad334605f514049a2072b538">getOrCreateNode</a>(t2);</div><div class="line"><a name="l00428"></a><span class="lineno"> 428</span> </div><div class="line"><a name="l00429"></a><span class="lineno"> 429</span>  <a class="code" href="classSVF_1_1DCHEdge.html">DCHEdge</a> *edge = <a class="code" href="classSVF_1_1DCHGraph.html#a74b2e5787f65cf3e3b4a03ebec806b91">hasEdge</a>(t1, t2, et);</div><div class="line"><a name="l00430"></a><span class="lineno"> 430</span>  <span class="keywordflow">if</span> (edge == <span class="keyword">nullptr</span>)</div><div class="line"><a name="l00431"></a><span class="lineno"> 431</span>  {</div><div class="line"><a name="l00432"></a><span class="lineno"> 432</span>  <span class="comment">// Create a new edge.</span></div><div class="line"><a name="l00433"></a><span class="lineno"> 433</span>  edge = <span class="keyword">new</span> <a class="code" href="classSVF_1_1DCHEdge.html">DCHEdge</a>(src, dst, et);</div><div class="line"><a name="l00434"></a><span class="lineno"> 434</span>  src-><a class="code" href="classSVF_1_1GenericNode.html#ae74283fbc788665296a69e56f334557b">addOutgoingEdge</a>(edge);</div><div class="line"><a name="l00435"></a><span class="lineno"> 435</span>  dst-><a class="code" href="classSVF_1_1GenericNode.html#a93d217b0c9fd8008a2989ca2b4f3fbfb">addIncomingEdge</a>(edge);</div><div class="line"><a name="l00436"></a><span class="lineno"> 436</span>  }</div><div class="line"><a name="l00437"></a><span class="lineno"> 437</span> </div><div class="line"><a name="l00438"></a><span class="lineno"> 438</span>  <span class="keywordflow">return</span> edge;</div><div class="line"><a name="l00439"></a><span class="lineno"> 439</span> }</div><div class="line"><a name="l00440"></a><span class="lineno"> 440</span> </div><div class="line"><a name="l00441"></a><span class="lineno"><a class="line" href="classSVF_1_1DCHGraph.html#a74b2e5787f65cf3e3b4a03ebec806b91"> 441</a></span> <a class="code" href="classSVF_1_1DCHEdge.html">DCHEdge</a> *<a class="code" href="classSVF_1_1DCHGraph.html#a74b2e5787f65cf3e3b4a03ebec806b91">DCHGraph::hasEdge</a>(<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#ad127b0ad478640ede3d426e3a58d2632">DIType</a> *t1, <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#ad127b0ad478640ede3d426e3a58d2632">DIType</a> *t2, <a class="code" href="classSVF_1_1GenericEdge.html#a5aceeb48929f54264807b36569019a8a">DCHEdge::GEdgeKind</a> et)</div><div class="line"><a name="l00442"></a><span class="lineno"> 442</span> {</div><div class="line"><a name="l00443"></a><span class="lineno"> 443</span>  <a class="code" href="classSVF_1_1DCHNode.html">DCHNode</a> *src = <a class="code" href="classSVF_1_1DCHGraph.html#a9ed6b91fad334605f514049a2072b538">getOrCreateNode</a>(t1);</div><div class="line"><a name="l00444"></a><span class="lineno"> 444</span>  <a class="code" href="classSVF_1_1DCHNode.html">DCHNode</a> *dst = <a class="code" href="classSVF_1_1DCHGraph.html#a9ed6b91fad334605f514049a2072b538">getOrCreateNode</a>(t2);</div><div class="line"><a name="l00445"></a><span class="lineno"> 445</span> </div><div class="line"><a name="l00446"></a><span class="lineno"> 446</span>  <span class="keywordflow">for</span> (<a class="code" href="classSVF_1_1DCHEdge.html">DCHEdge</a> *edge : src-><a class="code" href="classSVF_1_1GenericNode.html#a2d9cd758d6f8c5189d9b90b74f43e009">getOutEdges</a>())</div><div class="line"><a name="l00447"></a><span class="lineno"> 447</span>  {</div><div class="line"><a name="l00448"></a><span class="lineno"> 448</span>  <a class="code" href="classSVF_1_1DCHNode.html">DCHNode</a> *node = edge->getDstNode();</div><div class="line"><a name="l00449"></a><span class="lineno"> 449</span>  <a class="code" href="classSVF_1_1GenericEdge.html#a5aceeb48929f54264807b36569019a8a">DCHEdge::GEdgeKind</a> edgeType = edge->getEdgeKind();</div><div class="line"><a name="l00450"></a><span class="lineno"> 450</span>  <span class="keywordflow">if</span> (node == dst && edgeType == et)</div><div class="line"><a name="l00451"></a><span class="lineno"> 451</span>  {</div><div class="line"><a name="l00452"></a><span class="lineno"> 452</span>  assert(SVFUtil::isa<DCHEdge>(edge) && <span class="stringliteral">"Non-DCHEdge in DCHNode edge set."</span>);</div><div class="line"><a name="l00453"></a><span class="lineno"> 453</span>  <span class="keywordflow">return</span> edge;</div><div class="line"><a name="l00454"></a><span class="lineno"> 454</span>  }</div><div class="line"><a name="l00455"></a><span class="lineno"> 455</span>  }</div><div class="line"><a name="l00456"></a><span class="lineno"> 456</span> </div><div class="line"><a name="l00457"></a><span class="lineno"> 457</span>  <span class="keywordflow">return</span> <span class="keyword">nullptr</span>;</div><div class="line"><a name="l00458"></a><span class="lineno"> 458</span> }</div><div class="line"><a name="l00459"></a><span class="lineno"> 459</span> </div><div class="line"><a name="l00460"></a><span class="lineno"><a class="line" href="classSVF_1_1DCHGraph.html#a710c6b87fd475552eddb425e38de8889"> 460</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1DCHGraph.html#a710c6b87fd475552eddb425e38de8889">DCHGraph::buildCHG</a>(<span class="keywordtype">bool</span> extend)</div><div class="line"><a name="l00461"></a><span class="lineno"> 461</span> {</div><div class="line"><a name="l00462"></a><span class="lineno"> 462</span>  <a class="code" href="classSVF_1_1DCHGraph.html#aa6f49dfc9e3580d3f2d8c257395eb11e">extended</a> = extend;</div><div class="line"><a name="l00463"></a><span class="lineno"> 463</span>  <a class="code" href="namespaceSVF.html#a5ae98f122c64b0114df2e5861b341321">DebugInfoFinder</a> finder;</div><div class="line"><a name="l00464"></a><span class="lineno"> 464</span>  <span class="keywordflow">for</span> (<a class="code" href="namespaceSVF.html#aa7a770b5dd5cd0e37d06a1088f252906">Module</a> &M : <a class="code" href="classSVF_1_1LLVMModuleSet.html#acf40310917909e4234282c0695a43160">LLVMModuleSet::getLLVMModuleSet</a>()->getLLVMModules())</div><div class="line"><a name="l00465"></a><span class="lineno"> 465</span>  {</div><div class="line"><a name="l00466"></a><span class="lineno"> 466</span>  finder.processModule(M);</div><div class="line"><a name="l00467"></a><span class="lineno"> 467</span>  }</div><div class="line"><a name="l00468"></a><span class="lineno"> 468</span> </div><div class="line"><a name="l00469"></a><span class="lineno"> 469</span>  <span class="comment">// Create the void node regardless of whether it appears.</span></div><div class="line"><a name="l00470"></a><span class="lineno"> 470</span>  <a class="code" href="classSVF_1_1DCHGraph.html#a9ed6b91fad334605f514049a2072b538">getOrCreateNode</a>(<span class="keyword">nullptr</span>);</div><div class="line"><a name="l00471"></a><span class="lineno"> 471</span>  <span class="comment">// Find any char type.</span></div><div class="line"><a name="l00472"></a><span class="lineno"> 472</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#ad127b0ad478640ede3d426e3a58d2632">DIType</a> *charType = <span class="keyword">nullptr</span>;</div><div class="line"><a name="l00473"></a><span class="lineno"> 473</span>  <span class="comment">/*</span></div><div class="line"><a name="l00474"></a><span class="lineno"> 474</span> <span class="comment"> * We want void at the top, char as a child, and everything is a child of char:</span></div><div class="line"><a name="l00475"></a><span class="lineno"> 475</span> <span class="comment"> * void</span></div><div class="line"><a name="l00476"></a><span class="lineno"> 476</span> <span class="comment"> * |</span></div><div class="line"><a name="l00477"></a><span class="lineno"> 477</span> <span class="comment"> * char</span></div><div class="line"><a name="l00478"></a><span class="lineno"> 478</span> <span class="comment"> * / | \</span></div><div class="line"><a name="l00479"></a><span class="lineno"> 479</span> <span class="comment"> * x y z</span></div><div class="line"><a name="l00480"></a><span class="lineno"> 480</span> <span class="comment"> */</span></div><div class="line"><a name="l00481"></a><span class="lineno"> 481</span> </div><div class="line"><a name="l00482"></a><span class="lineno"> 482</span> </div><div class="line"><a name="l00483"></a><span class="lineno"> 483</span>  <span class="keywordflow">for</span> (<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#ad127b0ad478640ede3d426e3a58d2632">DIType</a> *<a class="code" href="cJSON_8cpp.html#a3f9a0d3265a6254722587175dac3e4dc">type</a> : finder.types())</div><div class="line"><a name="l00484"></a><span class="lineno"> 484</span>  {</div><div class="line"><a name="l00485"></a><span class="lineno"> 485</span>  <span class="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#ada0513be7e25325325ccc9183aeca278">DIBasicType</a> *basicType = SVFUtil::dyn_cast<DIBasicType>(<a class="code" href="cJSON_8cpp.html#a3f9a0d3265a6254722587175dac3e4dc">type</a>))</div><div class="line"><a name="l00486"></a><span class="lineno"> 486</span>  {</div><div class="line"><a name="l00487"></a><span class="lineno"> 487</span>  <span class="keywordflow">if</span> (basicType->getEncoding() == dwarf::DW_ATE_unsigned_char</div><div class="line"><a name="l00488"></a><span class="lineno"> 488</span>  || basicType->getEncoding() == dwarf::DW_ATE_signed_char)</div><div class="line"><a name="l00489"></a><span class="lineno"> 489</span>  {</div><div class="line"><a name="l00490"></a><span class="lineno"> 490</span>  charType = <a class="code" href="cJSON_8cpp.html#a3f9a0d3265a6254722587175dac3e4dc">type</a>;</div><div class="line"><a name="l00491"></a><span class="lineno"> 491</span>  }</div><div class="line"><a name="l00492"></a><span class="lineno"> 492</span> </div><div class="line"><a name="l00493"></a><span class="lineno"> 493</span>  <a class="code" href="classSVF_1_1DCHGraph.html#a86bf48776ccf53092f4cb742cf95f8eb">handleDIBasicType</a>(basicType);</div><div class="line"><a name="l00494"></a><span class="lineno"> 494</span>  }</div><div class="line"><a name="l00495"></a><span class="lineno"> 495</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#aded9b991c77acc5284ccead0739e84f1">DICompositeType</a> *compositeType = SVFUtil::dyn_cast<DICompositeType>(<a class="code" href="cJSON_8cpp.html#a3f9a0d3265a6254722587175dac3e4dc">type</a>))</div><div class="line"><a name="l00496"></a><span class="lineno"> 496</span>  {</div><div class="line"><a name="l00497"></a><span class="lineno"> 497</span>  <a class="code" href="classSVF_1_1DCHGraph.html#a3ce75cbe92a1fa7d34c6fca2d2ca1b0f">handleDICompositeType</a>(compositeType);</div><div class="line"><a name="l00498"></a><span class="lineno"> 498</span>  }</div><div class="line"><a name="l00499"></a><span class="lineno"> 499</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a852e75c562139237fcc754c7461533e6">DIDerivedType</a> *derivedType = SVFUtil::dyn_cast<DIDerivedType>(<a class="code" href="cJSON_8cpp.html#a3f9a0d3265a6254722587175dac3e4dc">type</a>))</div><div class="line"><a name="l00500"></a><span class="lineno"> 500</span>  {</div><div class="line"><a name="l00501"></a><span class="lineno"> 501</span>  <a class="code" href="classSVF_1_1DCHGraph.html#a1a4162e68b22d53e9dca73c6780ed3e5">handleDIDerivedType</a>(derivedType);</div><div class="line"><a name="l00502"></a><span class="lineno"> 502</span>  }</div><div class="line"><a name="l00503"></a><span class="lineno"> 503</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a090e0791e8c200104ed3ab6bab157129">DISubroutineType</a> *subroutineType = SVFUtil::dyn_cast<DISubroutineType>(<a class="code" href="cJSON_8cpp.html#a3f9a0d3265a6254722587175dac3e4dc">type</a>))</div><div class="line"><a name="l00504"></a><span class="lineno"> 504</span>  {</div><div class="line"><a name="l00505"></a><span class="lineno"> 505</span>  <a class="code" href="classSVF_1_1DCHGraph.html#a671f379ae54eef247b5e013478eb3f0c">handleDISubroutineType</a>(subroutineType);</div><div class="line"><a name="l00506"></a><span class="lineno"> 506</span>  }</div><div class="line"><a name="l00507"></a><span class="lineno"> 507</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l00508"></a><span class="lineno"> 508</span>  {</div><div class="line"><a name="l00509"></a><span class="lineno"> 509</span>  assert(<span class="keyword">false</span> && <span class="stringliteral">"DCHGraph::buildCHG: unexpected DIType."</span>);</div><div class="line"><a name="l00510"></a><span class="lineno"> 510</span>  }</div><div class="line"><a name="l00511"></a><span class="lineno"> 511</span>  }</div><div class="line"><a name="l00512"></a><span class="lineno"> 512</span> </div><div class="line"><a name="l00513"></a><span class="lineno"> 513</span>  <a class="code" href="classSVF_1_1DCHGraph.html#a1215db390515a30fbc416fb14d2e863f">buildVTables</a>(*(<a class="code" href="classSVF_1_1LLVMModuleSet.html#acf40310917909e4234282c0695a43160">LLVMModuleSet::getLLVMModuleSet</a>()->getSVFModule()));</div><div class="line"><a name="l00514"></a><span class="lineno"> 514</span> </div><div class="line"><a name="l00515"></a><span class="lineno"> 515</span>  <span class="comment">// Build the void/char/everything else relation.</span></div><div class="line"><a name="l00516"></a><span class="lineno"> 516</span>  <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1DCHGraph.html#aa6f49dfc9e3580d3f2d8c257395eb11e">extended</a> && charType != <span class="keyword">nullptr</span>)</div><div class="line"><a name="l00517"></a><span class="lineno"> 517</span>  {</div><div class="line"><a name="l00518"></a><span class="lineno"> 518</span>  <span class="comment">// void <-- char</span></div><div class="line"><a name="l00519"></a><span class="lineno"> 519</span>  <a class="code" href="classSVF_1_1DCHGraph.html#a294a2075c97e1db8003393fb472c1def">addEdge</a>(charType, <span class="keyword">nullptr</span>, <a class="code" href="classSVF_1_1DCHEdge.html#a48f01c4a02c4e278a1ab70b16efdef4ba8b07351616a1798fa34ec3828f485ebb">DCHEdge::STD_DEF</a>);</div><div class="line"><a name="l00520"></a><span class="lineno"> 520</span>  <span class="comment">// char <-- x, char <-- y, ...</span></div><div class="line"><a name="l00521"></a><span class="lineno"> 521</span>  <span class="keywordflow">for</span> (<a class="code" href="classSVF_1_1GenericGraph.html#ac213302cf5c7cdf3b66f7b18649d0fbc">iterator</a> nodeI = <a class="code" href="classSVF_1_1GenericGraph.html#a0d9744b1b0e7a09a6f7af29188e243b7">begin</a>(); nodeI != <a class="code" href="classSVF_1_1GenericGraph.html#a4bef15157423cef48dc7333a803cd27d">end</a>(); ++nodeI)</div><div class="line"><a name="l00522"></a><span class="lineno"> 522</span>  {</div><div class="line"><a name="l00523"></a><span class="lineno"> 523</span>  <span class="comment">// Everything without a parent gets char as a parent.</span></div><div class="line"><a name="l00524"></a><span class="lineno"> 524</span>  <span class="keywordflow">if</span> (nodeI->second->getType() != <span class="keyword">nullptr</span></div><div class="line"><a name="l00525"></a><span class="lineno"> 525</span>  && nodeI->second->getOutEdges().size() == 0)</div><div class="line"><a name="l00526"></a><span class="lineno"> 526</span>  {</div><div class="line"><a name="l00527"></a><span class="lineno"> 527</span>  <a class="code" href="classSVF_1_1DCHGraph.html#a294a2075c97e1db8003393fb472c1def">addEdge</a>(nodeI->second->getType(), charType, <a class="code" href="classSVF_1_1DCHEdge.html#a48f01c4a02c4e278a1ab70b16efdef4ba8b07351616a1798fa34ec3828f485ebb">DCHEdge::STD_DEF</a>);</div><div class="line"><a name="l00528"></a><span class="lineno"> 528</span>  }</div><div class="line"><a name="l00529"></a><span class="lineno"> 529</span>  }</div><div class="line"><a name="l00530"></a><span class="lineno"> 530</span>  }</div><div class="line"><a name="l00531"></a><span class="lineno"> 531</span> </div><div class="line"><a name="l00532"></a><span class="lineno"> 532</span>  <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1Options.html#adf6c289ef9f2d0196984dd4024ea4316">Options::PrintDCHG</a>)</div><div class="line"><a name="l00533"></a><span class="lineno"> 533</span>  {</div><div class="line"><a name="l00534"></a><span class="lineno"> 534</span>  <a class="code" href="classSVF_1_1DCHGraph.html#a5f08ed4cbba3e4b7a348d5ad77664726">print</a>();</div><div class="line"><a name="l00535"></a><span class="lineno"> 535</span>  }</div><div class="line"><a name="l00536"></a><span class="lineno"> 536</span> }</div><div class="line"><a name="l00537"></a><span class="lineno"> 537</span> </div><div class="line"><a name="l00538"></a><span class="lineno"><a class="line" href="classSVF_1_1DCHGraph.html#ad398e58286af020fb4dcc03644f2a24f"> 538</a></span> <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#ad2b487757f1e1a1d81073120fc1d49c7">VFunSet</a> &<a class="code" href="classSVF_1_1DCHGraph.html#ad398e58286af020fb4dcc03644f2a24f">DCHGraph::getCSVFsBasedonCHA</a>(<a class="code" href="classSVF_1_1CallSite.html">CallSite</a> cs)</div><div class="line"><a name="l00539"></a><span class="lineno"> 539</span> {</div><div class="line"><a name="l00540"></a><span class="lineno"> 540</span>  <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1DCHGraph.html#ad79a569e77f94fa8494eed3f18e07e90">csCHAMap</a>.find(cs) != <a class="code" href="classSVF_1_1DCHGraph.html#ad79a569e77f94fa8494eed3f18e07e90">csCHAMap</a>.end())</div><div class="line"><a name="l00541"></a><span class="lineno"> 541</span>  {</div><div class="line"><a name="l00542"></a><span class="lineno"> 542</span>  <span class="keywordflow">return</span> <a class="code" href="classSVF_1_1DCHGraph.html#ad79a569e77f94fa8494eed3f18e07e90">csCHAMap</a>[cs];</div><div class="line"><a name="l00543"></a><span class="lineno"> 543</span>  }</div><div class="line"><a name="l00544"></a><span class="lineno"> 544</span> </div><div class="line"><a name="l00545"></a><span class="lineno"> 545</span>  <a class="code" href="namespaceSVF.html#ad2b487757f1e1a1d81073120fc1d49c7">VFunSet</a> vfns;</div><div class="line"><a name="l00546"></a><span class="lineno"> 546</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a340a9e77adc2bbfdee79e22da9ead234">VTableSet</a> &vtbls = <a class="code" href="classSVF_1_1DCHGraph.html#a3383b841bb79ee39cb108b9906fca6a9">getCSVtblsBasedonCHA</a>(cs);</div><div class="line"><a name="l00547"></a><span class="lineno"> 547</span>  <a class="code" href="classSVF_1_1DCHGraph.html#a6a5d012fda005d45bf3196d1a7d2c6fa">getVFnsFromVtbls</a>(cs, vtbls, vfns);</div><div class="line"><a name="l00548"></a><span class="lineno"> 548</span> </div><div class="line"><a name="l00549"></a><span class="lineno"> 549</span>  <span class="comment">// Cache.</span></div><div class="line"><a name="l00550"></a><span class="lineno"> 550</span>  <a class="code" href="classSVF_1_1DCHGraph.html#ad79a569e77f94fa8494eed3f18e07e90">csCHAMap</a>.insert({cs, vfns});</div><div class="line"><a name="l00551"></a><span class="lineno"> 551</span>  <span class="comment">// Return cached object, not the stack object.</span></div><div class="line"><a name="l00552"></a><span class="lineno"> 552</span>  <span class="keywordflow">return</span> <a class="code" href="classSVF_1_1DCHGraph.html#ad79a569e77f94fa8494eed3f18e07e90">csCHAMap</a>[cs];</div><div class="line"><a name="l00553"></a><span class="lineno"> 553</span> }</div><div class="line"><a name="l00554"></a><span class="lineno"> 554</span> </div><div class="line"><a name="l00555"></a><span class="lineno"><a class="line" href="classSVF_1_1DCHGraph.html#a3383b841bb79ee39cb108b9906fca6a9"> 555</a></span> <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a340a9e77adc2bbfdee79e22da9ead234">VTableSet</a> &<a class="code" href="classSVF_1_1DCHGraph.html#a3383b841bb79ee39cb108b9906fca6a9">DCHGraph::getCSVtblsBasedonCHA</a>(<a class="code" href="classSVF_1_1CallSite.html">CallSite</a> cs)</div><div class="line"><a name="l00556"></a><span class="lineno"> 556</span> {</div><div class="line"><a name="l00557"></a><span class="lineno"> 557</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#ad127b0ad478640ede3d426e3a58d2632">DIType</a> *<a class="code" href="cJSON_8cpp.html#a3f9a0d3265a6254722587175dac3e4dc">type</a> = <a class="code" href="classSVF_1_1DCHGraph.html#a079feacdcc3783f4a9108a3b2d2aed2c">getCanonicalType</a>(<a class="code" href="classSVF_1_1DCHGraph.html#aefe2e9c130048a55a3aed63d128da7a0">getCSStaticType</a>(cs));</div><div class="line"><a name="l00558"></a><span class="lineno"> 558</span>  <span class="comment">// Check if we've already computed.</span></div><div class="line"><a name="l00559"></a><span class="lineno"> 559</span>  <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1DCHGraph.html#a294e7a04aff9cef87c1008e91a620155">vtblCHAMap</a>.find(type) != <a class="code" href="classSVF_1_1DCHGraph.html#a294e7a04aff9cef87c1008e91a620155">vtblCHAMap</a>.end())</div><div class="line"><a name="l00560"></a><span class="lineno"> 560</span>  {</div><div class="line"><a name="l00561"></a><span class="lineno"> 561</span>  <span class="keywordflow">return</span> <a class="code" href="classSVF_1_1DCHGraph.html#a294e7a04aff9cef87c1008e91a620155">vtblCHAMap</a>[<a class="code" href="cJSON_8cpp.html#a3f9a0d3265a6254722587175dac3e4dc">type</a>];</div><div class="line"><a name="l00562"></a><span class="lineno"> 562</span>  }</div><div class="line"><a name="l00563"></a><span class="lineno"> 563</span> </div><div class="line"><a name="l00564"></a><span class="lineno"> 564</span>  <a class="code" href="namespaceSVF.html#a340a9e77adc2bbfdee79e22da9ead234">VTableSet</a> vtblSet;</div><div class="line"><a name="l00565"></a><span class="lineno"> 565</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1SparseBitVector.html">NodeBS</a> &<a class="code" href="namespaceSVF.html#a67f454fa9341632d195fd5da619130f0">children</a> = <a class="code" href="classSVF_1_1DCHGraph.html#a0a3dfe1f2757eabd75082e2c4caec47a">cha</a>(type, <span class="keyword">false</span>);</div><div class="line"><a name="l00566"></a><span class="lineno"> 566</span>  <span class="keywordflow">for</span> (<a class="code" href="namespaceSVF.html#a350ae9bf8606bdfe23c8679681b969dc">NodeID</a> childId : children)</div><div class="line"><a name="l00567"></a><span class="lineno"> 567</span>  {</div><div class="line"><a name="l00568"></a><span class="lineno"> 568</span>  <a class="code" href="classSVF_1_1DCHNode.html">DCHNode</a> *<a class="code" href="cJSON_8cpp.html#ad00efb41ca386db28bacc7aefe79535c">child</a> = <a class="code" href="classSVF_1_1GenericGraph.html#a43c9c773bfa17abf481c33073e30d01b">getGNode</a>(childId);</div><div class="line"><a name="l00569"></a><span class="lineno"> 569</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFGlobalValue.html">SVFGlobalValue</a> *vtbl = child-><a class="code" href="classSVF_1_1DCHNode.html#a9184a71cd5dae94843ac89f4235d4fa2">getVTable</a>();</div><div class="line"><a name="l00570"></a><span class="lineno"> 570</span>  <span class="comment">// TODO: what if it is null?</span></div><div class="line"><a name="l00571"></a><span class="lineno"> 571</span>  <span class="keywordflow">if</span> (vtbl != <span class="keyword">nullptr</span>)</div><div class="line"><a name="l00572"></a><span class="lineno"> 572</span>  {</div><div class="line"><a name="l00573"></a><span class="lineno"> 573</span>  vtblSet.insert(vtbl);</div><div class="line"><a name="l00574"></a><span class="lineno"> 574</span>  }</div><div class="line"><a name="l00575"></a><span class="lineno"> 575</span>  }</div><div class="line"><a name="l00576"></a><span class="lineno"> 576</span> </div><div class="line"><a name="l00577"></a><span class="lineno"> 577</span>  <span class="comment">// Cache.</span></div><div class="line"><a name="l00578"></a><span class="lineno"> 578</span>  <a class="code" href="classSVF_1_1DCHGraph.html#a294e7a04aff9cef87c1008e91a620155">vtblCHAMap</a>.insert({<a class="code" href="cJSON_8cpp.html#a3f9a0d3265a6254722587175dac3e4dc">type</a>, vtblSet});</div><div class="line"><a name="l00579"></a><span class="lineno"> 579</span>  <span class="comment">// Return cached version - not the stack object.</span></div><div class="line"><a name="l00580"></a><span class="lineno"> 580</span>  <span class="keywordflow">return</span> <a class="code" href="classSVF_1_1DCHGraph.html#a294e7a04aff9cef87c1008e91a620155">vtblCHAMap</a>[<a class="code" href="cJSON_8cpp.html#a3f9a0d3265a6254722587175dac3e4dc">type</a>];</div><div class="line"><a name="l00581"></a><span class="lineno"> 581</span> }</div><div class="line"><a name="l00582"></a><span class="lineno"> 582</span> </div><div class="line"><a name="l00583"></a><span class="lineno"><a class="line" href="classSVF_1_1DCHGraph.html#a6a5d012fda005d45bf3196d1a7d2c6fa"> 583</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1DCHGraph.html#a6a5d012fda005d45bf3196d1a7d2c6fa">DCHGraph::getVFnsFromVtbls</a>(<a class="code" href="classSVF_1_1CallSite.html">CallSite</a> cs, <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a340a9e77adc2bbfdee79e22da9ead234">VTableSet</a> &vtbls, <a class="code" href="namespaceSVF.html#ad2b487757f1e1a1d81073120fc1d49c7">VFunSet</a> &virtualFunctions)</div><div class="line"><a name="l00584"></a><span class="lineno"> 584</span> {</div><div class="line"><a name="l00585"></a><span class="lineno"> 585</span>  <span class="keywordtype">size_t</span> idx = cs.<a class="code" href="classSVF_1_1CallSite.html#a6d8296c7b29e4ac07531ab36fa2b06e1">getFunIdxInVtable</a>();</div><div class="line"><a name="l00586"></a><span class="lineno"> 586</span>  <a class="code" href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">std::string</a> funName = cs.<a class="code" href="classSVF_1_1CallSite.html#a8344d90c8f5637f39c45fbc60f381cd9">getFunNameOfVirtualCall</a>();</div><div class="line"><a name="l00587"></a><span class="lineno"> 587</span>  <span class="keywordflow">for</span> (<span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFGlobalValue.html">SVFGlobalValue</a> *vtbl : vtbls)</div><div class="line"><a name="l00588"></a><span class="lineno"> 588</span>  {</div><div class="line"><a name="l00589"></a><span class="lineno"> 589</span>  assert(<a class="code" href="classSVF_1_1DCHGraph.html#a42f373998403f615a248ce94bc836b63">vtblToTypeMap</a>.find(vtbl) != <a class="code" href="classSVF_1_1DCHGraph.html#a42f373998403f615a248ce94bc836b63">vtblToTypeMap</a>.end() && <span class="stringliteral">"floating vtbl"</span>);</div><div class="line"><a name="l00590"></a><span class="lineno"> 590</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#ad127b0ad478640ede3d426e3a58d2632">DIType</a> *<a class="code" href="cJSON_8cpp.html#a3f9a0d3265a6254722587175dac3e4dc">type</a> = <a class="code" href="classSVF_1_1DCHGraph.html#a42f373998403f615a248ce94bc836b63">vtblToTypeMap</a>[vtbl];</div><div class="line"><a name="l00591"></a><span class="lineno"> 591</span>  assert(<a class="code" href="classSVF_1_1DCHGraph.html#a58341e23c1dc2b3e7fce190ed16a8a25">hasNode</a>(type) && <span class="stringliteral">"trying to get vtbl for type not in graph"</span>);</div><div class="line"><a name="l00592"></a><span class="lineno"> 592</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1DCHNode.html">DCHNode</a> *node = <a class="code" href="classSVF_1_1DCHGraph.html#a96c68bbb5ee5e939158ce0b67da2c61d">getNode</a>(type);</div><div class="line"><a name="l00593"></a><span class="lineno"> 593</span>  std::vector<std::vector<const Function* >> allVfns = node-><a class="code" href="classSVF_1_1DCHNode.html#a806a65f35c9f4ea118c1ef44ddb46079">getVfnVectors</a>();</div><div class="line"><a name="l00594"></a><span class="lineno"> 594</span>  <span class="keywordflow">for</span> (std::vector<const Function* > vfnV : allVfns)</div><div class="line"><a name="l00595"></a><span class="lineno"> 595</span>  {</div><div class="line"><a name="l00596"></a><span class="lineno"> 596</span>  <span class="comment">// We only care about any virtual function corresponding to idx.</span></div><div class="line"><a name="l00597"></a><span class="lineno"> 597</span>  <span class="keywordflow">if</span> (idx >= vfnV.size())</div><div class="line"><a name="l00598"></a><span class="lineno"> 598</span>  {</div><div class="line"><a name="l00599"></a><span class="lineno"> 599</span>  <span class="keywordflow">continue</span>;</div><div class="line"><a name="l00600"></a><span class="lineno"> 600</span>  }</div><div class="line"><a name="l00601"></a><span class="lineno"> 601</span> </div><div class="line"><a name="l00602"></a><span class="lineno"> 602</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a5faee14fa1dd41447bc73ac365fe33c1">Function</a>* callee = vfnV[idx];</div><div class="line"><a name="l00603"></a><span class="lineno"> 603</span>  <span class="comment">// Practically a copy of that in lib/MemoryModel/CHA.cpp</span></div><div class="line"><a name="l00604"></a><span class="lineno"> 604</span>  <span class="keywordflow">if</span> (cs.<a class="code" href="classSVF_1_1CallSite.html#a2a1904e6f381a0f8ac30265f2dfc48c8">arg_size</a>() == callee->arg_size() || (cs.<a class="code" href="classSVF_1_1CallSite.html#abe38a348db833b797f32ecc05f67100c">isVarArg</a>() && callee->isVarArg()))</div><div class="line"><a name="l00605"></a><span class="lineno"> 605</span>  {</div><div class="line"><a name="l00606"></a><span class="lineno"> 606</span>  <a class="code" href="structSVF_1_1cppUtil_1_1DemangledName.html">cppUtil::DemangledName</a> dname = <a class="code" href="namespaceSVF_1_1cppUtil.html#a1007c092efaeae41002efd91b803a7f6">cppUtil::demangle</a>(callee->getName().str());</div><div class="line"><a name="l00607"></a><span class="lineno"> 607</span>  <a class="code" href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">std::string</a> calleeName = dname.<a class="code" href="structSVF_1_1cppUtil_1_1DemangledName.html#a1dd17b240663bc9412adefde82385e02">funcName</a>;</div><div class="line"><a name="l00608"></a><span class="lineno"> 608</span> </div><div class="line"><a name="l00609"></a><span class="lineno"> 609</span>  <span class="comment">/*</span></div><div class="line"><a name="l00610"></a><span class="lineno"> 610</span> <span class="comment"> * The compiler will add some special suffix (e.g.,</span></div><div class="line"><a name="l00611"></a><span class="lineno"> 611</span> <span class="comment"> * "[abi:cxx11]") to the end of some virtual function:</span></div><div class="line"><a name="l00612"></a><span class="lineno"> 612</span> <span class="comment"> * In dealII</span></div><div class="line"><a name="l00613"></a><span class="lineno"> 613</span> <span class="comment"> * function: FE_Q<3>::get_name</span></div><div class="line"><a name="l00614"></a><span class="lineno"> 614</span> <span class="comment"> * will be mangled as: _ZNK4FE_QILi3EE8get_nameB5cxx11Ev</span></div><div class="line"><a name="l00615"></a><span class="lineno"> 615</span> <span class="comment"> * after demangling: FE_Q<3>::get_name[abi:cxx11]</span></div><div class="line"><a name="l00616"></a><span class="lineno"> 616</span> <span class="comment"> * The special suffix ("[abi:cxx11]") needs to be removed</span></div><div class="line"><a name="l00617"></a><span class="lineno"> 617</span> <span class="comment"> */</span></div><div class="line"><a name="l00618"></a><span class="lineno"> 618</span>  <span class="keyword">const</span> <a class="code" href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">std::string</a> suffix(<span class="stringliteral">"[abi:cxx11]"</span>);</div><div class="line"><a name="l00619"></a><span class="lineno"> 619</span>  <span class="keywordtype">size_t</span> suffixPos = calleeName.rfind(suffix);</div><div class="line"><a name="l00620"></a><span class="lineno"> 620</span>  <span class="keywordflow">if</span> (suffixPos != std::string::npos)</div><div class="line"><a name="l00621"></a><span class="lineno"> 621</span>  {</div><div class="line"><a name="l00622"></a><span class="lineno"> 622</span>  calleeName.erase(suffixPos, suffix.size());</div><div class="line"><a name="l00623"></a><span class="lineno"> 623</span>  }</div><div class="line"><a name="l00624"></a><span class="lineno"> 624</span> </div><div class="line"><a name="l00625"></a><span class="lineno"> 625</span>  <span class="comment">/*</span></div><div class="line"><a name="l00626"></a><span class="lineno"> 626</span> <span class="comment"> * if we can't get the function name of a virtual callsite, all virtual</span></div><div class="line"><a name="l00627"></a><span class="lineno"> 627</span> <span class="comment"> * functions corresponding to idx will be valid</span></div><div class="line"><a name="l00628"></a><span class="lineno"> 628</span> <span class="comment"> */</span></div><div class="line"><a name="l00629"></a><span class="lineno"> 629</span>  <span class="keywordflow">if</span> (funName.size() == 0)</div><div class="line"><a name="l00630"></a><span class="lineno"> 630</span>  {</div><div class="line"><a name="l00631"></a><span class="lineno"> 631</span>  virtualFunctions.insert(<a class="code" href="namespaceSVF_1_1LLVMUtil.html#a4f6431ca72e0378bf2428de8a87ba648">LLVMUtil::getFunction</a>(callee->getName().str()));</div><div class="line"><a name="l00632"></a><span class="lineno"> 632</span>  }</div><div class="line"><a name="l00633"></a><span class="lineno"> 633</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (funName[0] == <span class="charliteral">'~'</span>)</div><div class="line"><a name="l00634"></a><span class="lineno"> 634</span>  {</div><div class="line"><a name="l00635"></a><span class="lineno"> 635</span>  <span class="comment">/*</span></div><div class="line"><a name="l00636"></a><span class="lineno"> 636</span> <span class="comment"> * if the virtual callsite is calling a destructor, then all</span></div><div class="line"><a name="l00637"></a><span class="lineno"> 637</span> <span class="comment"> * destructors in the ch will be valid</span></div><div class="line"><a name="l00638"></a><span class="lineno"> 638</span> <span class="comment"> * class A { virtual ~A(){} };</span></div><div class="line"><a name="l00639"></a><span class="lineno"> 639</span> <span class="comment"> * class B: public A { virtual ~B(){} };</span></div><div class="line"><a name="l00640"></a><span class="lineno"> 640</span> <span class="comment"> * int main() {</span></div><div class="line"><a name="l00641"></a><span class="lineno"> 641</span> <span class="comment"> * A *a = new B;</span></div><div class="line"><a name="l00642"></a><span class="lineno"> 642</span> <span class="comment"> * delete a; /// the function name of this virtual callsite is ~A()</span></div><div class="line"><a name="l00643"></a><span class="lineno"> 643</span> <span class="comment"> * }</span></div><div class="line"><a name="l00644"></a><span class="lineno"> 644</span> <span class="comment"> */</span></div><div class="line"><a name="l00645"></a><span class="lineno"> 645</span>  <span class="keywordflow">if</span> (calleeName[0] == <span class="charliteral">'~'</span>)</div><div class="line"><a name="l00646"></a><span class="lineno"> 646</span>  {</div><div class="line"><a name="l00647"></a><span class="lineno"> 647</span>  virtualFunctions.insert(<a class="code" href="namespaceSVF_1_1LLVMUtil.html#a4f6431ca72e0378bf2428de8a87ba648">LLVMUtil::getFunction</a>(callee->getName().str()));</div><div class="line"><a name="l00648"></a><span class="lineno"> 648</span>  }</div><div class="line"><a name="l00649"></a><span class="lineno"> 649</span>  }</div><div class="line"><a name="l00650"></a><span class="lineno"> 650</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l00651"></a><span class="lineno"> 651</span>  {</div><div class="line"><a name="l00652"></a><span class="lineno"> 652</span>  <span class="comment">/*</span></div><div class="line"><a name="l00653"></a><span class="lineno"> 653</span> <span class="comment"> * For other virtual function calls, the function name of the callsite</span></div><div class="line"><a name="l00654"></a><span class="lineno"> 654</span> <span class="comment"> * and the function name of the target callee should match exactly</span></div><div class="line"><a name="l00655"></a><span class="lineno"> 655</span> <span class="comment"> */</span></div><div class="line"><a name="l00656"></a><span class="lineno"> 656</span>  <span class="keywordflow">if</span> (funName.compare(calleeName) == 0)</div><div class="line"><a name="l00657"></a><span class="lineno"> 657</span>  {</div><div class="line"><a name="l00658"></a><span class="lineno"> 658</span>  virtualFunctions.insert(<a class="code" href="namespaceSVF_1_1LLVMUtil.html#a4f6431ca72e0378bf2428de8a87ba648">LLVMUtil::getFunction</a>(callee->getName().str()));</div><div class="line"><a name="l00659"></a><span class="lineno"> 659</span>  }</div><div class="line"><a name="l00660"></a><span class="lineno"> 660</span>  }</div><div class="line"><a name="l00661"></a><span class="lineno"> 661</span>  }</div><div class="line"><a name="l00662"></a><span class="lineno"> 662</span>  }</div><div class="line"><a name="l00663"></a><span class="lineno"> 663</span>  }</div><div class="line"><a name="l00664"></a><span class="lineno"> 664</span> }</div><div class="line"><a name="l00665"></a><span class="lineno"> 665</span> </div><div class="line"><a name="l00666"></a><span class="lineno"><a class="line" href="classSVF_1_1DCHGraph.html#ab33f9af6ad22eb99dd0d9950fb0e50e6"> 666</a></span> <span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1DCHGraph.html#ab33f9af6ad22eb99dd0d9950fb0e50e6">DCHGraph::isBase</a>(<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#ad127b0ad478640ede3d426e3a58d2632">DIType</a> *<a class="code" href="cJSON_8cpp.html#a8a1a0a26c50cc4becfc754bb68d1dc6b">a</a>, <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#ad127b0ad478640ede3d426e3a58d2632">DIType</a> *<a class="code" href="cJSON_8h.html#a1a175e87536301df98c805ac0636ad7c">b</a>, <span class="keywordtype">bool</span> firstField)</div><div class="line"><a name="l00667"></a><span class="lineno"> 667</span> {</div><div class="line"><a name="l00668"></a><span class="lineno"> 668</span>  a = <a class="code" href="classSVF_1_1DCHGraph.html#a079feacdcc3783f4a9108a3b2d2aed2c">getCanonicalType</a>(a);</div><div class="line"><a name="l00669"></a><span class="lineno"> 669</span>  b = <a class="code" href="classSVF_1_1DCHGraph.html#a079feacdcc3783f4a9108a3b2d2aed2c">getCanonicalType</a>(b);</div><div class="line"><a name="l00670"></a><span class="lineno"> 670</span>  assert(<a class="code" href="classSVF_1_1DCHGraph.html#a58341e23c1dc2b3e7fce190ed16a8a25">hasNode</a>(a) && <a class="code" href="classSVF_1_1DCHGraph.html#a58341e23c1dc2b3e7fce190ed16a8a25">hasNode</a>(b) && <span class="stringliteral">"DCHG: isBase query for non-existent node!"</span>);</div><div class="line"><a name="l00671"></a><span class="lineno"> 671</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1DCHNode.html">DCHNode</a> *bNode = <a class="code" href="classSVF_1_1DCHGraph.html#a96c68bbb5ee5e939158ce0b67da2c61d">getNode</a>(b);</div><div class="line"><a name="l00672"></a><span class="lineno"> 672</span> </div><div class="line"><a name="l00673"></a><span class="lineno"> 673</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1SparseBitVector.html">NodeBS</a> &aChildren = <a class="code" href="classSVF_1_1DCHGraph.html#a0a3dfe1f2757eabd75082e2c4caec47a">cha</a>(a, firstField);</div><div class="line"><a name="l00674"></a><span class="lineno"> 674</span>  <span class="keywordflow">return</span> aChildren.<a class="code" href="classSVF_1_1SparseBitVector.html#a112f2ede1240c95f9fe810f2882fab80">test</a>(bNode-><a class="code" href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">getId</a>());</div><div class="line"><a name="l00675"></a><span class="lineno"> 675</span> }</div><div class="line"><a name="l00676"></a><span class="lineno"> 676</span> </div><div class="line"><a name="l00677"></a><span class="lineno"><a class="line" href="classSVF_1_1DCHGraph.html#af0534356b4a8c68507e1237f1d7a8c11"> 677</a></span> <span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1DCHGraph.html#af0534356b4a8c68507e1237f1d7a8c11">DCHGraph::isFieldOf</a>(<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#ad127b0ad478640ede3d426e3a58d2632">DIType</a> *f, <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#ad127b0ad478640ede3d426e3a58d2632">DIType</a> *<a class="code" href="cJSON_8h.html#a1a175e87536301df98c805ac0636ad7c">b</a>)</div><div class="line"><a name="l00678"></a><span class="lineno"> 678</span> {</div><div class="line"><a name="l00679"></a><span class="lineno"> 679</span>  assert(f && b && <span class="stringliteral">"DCHG::isFieldOf: given nullptr!"</span>);</div><div class="line"><a name="l00680"></a><span class="lineno"> 680</span> </div><div class="line"><a name="l00681"></a><span class="lineno"> 681</span>  f = <a class="code" href="classSVF_1_1DCHGraph.html#a079feacdcc3783f4a9108a3b2d2aed2c">getCanonicalType</a>(f);</div><div class="line"><a name="l00682"></a><span class="lineno"> 682</span>  b = <a class="code" href="classSVF_1_1DCHGraph.html#a079feacdcc3783f4a9108a3b2d2aed2c">getCanonicalType</a>(b);</div><div class="line"><a name="l00683"></a><span class="lineno"> 683</span>  <span class="keywordflow">if</span> (f == b) <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l00684"></a><span class="lineno"> 684</span> </div><div class="line"><a name="l00685"></a><span class="lineno"> 685</span>  <span class="keywordflow">if</span> (b->getTag() == dwarf::DW_TAG_array_type || b->getTag() == dwarf::DW_TAG_pointer_type)</div><div class="line"><a name="l00686"></a><span class="lineno"> 686</span>  {</div><div class="line"><a name="l00687"></a><span class="lineno"> 687</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#ad127b0ad478640ede3d426e3a58d2632">DIType</a> *baseType = <span class="keyword">nullptr</span>;</div><div class="line"><a name="l00688"></a><span class="lineno"> 688</span>  <span class="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#aded9b991c77acc5284ccead0739e84f1">DICompositeType</a> *arrayType = SVFUtil::dyn_cast<DICompositeType>(b))</div><div class="line"><a name="l00689"></a><span class="lineno"> 689</span>  {</div><div class="line"><a name="l00690"></a><span class="lineno"> 690</span>  baseType = arrayType->getBaseType();</div><div class="line"><a name="l00691"></a><span class="lineno"> 691</span>  }</div><div class="line"><a name="l00692"></a><span class="lineno"> 692</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a852e75c562139237fcc754c7461533e6">DIDerivedType</a> *ptrType = SVFUtil::dyn_cast<DIDerivedType>(b))</div><div class="line"><a name="l00693"></a><span class="lineno"> 693</span>  {</div><div class="line"><a name="l00694"></a><span class="lineno"> 694</span>  baseType = ptrType->getBaseType();</div><div class="line"><a name="l00695"></a><span class="lineno"> 695</span>  }</div><div class="line"><a name="l00696"></a><span class="lineno"> 696</span>  assert(baseType && <span class="stringliteral">"DCHG::isFieldOf: baseType is neither DIComposite nor DIDerived!"</span>);</div><div class="line"><a name="l00697"></a><span class="lineno"> 697</span> </div><div class="line"><a name="l00698"></a><span class="lineno"> 698</span>  baseType = <a class="code" href="classSVF_1_1DCHGraph.html#a079feacdcc3783f4a9108a3b2d2aed2c">getCanonicalType</a>(baseType);</div><div class="line"><a name="l00699"></a><span class="lineno"> 699</span>  <span class="keywordflow">return</span> f == baseType || (baseType != <span class="keyword">nullptr</span> && <a class="code" href="classSVF_1_1DCHGraph.html#af0534356b4a8c68507e1237f1d7a8c11">isFieldOf</a>(f, baseType));</div><div class="line"><a name="l00700"></a><span class="lineno"> 700</span>  }</div><div class="line"><a name="l00701"></a><span class="lineno"> 701</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (b->getTag() == dwarf::DW_TAG_class_type</div><div class="line"><a name="l00702"></a><span class="lineno"> 702</span>  || b->getTag() == dwarf::DW_TAG_structure_type)</div><div class="line"><a name="l00703"></a><span class="lineno"> 703</span>  {</div><div class="line"><a name="l00704"></a><span class="lineno"> 704</span>  <span class="keyword">const</span> std::vector<const DIType *> &fields = <a class="code" href="classSVF_1_1DCHGraph.html#ae9a0007299178912e2568dc7158d6824">getFieldTypes</a>(b);</div><div class="line"><a name="l00705"></a><span class="lineno"> 705</span>  <span class="keywordflow">return</span> std::find(fields.begin(), fields.end(), f) != fields.end();</div><div class="line"><a name="l00706"></a><span class="lineno"> 706</span>  }</div><div class="line"><a name="l00707"></a><span class="lineno"> 707</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l00708"></a><span class="lineno"> 708</span>  {</div><div class="line"><a name="l00709"></a><span class="lineno"> 709</span>  <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l00710"></a><span class="lineno"> 710</span>  }</div><div class="line"><a name="l00711"></a><span class="lineno"> 711</span> }</div><div class="line"><a name="l00712"></a><span class="lineno"> 712</span> </div><div class="line"><a name="l00713"></a><span class="lineno"><a class="line" href="classSVF_1_1DCHGraph.html#a079feacdcc3783f4a9108a3b2d2aed2c"> 713</a></span> <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#ad127b0ad478640ede3d426e3a58d2632">DIType</a> *<a class="code" href="classSVF_1_1DCHGraph.html#a079feacdcc3783f4a9108a3b2d2aed2c">DCHGraph::getCanonicalType</a>(<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#ad127b0ad478640ede3d426e3a58d2632">DIType</a> *t)</div><div class="line"><a name="l00714"></a><span class="lineno"> 714</span> {</div><div class="line"><a name="l00715"></a><span class="lineno"> 715</span>  <span class="comment">// We want stripped types to be canonical.</span></div><div class="line"><a name="l00716"></a><span class="lineno"> 716</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#ad127b0ad478640ede3d426e3a58d2632">DIType</a> *unstrippedT = t;</div><div class="line"><a name="l00717"></a><span class="lineno"> 717</span>  t = <a class="code" href="classSVF_1_1DCHGraph.html#a175ed6ad0c9b23d5617f755ab96c76c4">stripQualifiers</a>(t);</div><div class="line"><a name="l00718"></a><span class="lineno"> 718</span> </div><div class="line"><a name="l00719"></a><span class="lineno"> 719</span>  <span class="comment">// Is there a mapping for the unstripped type? Yes - return it.</span></div><div class="line"><a name="l00720"></a><span class="lineno"> 720</span>  <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1DCHGraph.html#a498a18fe8702251b6f2a4e6379e5cbb1">canonicalTypeMap</a>.find(unstrippedT) != <a class="code" href="classSVF_1_1DCHGraph.html#a498a18fe8702251b6f2a4e6379e5cbb1">canonicalTypeMap</a>.end())</div><div class="line"><a name="l00721"></a><span class="lineno"> 721</span>  {</div><div class="line"><a name="l00722"></a><span class="lineno"> 722</span>  <span class="keywordflow">return</span> <a class="code" href="classSVF_1_1DCHGraph.html#a498a18fe8702251b6f2a4e6379e5cbb1">canonicalTypeMap</a>[unstrippedT];</div><div class="line"><a name="l00723"></a><span class="lineno"> 723</span>  }</div><div class="line"><a name="l00724"></a><span class="lineno"> 724</span> </div><div class="line"><a name="l00725"></a><span class="lineno"> 725</span>  <span class="comment">// There is no mapping for unstripped type (^), is there one for the stripped</span></div><div class="line"><a name="l00726"></a><span class="lineno"> 726</span>  <span class="comment">// type? Yes - map the unstripped type to the same thing.</span></div><div class="line"><a name="l00727"></a><span class="lineno"> 727</span>  <span class="keywordflow">if</span> (unstrippedT != t)</div><div class="line"><a name="l00728"></a><span class="lineno"> 728</span>  {</div><div class="line"><a name="l00729"></a><span class="lineno"> 729</span>  <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1DCHGraph.html#a498a18fe8702251b6f2a4e6379e5cbb1">canonicalTypeMap</a>.find(t) != <a class="code" href="classSVF_1_1DCHGraph.html#a498a18fe8702251b6f2a4e6379e5cbb1">canonicalTypeMap</a>.end())</div><div class="line"><a name="l00730"></a><span class="lineno"> 730</span>  {</div><div class="line"><a name="l00731"></a><span class="lineno"> 731</span>  <a class="code" href="classSVF_1_1DCHGraph.html#a498a18fe8702251b6f2a4e6379e5cbb1">canonicalTypeMap</a>[unstrippedT] = <a class="code" href="classSVF_1_1DCHGraph.html#a498a18fe8702251b6f2a4e6379e5cbb1">canonicalTypeMap</a>[t];</div><div class="line"><a name="l00732"></a><span class="lineno"> 732</span>  <span class="keywordflow">return</span> <a class="code" href="classSVF_1_1DCHGraph.html#a498a18fe8702251b6f2a4e6379e5cbb1">canonicalTypeMap</a>[unstrippedT];</div><div class="line"><a name="l00733"></a><span class="lineno"> 733</span>  }</div><div class="line"><a name="l00734"></a><span class="lineno"> 734</span>  }</div><div class="line"><a name="l00735"></a><span class="lineno"> 735</span> </div><div class="line"><a name="l00736"></a><span class="lineno"> 736</span>  <span class="comment">// Canonical type for t is not cached, find one for it.</span></div><div class="line"><a name="l00737"></a><span class="lineno"> 737</span>  <span class="keywordflow">for</span> (<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#ad127b0ad478640ede3d426e3a58d2632">DIType</a> *canonType : <a class="code" href="classSVF_1_1DCHGraph.html#a10225f56b21eb7f0870fdc433de3c393">canonicalTypes</a>)</div><div class="line"><a name="l00738"></a><span class="lineno"> 738</span>  {</div><div class="line"><a name="l00739"></a><span class="lineno"> 739</span>  <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1DCHGraph.html#acb76ab20da1bfbec00f63d08e48cbddd">teq</a>(t, canonType))</div><div class="line"><a name="l00740"></a><span class="lineno"> 740</span>  {</div><div class="line"><a name="l00741"></a><span class="lineno"> 741</span>  <span class="comment">// Found a canonical type.</span></div><div class="line"><a name="l00742"></a><span class="lineno"> 742</span>  <a class="code" href="classSVF_1_1DCHGraph.html#a498a18fe8702251b6f2a4e6379e5cbb1">canonicalTypeMap</a>[t] = canonType;</div><div class="line"><a name="l00743"></a><span class="lineno"> 743</span>  <span class="keywordflow">return</span> <a class="code" href="classSVF_1_1DCHGraph.html#a498a18fe8702251b6f2a4e6379e5cbb1">canonicalTypeMap</a>[t];</div><div class="line"><a name="l00744"></a><span class="lineno"> 744</span>  }</div><div class="line"><a name="l00745"></a><span class="lineno"> 745</span>  }</div><div class="line"><a name="l00746"></a><span class="lineno"> 746</span> </div><div class="line"><a name="l00747"></a><span class="lineno"> 747</span>  <span class="comment">// No canonical type found, so t will be a canonical type.</span></div><div class="line"><a name="l00748"></a><span class="lineno"> 748</span>  canonicalTypes.insert(t);</div><div class="line"><a name="l00749"></a><span class="lineno"> 749</span>  <a class="code" href="classSVF_1_1DCHGraph.html#a498a18fe8702251b6f2a4e6379e5cbb1">canonicalTypeMap</a>.insert({t, t});</div><div class="line"><a name="l00750"></a><span class="lineno"> 750</span> </div><div class="line"><a name="l00751"></a><span class="lineno"> 751</span>  <span class="keywordflow">return</span> <a class="code" href="classSVF_1_1DCHGraph.html#a498a18fe8702251b6f2a4e6379e5cbb1">canonicalTypeMap</a>[t];</div><div class="line"><a name="l00752"></a><span class="lineno"> 752</span> }</div><div class="line"><a name="l00753"></a><span class="lineno"> 753</span> </div><div class="line"><a name="l00754"></a><span class="lineno"><a class="line" href="classSVF_1_1DCHGraph.html#a175ed6ad0c9b23d5617f755ab96c76c4"> 754</a></span> <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#ad127b0ad478640ede3d426e3a58d2632">DIType</a> *<a class="code" href="classSVF_1_1DCHGraph.html#a175ed6ad0c9b23d5617f755ab96c76c4">DCHGraph::stripQualifiers</a>(<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#ad127b0ad478640ede3d426e3a58d2632">DIType</a> *t)</div><div class="line"><a name="l00755"></a><span class="lineno"> 755</span> {</div><div class="line"><a name="l00756"></a><span class="lineno"> 756</span>  <span class="keywordflow">while</span> (<span class="keyword">true</span>)</div><div class="line"><a name="l00757"></a><span class="lineno"> 757</span>  {</div><div class="line"><a name="l00758"></a><span class="lineno"> 758</span>  <span class="comment">// nullptr means void.</span></div><div class="line"><a name="l00759"></a><span class="lineno"> 759</span>  <span class="keywordflow">if</span> (t == <span class="keyword">nullptr</span></div><div class="line"><a name="l00760"></a><span class="lineno"> 760</span>  || SVFUtil::isa<DIBasicType>(t)</div><div class="line"><a name="l00761"></a><span class="lineno"> 761</span>  || SVFUtil::isa<DISubroutineType>(t))</div><div class="line"><a name="l00762"></a><span class="lineno"> 762</span>  {</div><div class="line"><a name="l00763"></a><span class="lineno"> 763</span>  <span class="keywordflow">break</span>;</div><div class="line"><a name="l00764"></a><span class="lineno"> 764</span>  }</div><div class="line"><a name="l00765"></a><span class="lineno"> 765</span> </div><div class="line"><a name="l00766"></a><span class="lineno"> 766</span>  <span class="keywordtype">unsigned</span> tag = t->getTag();</div><div class="line"><a name="l00767"></a><span class="lineno"> 767</span>  <span class="comment">// Verbose for clarity.</span></div><div class="line"><a name="l00768"></a><span class="lineno"> 768</span>  <span class="keywordflow">if</span> ( tag == dwarf::DW_TAG_const_type</div><div class="line"><a name="l00769"></a><span class="lineno"> 769</span>  || tag == dwarf::DW_TAG_atomic_type</div><div class="line"><a name="l00770"></a><span class="lineno"> 770</span>  || tag == dwarf::DW_TAG_volatile_type</div><div class="line"><a name="l00771"></a><span class="lineno"> 771</span>  || tag == dwarf::DW_TAG_restrict_type</div><div class="line"><a name="l00772"></a><span class="lineno"> 772</span>  || tag == dwarf::DW_TAG_typedef)</div><div class="line"><a name="l00773"></a><span class="lineno"> 773</span>  {</div><div class="line"><a name="l00774"></a><span class="lineno"> 774</span>  <span class="comment">// Qualifier - get underlying type.</span></div><div class="line"><a name="l00775"></a><span class="lineno"> 775</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a852e75c562139237fcc754c7461533e6">DIDerivedType</a> *dt = <a class="code" href="namespaceSVF_1_1SVFUtil.html#af6e96694d983643a66c238cce01bff0e">SVFUtil::dyn_cast</a><<a class="code" href="namespaceSVF.html#a852e75c562139237fcc754c7461533e6">DIDerivedType</a>>(t);</div><div class="line"><a name="l00776"></a><span class="lineno"> 776</span>  assert(t && <span class="stringliteral">"DCHG: expected DerivedType"</span>);</div><div class="line"><a name="l00777"></a><span class="lineno"> 777</span>  t = dt->getBaseType();</div><div class="line"><a name="l00778"></a><span class="lineno"> 778</span>  }</div><div class="line"><a name="l00779"></a><span class="lineno"> 779</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> ( tag == dwarf::DW_TAG_array_type</div><div class="line"><a name="l00780"></a><span class="lineno"> 780</span>  || tag == dwarf::DW_TAG_class_type</div><div class="line"><a name="l00781"></a><span class="lineno"> 781</span>  || tag == dwarf::DW_TAG_structure_type</div><div class="line"><a name="l00782"></a><span class="lineno"> 782</span>  || tag == dwarf::DW_TAG_union_type</div><div class="line"><a name="l00783"></a><span class="lineno"> 783</span>  || tag == dwarf::DW_TAG_enumeration_type</div><div class="line"><a name="l00784"></a><span class="lineno"> 784</span>  || tag == dwarf::DW_TAG_member</div><div class="line"><a name="l00785"></a><span class="lineno"> 785</span>  || tag == dwarf::DW_TAG_pointer_type</div><div class="line"><a name="l00786"></a><span class="lineno"> 786</span>  || tag == dwarf::DW_TAG_ptr_to_member_type</div><div class="line"><a name="l00787"></a><span class="lineno"> 787</span>  || tag == dwarf::DW_TAG_reference_type</div><div class="line"><a name="l00788"></a><span class="lineno"> 788</span>  || tag == dwarf::DW_TAG_rvalue_reference_type)</div><div class="line"><a name="l00789"></a><span class="lineno"> 789</span>  {</div><div class="line"><a name="l00790"></a><span class="lineno"> 790</span>  <span class="comment">// Hit a non-qualifier.</span></div><div class="line"><a name="l00791"></a><span class="lineno"> 791</span>  <span class="keywordflow">break</span>;</div><div class="line"><a name="l00792"></a><span class="lineno"> 792</span>  }</div><div class="line"><a name="l00793"></a><span class="lineno"> 793</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> ( tag == dwarf::DW_TAG_inheritance</div><div class="line"><a name="l00794"></a><span class="lineno"> 794</span>  || tag == dwarf::DW_TAG_friend)</div><div class="line"><a name="l00795"></a><span class="lineno"> 795</span>  {</div><div class="line"><a name="l00796"></a><span class="lineno"> 796</span>  assert(<span class="keyword">false</span> && <span class="stringliteral">"DCHG: unexpected tag when stripping qualifiers"</span>);</div><div class="line"><a name="l00797"></a><span class="lineno"> 797</span>  }</div><div class="line"><a name="l00798"></a><span class="lineno"> 798</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l00799"></a><span class="lineno"> 799</span>  {</div><div class="line"><a name="l00800"></a><span class="lineno"> 800</span>  assert(<span class="keyword">false</span> && <span class="stringliteral">"DCHG: unhandled tag when stripping qualifiers"</span>);</div><div class="line"><a name="l00801"></a><span class="lineno"> 801</span>  }</div><div class="line"><a name="l00802"></a><span class="lineno"> 802</span>  }</div><div class="line"><a name="l00803"></a><span class="lineno"> 803</span> </div><div class="line"><a name="l00804"></a><span class="lineno"> 804</span>  <span class="keywordflow">return</span> t;</div><div class="line"><a name="l00805"></a><span class="lineno"> 805</span> }</div><div class="line"><a name="l00806"></a><span class="lineno"> 806</span> </div><div class="line"><a name="l00807"></a><span class="lineno"><a class="line" href="classSVF_1_1DCHGraph.html#a6c276e661e5e63c1c84387f84c8a62e4"> 807</a></span> <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#ad127b0ad478640ede3d426e3a58d2632">DIType</a> *<a class="code" href="classSVF_1_1DCHGraph.html#a6c276e661e5e63c1c84387f84c8a62e4">DCHGraph::stripArray</a>(<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#ad127b0ad478640ede3d426e3a58d2632">DIType</a> *t)</div><div class="line"><a name="l00808"></a><span class="lineno"> 808</span> {</div><div class="line"><a name="l00809"></a><span class="lineno"> 809</span>  t = <a class="code" href="classSVF_1_1DCHGraph.html#a175ed6ad0c9b23d5617f755ab96c76c4">stripQualifiers</a>(t);</div><div class="line"><a name="l00810"></a><span class="lineno"> 810</span>  <span class="keywordflow">if</span> (t->getTag() == dwarf::DW_TAG_array_type)</div><div class="line"><a name="l00811"></a><span class="lineno"> 811</span>  {</div><div class="line"><a name="l00812"></a><span class="lineno"> 812</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#aded9b991c77acc5284ccead0739e84f1">DICompositeType</a> *at = <a class="code" href="namespaceSVF_1_1SVFUtil.html#af6e96694d983643a66c238cce01bff0e">SVFUtil::dyn_cast</a><<a class="code" href="namespaceSVF.html#aded9b991c77acc5284ccead0739e84f1">DICompositeType</a>>(t);</div><div class="line"><a name="l00813"></a><span class="lineno"> 813</span>  <span class="keywordflow">return</span> <a class="code" href="classSVF_1_1DCHGraph.html#a6c276e661e5e63c1c84387f84c8a62e4">stripArray</a>(at->getBaseType());</div><div class="line"><a name="l00814"></a><span class="lineno"> 814</span>  }</div><div class="line"><a name="l00815"></a><span class="lineno"> 815</span> </div><div class="line"><a name="l00816"></a><span class="lineno"> 816</span>  <span class="keywordflow">return</span> t;</div><div class="line"><a name="l00817"></a><span class="lineno"> 817</span> }</div><div class="line"><a name="l00818"></a><span class="lineno"> 818</span> </div><div class="line"><a name="l00819"></a><span class="lineno"><a class="line" href="classSVF_1_1DCHGraph.html#acb76ab20da1bfbec00f63d08e48cbddd"> 819</a></span> <span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1DCHGraph.html#acb76ab20da1bfbec00f63d08e48cbddd">DCHGraph::teq</a>(<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#ad127b0ad478640ede3d426e3a58d2632">DIType</a> *t1, <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#ad127b0ad478640ede3d426e3a58d2632">DIType</a> *t2)</div><div class="line"><a name="l00820"></a><span class="lineno"> 820</span> {</div><div class="line"><a name="l00821"></a><span class="lineno"> 821</span>  t1 = <a class="code" href="classSVF_1_1DCHGraph.html#a175ed6ad0c9b23d5617f755ab96c76c4">stripQualifiers</a>(t1);</div><div class="line"><a name="l00822"></a><span class="lineno"> 822</span>  t2 = <a class="code" href="classSVF_1_1DCHGraph.html#a175ed6ad0c9b23d5617f755ab96c76c4">stripQualifiers</a>(t2);</div><div class="line"><a name="l00823"></a><span class="lineno"> 823</span> </div><div class="line"><a name="l00824"></a><span class="lineno"> 824</span>  <span class="keywordflow">if</span> (t1 == t2)</div><div class="line"><a name="l00825"></a><span class="lineno"> 825</span>  {</div><div class="line"><a name="l00826"></a><span class="lineno"> 826</span>  <span class="comment">// Trivial case. Handles SubRoutineTypes too.</span></div><div class="line"><a name="l00827"></a><span class="lineno"> 827</span>  <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l00828"></a><span class="lineno"> 828</span>  }</div><div class="line"><a name="l00829"></a><span class="lineno"> 829</span> </div><div class="line"><a name="l00830"></a><span class="lineno"> 830</span>  <span class="keywordflow">if</span> (t1 == <span class="keyword">nullptr</span> || t2 == <span class="keyword">nullptr</span>)</div><div class="line"><a name="l00831"></a><span class="lineno"> 831</span>  {</div><div class="line"><a name="l00832"></a><span class="lineno"> 832</span>  <span class="comment">// Since t1 != t2 and one of them is null, it is</span></div><div class="line"><a name="l00833"></a><span class="lineno"> 833</span>  <span class="comment">// impossible for them to be equal.</span></div><div class="line"><a name="l00834"></a><span class="lineno"> 834</span>  <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l00835"></a><span class="lineno"> 835</span>  }</div><div class="line"><a name="l00836"></a><span class="lineno"> 836</span> </div><div class="line"><a name="l00837"></a><span class="lineno"> 837</span>  <span class="comment">// Check if we need base type comparisons.</span></div><div class="line"><a name="l00838"></a><span class="lineno"> 838</span>  <span class="keywordflow">if</span> (SVFUtil::isa<DIBasicType>(t1) && SVFUtil::isa<DIBasicType>(t2))</div><div class="line"><a name="l00839"></a><span class="lineno"> 839</span>  {</div><div class="line"><a name="l00840"></a><span class="lineno"> 840</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#ada0513be7e25325325ccc9183aeca278">DIBasicType</a> *b1 = <a class="code" href="namespaceSVF_1_1SVFUtil.html#af6e96694d983643a66c238cce01bff0e">SVFUtil::dyn_cast</a><<a class="code" href="namespaceSVF.html#ada0513be7e25325325ccc9183aeca278">DIBasicType</a>>(t1);</div><div class="line"><a name="l00841"></a><span class="lineno"> 841</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#ada0513be7e25325325ccc9183aeca278">DIBasicType</a> *b2 = <a class="code" href="namespaceSVF_1_1SVFUtil.html#af6e96694d983643a66c238cce01bff0e">SVFUtil::dyn_cast</a><<a class="code" href="namespaceSVF.html#ada0513be7e25325325ccc9183aeca278">DIBasicType</a>>(t2);</div><div class="line"><a name="l00842"></a><span class="lineno"> 842</span> </div><div class="line"><a name="l00843"></a><span class="lineno"> 843</span>  <span class="keywordtype">unsigned</span> enc1 = b1->getEncoding();</div><div class="line"><a name="l00844"></a><span class="lineno"> 844</span>  <span class="keywordtype">unsigned</span> enc2 = b2->getEncoding();</div><div class="line"><a name="l00845"></a><span class="lineno"> 845</span>  <span class="keywordtype">bool</span> okayEnc = ((enc1 == dwarf::DW_ATE_signed || enc1 == dwarf::DW_ATE_unsigned || enc1 == dwarf::DW_ATE_boolean)</div><div class="line"><a name="l00846"></a><span class="lineno"> 846</span>  && (enc2 == dwarf::DW_ATE_signed || enc2 == dwarf::DW_ATE_unsigned || enc2 == dwarf::DW_ATE_boolean))</div><div class="line"><a name="l00847"></a><span class="lineno"> 847</span>  ||</div><div class="line"><a name="l00848"></a><span class="lineno"> 848</span>  (enc1 == dwarf::DW_ATE_float && enc2 == dwarf::DW_ATE_float)</div><div class="line"><a name="l00849"></a><span class="lineno"> 849</span>  ||</div><div class="line"><a name="l00850"></a><span class="lineno"> 850</span>  ((enc1 == dwarf::DW_ATE_signed_char || enc1 == dwarf::DW_ATE_unsigned_char)</div><div class="line"><a name="l00851"></a><span class="lineno"> 851</span>  &&</div><div class="line"><a name="l00852"></a><span class="lineno"> 852</span>  (enc2 == dwarf::DW_ATE_signed_char || enc2 == dwarf::DW_ATE_unsigned_char));</div><div class="line"><a name="l00853"></a><span class="lineno"> 853</span> </div><div class="line"><a name="l00854"></a><span class="lineno"> 854</span>  <span class="keywordflow">if</span> (!okayEnc) <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l00855"></a><span class="lineno"> 855</span>  <span class="comment">// Now we have split integers, floats, and chars, ignoring signedness.</span></div><div class="line"><a name="l00856"></a><span class="lineno"> 856</span> </div><div class="line"><a name="l00857"></a><span class="lineno"> 857</span>  <span class="keywordflow">return</span> t1->getSizeInBits() == t2->getSizeInBits()</div><div class="line"><a name="l00858"></a><span class="lineno"> 858</span>  && t1->getAlignInBits() == t2->getAlignInBits();</div><div class="line"><a name="l00859"></a><span class="lineno"> 859</span>  }</div><div class="line"><a name="l00860"></a><span class="lineno"> 860</span> </div><div class="line"><a name="l00861"></a><span class="lineno"> 861</span>  <span class="comment">// Check, do we need to compare base types?</span></div><div class="line"><a name="l00862"></a><span class="lineno"> 862</span>  <span class="comment">// This makes pointers, references, and arrays equivalent.</span></div><div class="line"><a name="l00863"></a><span class="lineno"> 863</span>  <span class="comment">// Will handle member types.</span></div><div class="line"><a name="l00864"></a><span class="lineno"> 864</span>  <span class="keywordflow">if</span> ((SVFUtil::isa<DIDerivedType>(t1) || t1->getTag() == dwarf::DW_TAG_array_type)</div><div class="line"><a name="l00865"></a><span class="lineno"> 865</span>  && (SVFUtil::isa<DIDerivedType>(t2) || t2->getTag() == dwarf::DW_TAG_array_type))</div><div class="line"><a name="l00866"></a><span class="lineno"> 866</span>  {</div><div class="line"><a name="l00867"></a><span class="lineno"> 867</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#ad127b0ad478640ede3d426e3a58d2632">DIType</a> *base1, *base2;</div><div class="line"><a name="l00868"></a><span class="lineno"> 868</span> </div><div class="line"><a name="l00869"></a><span class="lineno"> 869</span>  <span class="comment">// Set base1.</span></div><div class="line"><a name="l00870"></a><span class="lineno"> 870</span>  <span class="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a852e75c562139237fcc754c7461533e6">DIDerivedType</a> *d1 = SVFUtil::dyn_cast<DIDerivedType>(t1))</div><div class="line"><a name="l00871"></a><span class="lineno"> 871</span>  {</div><div class="line"><a name="l00872"></a><span class="lineno"> 872</span>  base1 = d1->getBaseType();</div><div class="line"><a name="l00873"></a><span class="lineno"> 873</span>  }</div><div class="line"><a name="l00874"></a><span class="lineno"> 874</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l00875"></a><span class="lineno"> 875</span>  {</div><div class="line"><a name="l00876"></a><span class="lineno"> 876</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#aded9b991c77acc5284ccead0739e84f1">DICompositeType</a> *c1 = <a class="code" href="namespaceSVF_1_1SVFUtil.html#af6e96694d983643a66c238cce01bff0e">SVFUtil::dyn_cast</a><<a class="code" href="namespaceSVF.html#aded9b991c77acc5284ccead0739e84f1">DICompositeType</a>>(t1);</div><div class="line"><a name="l00877"></a><span class="lineno"> 877</span>  assert(c1 && <span class="stringliteral">"teq: bad cast for array type"</span>);</div><div class="line"><a name="l00878"></a><span class="lineno"> 878</span>  base1 = c1->getBaseType();</div><div class="line"><a name="l00879"></a><span class="lineno"> 879</span>  }</div><div class="line"><a name="l00880"></a><span class="lineno"> 880</span> </div><div class="line"><a name="l00881"></a><span class="lineno"> 881</span>  <span class="comment">// Set base2.</span></div><div class="line"><a name="l00882"></a><span class="lineno"> 882</span>  <span class="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a852e75c562139237fcc754c7461533e6">DIDerivedType</a> *d2 = SVFUtil::dyn_cast<DIDerivedType>(t2))</div><div class="line"><a name="l00883"></a><span class="lineno"> 883</span>  {</div><div class="line"><a name="l00884"></a><span class="lineno"> 884</span>  base2 = d2->getBaseType();</div><div class="line"><a name="l00885"></a><span class="lineno"> 885</span>  }</div><div class="line"><a name="l00886"></a><span class="lineno"> 886</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l00887"></a><span class="lineno"> 887</span>  {</div><div class="line"><a name="l00888"></a><span class="lineno"> 888</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#aded9b991c77acc5284ccead0739e84f1">DICompositeType</a> *c2 = <a class="code" href="namespaceSVF_1_1SVFUtil.html#af6e96694d983643a66c238cce01bff0e">SVFUtil::dyn_cast</a><<a class="code" href="namespaceSVF.html#aded9b991c77acc5284ccead0739e84f1">DICompositeType</a>>(t2);</div><div class="line"><a name="l00889"></a><span class="lineno"> 889</span>  assert(c2 && <span class="stringliteral">"teq: bad cast for array type"</span>);</div><div class="line"><a name="l00890"></a><span class="lineno"> 890</span>  base2 = c2->getBaseType();</div><div class="line"><a name="l00891"></a><span class="lineno"> 891</span>  }</div><div class="line"><a name="l00892"></a><span class="lineno"> 892</span> </div><div class="line"><a name="l00893"></a><span class="lineno"> 893</span>  <span class="comment">// For ptr-to-member, there is some imprecision (but soundness) in</span></div><div class="line"><a name="l00894"></a><span class="lineno"> 894</span>  <span class="comment">// that we don't check the class type.</span></div><div class="line"><a name="l00895"></a><span class="lineno"> 895</span>  <span class="keywordflow">return</span> <a class="code" href="classSVF_1_1DCHGraph.html#acb76ab20da1bfbec00f63d08e48cbddd">teq</a>(base1, base2);</div><div class="line"><a name="l00896"></a><span class="lineno"> 896</span>  }</div><div class="line"><a name="l00897"></a><span class="lineno"> 897</span> </div><div class="line"><a name="l00898"></a><span class="lineno"> 898</span>  <span class="keywordflow">if</span> (SVFUtil::isa<DICompositeType>(t1) && SVFUtil::isa<DICompositeType>(t2))</div><div class="line"><a name="l00899"></a><span class="lineno"> 899</span>  {</div><div class="line"><a name="l00900"></a><span class="lineno"> 900</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#aded9b991c77acc5284ccead0739e84f1">DICompositeType</a> *ct1 = <a class="code" href="namespaceSVF_1_1SVFUtil.html#af6e96694d983643a66c238cce01bff0e">SVFUtil::dyn_cast</a><<a class="code" href="namespaceSVF.html#aded9b991c77acc5284ccead0739e84f1">DICompositeType</a>>(t1);</div><div class="line"><a name="l00901"></a><span class="lineno"> 901</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#aded9b991c77acc5284ccead0739e84f1">DICompositeType</a> *ct2 = <a class="code" href="namespaceSVF_1_1SVFUtil.html#af6e96694d983643a66c238cce01bff0e">SVFUtil::dyn_cast</a><<a class="code" href="namespaceSVF.html#aded9b991c77acc5284ccead0739e84f1">DICompositeType</a>>(t2);</div><div class="line"><a name="l00902"></a><span class="lineno"> 902</span> </div><div class="line"><a name="l00903"></a><span class="lineno"> 903</span>  <span class="keywordflow">if</span> (ct1->getTag() != ct2->getTag()) <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l00904"></a><span class="lineno"> 904</span> </div><div class="line"><a name="l00905"></a><span class="lineno"> 905</span>  <span class="comment">// Treat all enums the same.</span></div><div class="line"><a name="l00906"></a><span class="lineno"> 906</span>  <span class="keywordflow">if</span> (ct1->getTag() == dwarf::DW_TAG_enumeration_type)</div><div class="line"><a name="l00907"></a><span class="lineno"> 907</span>  {</div><div class="line"><a name="l00908"></a><span class="lineno"> 908</span>  <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l00909"></a><span class="lineno"> 909</span>  }</div><div class="line"><a name="l00910"></a><span class="lineno"> 910</span> </div><div class="line"><a name="l00911"></a><span class="lineno"> 911</span>  <span class="comment">// C++ classes? Check mangled name.</span></div><div class="line"><a name="l00912"></a><span class="lineno"> 912</span>  <span class="keywordflow">if</span> (ct1->getTag() == dwarf::DW_TAG_class_type)</div><div class="line"><a name="l00913"></a><span class="lineno"> 913</span>  {</div><div class="line"><a name="l00914"></a><span class="lineno"> 914</span>  <span class="keywordflow">return</span> ct1->getIdentifier() == ct2->getIdentifier();</div><div class="line"><a name="l00915"></a><span class="lineno"> 915</span>  }</div><div class="line"><a name="l00916"></a><span class="lineno"> 916</span> </div><div class="line"><a name="l00917"></a><span class="lineno"> 917</span>  <span class="comment">// Either union or struct, simply test all fields are equal.</span></div><div class="line"><a name="l00918"></a><span class="lineno"> 918</span>  <span class="comment">// Seems like it is enough to check it was defined in the same place.</span></div><div class="line"><a name="l00919"></a><span class="lineno"> 919</span>  <span class="comment">// The elements sometimes differ but are referring to the same fields.</span></div><div class="line"><a name="l00920"></a><span class="lineno"> 920</span>  <span class="keywordflow">return</span> ct1->getName() == ct2->getName()</div><div class="line"><a name="l00921"></a><span class="lineno"> 921</span>  && ct1->getFile() == ct2->getFile()</div><div class="line"><a name="l00922"></a><span class="lineno"> 922</span>  && ct1->getLine() == ct2->getLine();</div><div class="line"><a name="l00923"></a><span class="lineno"> 923</span>  }</div><div class="line"><a name="l00924"></a><span class="lineno"> 924</span> </div><div class="line"><a name="l00925"></a><span class="lineno"> 925</span>  <span class="comment">// They were not equal base types (discounting signedness), nor were they</span></div><div class="line"><a name="l00926"></a><span class="lineno"> 926</span>  <span class="comment">// "equal" pointers/references/arrays, nor were they the structurally equivalent,</span></div><div class="line"><a name="l00927"></a><span class="lineno"> 927</span>  <span class="comment">// nor were they completely equal.</span></div><div class="line"><a name="l00928"></a><span class="lineno"> 928</span>  <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l00929"></a><span class="lineno"> 929</span> }</div><div class="line"><a name="l00930"></a><span class="lineno"> 930</span> </div><div class="line"><a name="l00931"></a><span class="lineno"><a class="line" href="classSVF_1_1DCHGraph.html#a2b2dbc52089696854a8339f2e83fc333"> 931</a></span> <span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1DCHGraph.html#a2b2dbc52089696854a8339f2e83fc333">DCHGraph::isFirstField</a>(<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#ad127b0ad478640ede3d426e3a58d2632">DIType</a> *f, <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#ad127b0ad478640ede3d426e3a58d2632">DIType</a> *<a class="code" href="cJSON_8h.html#a1a175e87536301df98c805ac0636ad7c">b</a>)</div><div class="line"><a name="l00932"></a><span class="lineno"> 932</span> {</div><div class="line"><a name="l00933"></a><span class="lineno"> 933</span>  <span class="comment">// TODO: some improvements.</span></div><div class="line"><a name="l00934"></a><span class="lineno"> 934</span>  <span class="comment">// - cha should be changed to accept which edge types to use,</span></div><div class="line"><a name="l00935"></a><span class="lineno"> 935</span>  <span class="comment">// then we can call cha(..., DCHEdge::FIRST_FIELD).</span></div><div class="line"><a name="l00936"></a><span class="lineno"> 936</span>  <span class="comment">// - If not ^, this could benefit from caching.</span></div><div class="line"><a name="l00937"></a><span class="lineno"> 937</span>  f = <a class="code" href="classSVF_1_1DCHGraph.html#a079feacdcc3783f4a9108a3b2d2aed2c">getCanonicalType</a>(f);</div><div class="line"><a name="l00938"></a><span class="lineno"> 938</span>  b = <a class="code" href="classSVF_1_1DCHGraph.html#a079feacdcc3783f4a9108a3b2d2aed2c">getCanonicalType</a>(b);</div><div class="line"><a name="l00939"></a><span class="lineno"> 939</span> </div><div class="line"><a name="l00940"></a><span class="lineno"> 940</span>  <span class="keywordflow">if</span> (f == b) <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l00941"></a><span class="lineno"> 941</span> </div><div class="line"><a name="l00942"></a><span class="lineno"> 942</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1DCHNode.html">DCHNode</a> *node = <a class="code" href="classSVF_1_1DCHGraph.html#a96c68bbb5ee5e939158ce0b67da2c61d">getNode</a>(f);</div><div class="line"><a name="l00943"></a><span class="lineno"> 943</span>  assert(node && <span class="stringliteral">"DCHG::isFirstField: node not found"</span>);</div><div class="line"><a name="l00944"></a><span class="lineno"> 944</span>  <span class="comment">// Consider oneself a child, otherwise the recursion will just come up with nothing.</span></div><div class="line"><a name="l00945"></a><span class="lineno"> 945</span>  <span class="keywordflow">for</span> (<span class="keyword">const</span> <a class="code" href="classSVF_1_1DCHEdge.html">DCHEdge</a> *edge : node-><a class="code" href="classSVF_1_1GenericNode.html#afc8b5f86d7795b6a0dfc0687d942d79b">getInEdges</a>())</div><div class="line"><a name="l00946"></a><span class="lineno"> 946</span>  {</div><div class="line"><a name="l00947"></a><span class="lineno"> 947</span>  <span class="comment">// Only care about first-field edges.</span></div><div class="line"><a name="l00948"></a><span class="lineno"> 948</span>  <span class="keywordflow">if</span> (edge->getEdgeKind() == <a class="code" href="classSVF_1_1DCHEdge.html#a48f01c4a02c4e278a1ab70b16efdef4ba3b49b95b713f585b717810dce5ac6564">DCHEdge::FIRST_FIELD</a>)</div><div class="line"><a name="l00949"></a><span class="lineno"> 949</span>  {</div><div class="line"><a name="l00950"></a><span class="lineno"> 950</span>  <span class="keywordflow">if</span> (edge->getSrcNode()->getType() == <a class="code" href="cJSON_8h.html#a1a175e87536301df98c805ac0636ad7c">b</a>) <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l00951"></a><span class="lineno"> 951</span>  <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1DCHGraph.html#a2b2dbc52089696854a8339f2e83fc333">isFirstField</a>(edge->getSrcNode()->getType(), <a class="code" href="cJSON_8h.html#a1a175e87536301df98c805ac0636ad7c">b</a>)) <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l00952"></a><span class="lineno"> 952</span>  }</div><div class="line"><a name="l00953"></a><span class="lineno"> 953</span>  }</div><div class="line"><a name="l00954"></a><span class="lineno"> 954</span> </div><div class="line"><a name="l00955"></a><span class="lineno"> 955</span>  <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l00956"></a><span class="lineno"> 956</span> }</div><div class="line"><a name="l00957"></a><span class="lineno"> 957</span> </div><div class="line"><a name="l00958"></a><span class="lineno"><a class="line" href="classSVF_1_1DCHGraph.html#a2dc488345cc3a5f37079952f638d8c2b"> 958</a></span> <a class="code" href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">std::string</a> <a class="code" href="classSVF_1_1DCHGraph.html#a2dc488345cc3a5f37079952f638d8c2b">DCHGraph::diTypeToStr</a>(<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#ad127b0ad478640ede3d426e3a58d2632">DIType</a> *t)</div><div class="line"><a name="l00959"></a><span class="lineno"> 959</span> {</div><div class="line"><a name="l00960"></a><span class="lineno"> 960</span>  std::stringstream ss;</div><div class="line"><a name="l00961"></a><span class="lineno"> 961</span> </div><div class="line"><a name="l00962"></a><span class="lineno"> 962</span>  <span class="keywordflow">if</span> (t == <span class="keyword">nullptr</span>)</div><div class="line"><a name="l00963"></a><span class="lineno"> 963</span>  {</div><div class="line"><a name="l00964"></a><span class="lineno"> 964</span>  <span class="keywordflow">return</span> <span class="stringliteral">"void"</span>;</div><div class="line"><a name="l00965"></a><span class="lineno"> 965</span>  }</div><div class="line"><a name="l00966"></a><span class="lineno"> 966</span> </div><div class="line"><a name="l00967"></a><span class="lineno"> 967</span>  <span class="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#ada0513be7e25325325ccc9183aeca278">DIBasicType</a> *bt = SVFUtil::dyn_cast<DIBasicType>(t))</div><div class="line"><a name="l00968"></a><span class="lineno"> 968</span>  {</div><div class="line"><a name="l00969"></a><span class="lineno"> 969</span>  ss << bt->getName().str();</div><div class="line"><a name="l00970"></a><span class="lineno"> 970</span>  }</div><div class="line"><a name="l00971"></a><span class="lineno"> 971</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a852e75c562139237fcc754c7461533e6">DIDerivedType</a> *dt = SVFUtil::dyn_cast<DIDerivedType>(t))</div><div class="line"><a name="l00972"></a><span class="lineno"> 972</span>  {</div><div class="line"><a name="l00973"></a><span class="lineno"> 973</span>  <span class="keywordflow">if</span> (dt->getName() == <span class="stringliteral">"__vtbl_ptr_type"</span>)</div><div class="line"><a name="l00974"></a><span class="lineno"> 974</span>  {</div><div class="line"><a name="l00975"></a><span class="lineno"> 975</span>  ss << <span class="stringliteral">"(vtbl * =) __vtbl_ptr_type"</span>;</div><div class="line"><a name="l00976"></a><span class="lineno"> 976</span>  }</div><div class="line"><a name="l00977"></a><span class="lineno"> 977</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (dt->getTag() == dwarf::DW_TAG_const_type)</div><div class="line"><a name="l00978"></a><span class="lineno"> 978</span>  {</div><div class="line"><a name="l00979"></a><span class="lineno"> 979</span>  ss << <span class="stringliteral">"const "</span> << <a class="code" href="classSVF_1_1DCHGraph.html#a2dc488345cc3a5f37079952f638d8c2b">diTypeToStr</a>(dt->getBaseType());</div><div class="line"><a name="l00980"></a><span class="lineno"> 980</span>  }</div><div class="line"><a name="l00981"></a><span class="lineno"> 981</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (dt->getTag() == dwarf::DW_TAG_volatile_type)</div><div class="line"><a name="l00982"></a><span class="lineno"> 982</span>  {</div><div class="line"><a name="l00983"></a><span class="lineno"> 983</span>  ss << <span class="stringliteral">"volatile "</span> << <a class="code" href="classSVF_1_1DCHGraph.html#a2dc488345cc3a5f37079952f638d8c2b">diTypeToStr</a>(dt->getBaseType());</div><div class="line"><a name="l00984"></a><span class="lineno"> 984</span>  }</div><div class="line"><a name="l00985"></a><span class="lineno"> 985</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (dt->getTag() == dwarf::DW_TAG_restrict_type)</div><div class="line"><a name="l00986"></a><span class="lineno"> 986</span>  {</div><div class="line"><a name="l00987"></a><span class="lineno"> 987</span>  ss << <span class="stringliteral">"restrict "</span> << <a class="code" href="classSVF_1_1DCHGraph.html#a2dc488345cc3a5f37079952f638d8c2b">diTypeToStr</a>(dt->getBaseType());</div><div class="line"><a name="l00988"></a><span class="lineno"> 988</span>  }</div><div class="line"><a name="l00989"></a><span class="lineno"> 989</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (dt->getTag() == dwarf::DW_TAG_atomic_type)</div><div class="line"><a name="l00990"></a><span class="lineno"> 990</span>  {</div><div class="line"><a name="l00991"></a><span class="lineno"> 991</span>  ss << <span class="stringliteral">"atomic "</span> << <a class="code" href="classSVF_1_1DCHGraph.html#a2dc488345cc3a5f37079952f638d8c2b">diTypeToStr</a>(dt->getBaseType());</div><div class="line"><a name="l00992"></a><span class="lineno"> 992</span>  }</div><div class="line"><a name="l00993"></a><span class="lineno"> 993</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (dt->getTag() == dwarf::DW_TAG_pointer_type)</div><div class="line"><a name="l00994"></a><span class="lineno"> 994</span>  {</div><div class="line"><a name="l00995"></a><span class="lineno"> 995</span>  ss << <a class="code" href="classSVF_1_1DCHGraph.html#a2dc488345cc3a5f37079952f638d8c2b">diTypeToStr</a>(dt->getBaseType()) << <span class="stringliteral">" *"</span>;</div><div class="line"><a name="l00996"></a><span class="lineno"> 996</span>  }</div><div class="line"><a name="l00997"></a><span class="lineno"> 997</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (dt->getTag() == dwarf::DW_TAG_ptr_to_member_type)</div><div class="line"><a name="l00998"></a><span class="lineno"> 998</span>  {</div><div class="line"><a name="l00999"></a><span class="lineno"> 999</span>  ss << <a class="code" href="classSVF_1_1DCHGraph.html#a2dc488345cc3a5f37079952f638d8c2b">diTypeToStr</a>(dt->getBaseType())</div><div class="line"><a name="l01000"></a><span class="lineno"> 1000</span>  << <span class="stringliteral">" "</span> << <a class="code" href="classSVF_1_1DCHGraph.html#a2dc488345cc3a5f37079952f638d8c2b">diTypeToStr</a>(SVFUtil::dyn_cast<DIType>(dt->getExtraData())) << <span class="stringliteral">"::*"</span>;</div><div class="line"><a name="l01001"></a><span class="lineno"> 1001</span>  }</div><div class="line"><a name="l01002"></a><span class="lineno"> 1002</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (dt->getTag() == dwarf::DW_TAG_reference_type)</div><div class="line"><a name="l01003"></a><span class="lineno"> 1003</span>  {</div><div class="line"><a name="l01004"></a><span class="lineno"> 1004</span>  ss << <a class="code" href="classSVF_1_1DCHGraph.html#a2dc488345cc3a5f37079952f638d8c2b">diTypeToStr</a>(dt->getBaseType()) << <span class="stringliteral">" &"</span>;</div><div class="line"><a name="l01005"></a><span class="lineno"> 1005</span>  }</div><div class="line"><a name="l01006"></a><span class="lineno"> 1006</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (dt->getTag() == dwarf::DW_TAG_rvalue_reference_type)</div><div class="line"><a name="l01007"></a><span class="lineno"> 1007</span>  {</div><div class="line"><a name="l01008"></a><span class="lineno"> 1008</span>  ss << <a class="code" href="classSVF_1_1DCHGraph.html#a2dc488345cc3a5f37079952f638d8c2b">diTypeToStr</a>(dt->getBaseType()) << <span class="stringliteral">" &&"</span>;</div><div class="line"><a name="l01009"></a><span class="lineno"> 1009</span>  }</div><div class="line"><a name="l01010"></a><span class="lineno"> 1010</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (dt->getTag() == dwarf::DW_TAG_typedef)</div><div class="line"><a name="l01011"></a><span class="lineno"> 1011</span>  {</div><div class="line"><a name="l01012"></a><span class="lineno"> 1012</span>  ss << dt->getName().str() << <span class="stringliteral">"->"</span> << <a class="code" href="classSVF_1_1DCHGraph.html#a2dc488345cc3a5f37079952f638d8c2b">diTypeToStr</a>(dt->getBaseType());</div><div class="line"><a name="l01013"></a><span class="lineno"> 1013</span>  }</div><div class="line"><a name="l01014"></a><span class="lineno"> 1014</span>  }</div><div class="line"><a name="l01015"></a><span class="lineno"> 1015</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#aded9b991c77acc5284ccead0739e84f1">DICompositeType</a> *ct = SVFUtil::dyn_cast<DICompositeType>(t))</div><div class="line"><a name="l01016"></a><span class="lineno"> 1016</span>  {</div><div class="line"><a name="l01017"></a><span class="lineno"> 1017</span>  <span class="keywordflow">if</span> (ct->getTag() == dwarf::DW_TAG_class_type</div><div class="line"><a name="l01018"></a><span class="lineno"> 1018</span>  || ct->getTag() == dwarf::DW_TAG_structure_type</div><div class="line"><a name="l01019"></a><span class="lineno"> 1019</span>  || ct->getTag() == dwarf::DW_TAG_union_type)</div><div class="line"><a name="l01020"></a><span class="lineno"> 1020</span>  {</div><div class="line"><a name="l01021"></a><span class="lineno"> 1021</span> </div><div class="line"><a name="l01022"></a><span class="lineno"> 1022</span>  <span class="keywordflow">if</span> (ct->getTag() == dwarf::DW_TAG_class_type)</div><div class="line"><a name="l01023"></a><span class="lineno"> 1023</span>  {</div><div class="line"><a name="l01024"></a><span class="lineno"> 1024</span>  ss << <span class="stringliteral">"class"</span>;</div><div class="line"><a name="l01025"></a><span class="lineno"> 1025</span>  }</div><div class="line"><a name="l01026"></a><span class="lineno"> 1026</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (ct->getTag() == dwarf::DW_TAG_structure_type)</div><div class="line"><a name="l01027"></a><span class="lineno"> 1027</span>  {</div><div class="line"><a name="l01028"></a><span class="lineno"> 1028</span>  ss << <span class="stringliteral">"struct"</span>;</div><div class="line"><a name="l01029"></a><span class="lineno"> 1029</span>  }</div><div class="line"><a name="l01030"></a><span class="lineno"> 1030</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (ct->getTag() == dwarf::DW_TAG_union_type)</div><div class="line"><a name="l01031"></a><span class="lineno"> 1031</span>  {</div><div class="line"><a name="l01032"></a><span class="lineno"> 1032</span>  ss << <span class="stringliteral">"union"</span>;</div><div class="line"><a name="l01033"></a><span class="lineno"> 1033</span>  }</div><div class="line"><a name="l01034"></a><span class="lineno"> 1034</span> </div><div class="line"><a name="l01035"></a><span class="lineno"> 1035</span>  ss << <span class="stringliteral">"."</span>;</div><div class="line"><a name="l01036"></a><span class="lineno"> 1036</span> </div><div class="line"><a name="l01037"></a><span class="lineno"> 1037</span>  <span class="keywordflow">if</span> (ct->getName() != <span class="stringliteral">""</span>)</div><div class="line"><a name="l01038"></a><span class="lineno"> 1038</span>  {</div><div class="line"><a name="l01039"></a><span class="lineno"> 1039</span>  ss << ct->getName().str();</div><div class="line"><a name="l01040"></a><span class="lineno"> 1040</span>  }</div><div class="line"><a name="l01041"></a><span class="lineno"> 1041</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l01042"></a><span class="lineno"> 1042</span>  {</div><div class="line"><a name="l01043"></a><span class="lineno"> 1043</span>  <span class="comment">// Iterate over the element types.</span></div><div class="line"><a name="l01044"></a><span class="lineno"> 1044</span>  ss << <span class="stringliteral">"{ "</span>;</div><div class="line"><a name="l01045"></a><span class="lineno"> 1045</span> </div><div class="line"><a name="l01046"></a><span class="lineno"> 1046</span>  <a class="code" href="namespaceSVF.html#a0f825e73d115173b05ca54fb8ec65003">DINodeArray</a> fields = ct->getElements();</div><div class="line"><a name="l01047"></a><span class="lineno"> 1047</span>  <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> i = 0; i < fields.size(); ++i)</div><div class="line"><a name="l01048"></a><span class="lineno"> 1048</span>  {</div><div class="line"><a name="l01049"></a><span class="lineno"> 1049</span>  <span class="comment">// fields[i] gives a type which is DW_TAG_member, we want the member's type (getBaseType).</span></div><div class="line"><a name="l01050"></a><span class="lineno"> 1050</span>  <span class="comment">// It can also give a Subprogram type if the class just had non-virtual functions.</span></div><div class="line"><a name="l01051"></a><span class="lineno"> 1051</span>  <span class="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a89c7208bfc0b57873dfa574f52050295">DISubprogram</a> *sp = SVFUtil::dyn_cast<DISubprogram>(fields[i]))</div><div class="line"><a name="l01052"></a><span class="lineno"> 1052</span>  {</div><div class="line"><a name="l01053"></a><span class="lineno"> 1053</span>  ss << sp->getName().str();</div><div class="line"><a name="l01054"></a><span class="lineno"> 1054</span>  }</div><div class="line"><a name="l01055"></a><span class="lineno"> 1055</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a852e75c562139237fcc754c7461533e6">DIDerivedType</a> *mt = SVFUtil::dyn_cast<DIDerivedType>(fields[i]))</div><div class="line"><a name="l01056"></a><span class="lineno"> 1056</span>  {</div><div class="line"><a name="l01057"></a><span class="lineno"> 1057</span>  assert(mt->getTag() == dwarf::DW_TAG_member && <span class="stringliteral">"DCHG: expected member"</span>);</div><div class="line"><a name="l01058"></a><span class="lineno"> 1058</span>  ss << <a class="code" href="classSVF_1_1DCHGraph.html#a2dc488345cc3a5f37079952f638d8c2b">diTypeToStr</a>(mt->getBaseType());</div><div class="line"><a name="l01059"></a><span class="lineno"> 1059</span>  }</div><div class="line"><a name="l01060"></a><span class="lineno"> 1060</span> </div><div class="line"><a name="l01061"></a><span class="lineno"> 1061</span>  <span class="keywordflow">if</span> (i != fields.size() - 1)</div><div class="line"><a name="l01062"></a><span class="lineno"> 1062</span>  {</div><div class="line"><a name="l01063"></a><span class="lineno"> 1063</span>  ss << <span class="stringliteral">", "</span>;</div><div class="line"><a name="l01064"></a><span class="lineno"> 1064</span>  }</div><div class="line"><a name="l01065"></a><span class="lineno"> 1065</span>  }</div><div class="line"><a name="l01066"></a><span class="lineno"> 1066</span> </div><div class="line"><a name="l01067"></a><span class="lineno"> 1067</span>  ss << <span class="stringliteral">" }"</span>;</div><div class="line"><a name="l01068"></a><span class="lineno"> 1068</span>  }</div><div class="line"><a name="l01069"></a><span class="lineno"> 1069</span>  }</div><div class="line"><a name="l01070"></a><span class="lineno"> 1070</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (ct->getTag() == dwarf::DW_TAG_array_type)</div><div class="line"><a name="l01071"></a><span class="lineno"> 1071</span>  {</div><div class="line"><a name="l01072"></a><span class="lineno"> 1072</span>  ss << <a class="code" href="classSVF_1_1DCHGraph.html#a2dc488345cc3a5f37079952f638d8c2b">diTypeToStr</a>(ct->getBaseType());</div><div class="line"><a name="l01073"></a><span class="lineno"> 1073</span>  <a class="code" href="namespaceSVF.html#a0f825e73d115173b05ca54fb8ec65003">DINodeArray</a> sizes = ct->getElements();</div><div class="line"><a name="l01074"></a><span class="lineno"> 1074</span>  <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> i = 0; i < sizes.size(); ++i)</div><div class="line"><a name="l01075"></a><span class="lineno"> 1075</span>  {</div><div class="line"><a name="l01076"></a><span class="lineno"> 1076</span>  <a class="code" href="namespaceSVF.html#a99bc1228f07429855c81a720be862dc6">DISubrange</a> *sr = <a class="code" href="namespaceSVF_1_1SVFUtil.html#af6e96694d983643a66c238cce01bff0e">SVFUtil::dyn_cast</a><<a class="code" href="namespaceSVF.html#a99bc1228f07429855c81a720be862dc6">DISubrange</a>>(sizes[0]);</div><div class="line"><a name="l01077"></a><span class="lineno"> 1077</span>  assert(sr != <span class="keyword">nullptr</span> && <span class="stringliteral">"DCHG: non-subrange as array element?"</span>);</div><div class="line"><a name="l01078"></a><span class="lineno"> 1078</span>  int64_t <a class="code" href="cJSON_8h.html#ad43c3812e6d13e0518d9f8b8f463ffcf">count</a> = -1;</div><div class="line"><a name="l01079"></a><span class="lineno"> 1079</span>  <span class="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#adefcb50414ea999d70cea5ccdbcb98d7">ConstantInt</a>* ci = sr->getCount().dyn_cast<<a class="code" href="namespaceSVF.html#adefcb50414ea999d70cea5ccdbcb98d7">ConstantInt</a>* >())</div><div class="line"><a name="l01080"></a><span class="lineno"> 1080</span>  {</div><div class="line"><a name="l01081"></a><span class="lineno"> 1081</span>  count = ci->getSExtValue();</div><div class="line"><a name="l01082"></a><span class="lineno"> 1082</span>  }</div><div class="line"><a name="l01083"></a><span class="lineno"> 1083</span> </div><div class="line"><a name="l01084"></a><span class="lineno"> 1084</span>  ss << <span class="stringliteral">"["</span> << count << <span class="stringliteral">"]"</span>;</div><div class="line"><a name="l01085"></a><span class="lineno"> 1085</span>  }</div><div class="line"><a name="l01086"></a><span class="lineno"> 1086</span>  }</div><div class="line"><a name="l01087"></a><span class="lineno"> 1087</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (ct->getTag() == dwarf::DW_TAG_enumeration_type)</div><div class="line"><a name="l01088"></a><span class="lineno"> 1088</span>  {</div><div class="line"><a name="l01089"></a><span class="lineno"> 1089</span>  ss << <span class="stringliteral">"enum "</span> << <a class="code" href="classSVF_1_1DCHGraph.html#a2dc488345cc3a5f37079952f638d8c2b">diTypeToStr</a>(ct->getBaseType());</div><div class="line"><a name="l01090"></a><span class="lineno"> 1090</span>  }</div><div class="line"><a name="l01091"></a><span class="lineno"> 1091</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (ct->getTag() == dwarf::DW_TAG_union_type)</div><div class="line"><a name="l01092"></a><span class="lineno"> 1092</span>  {</div><div class="line"><a name="l01093"></a><span class="lineno"> 1093</span> </div><div class="line"><a name="l01094"></a><span class="lineno"> 1094</span>  }</div><div class="line"><a name="l01095"></a><span class="lineno"> 1095</span>  }</div><div class="line"><a name="l01096"></a><span class="lineno"> 1096</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a090e0791e8c200104ed3ab6bab157129">DISubroutineType</a> *st = SVFUtil::dyn_cast<DISubroutineType>(t))</div><div class="line"><a name="l01097"></a><span class="lineno"> 1097</span>  {</div><div class="line"><a name="l01098"></a><span class="lineno"> 1098</span>  <a class="code" href="namespaceSVF.html#a9d3ee421789884473bfacfaa9ec007cc">DITypeRefArray</a> types = st->getTypeArray();</div><div class="line"><a name="l01099"></a><span class="lineno"> 1099</span>  <span class="comment">// Must have one element at least (the first type).</span></div><div class="line"><a name="l01100"></a><span class="lineno"> 1100</span>  ss << <a class="code" href="classSVF_1_1DCHGraph.html#a2dc488345cc3a5f37079952f638d8c2b">diTypeToStr</a>(types[0]) << <span class="stringliteral">" fn("</span>;</div><div class="line"><a name="l01101"></a><span class="lineno"> 1101</span>  <span class="keywordflow">if</span> (types.size() == 1)</div><div class="line"><a name="l01102"></a><span class="lineno"> 1102</span>  {</div><div class="line"><a name="l01103"></a><span class="lineno"> 1103</span>  ss << <span class="stringliteral">"void)"</span>;</div><div class="line"><a name="l01104"></a><span class="lineno"> 1104</span>  }</div><div class="line"><a name="l01105"></a><span class="lineno"> 1105</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l01106"></a><span class="lineno"> 1106</span>  {</div><div class="line"><a name="l01107"></a><span class="lineno"> 1107</span>  <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> i = 1; i < types.size(); ++i)</div><div class="line"><a name="l01108"></a><span class="lineno"> 1108</span>  {</div><div class="line"><a name="l01109"></a><span class="lineno"> 1109</span>  ss << <a class="code" href="classSVF_1_1DCHGraph.html#a2dc488345cc3a5f37079952f638d8c2b">diTypeToStr</a>(types[i]);</div><div class="line"><a name="l01110"></a><span class="lineno"> 1110</span>  <span class="keywordflow">if</span> (i + 1 != types.size())</div><div class="line"><a name="l01111"></a><span class="lineno"> 1111</span>  {</div><div class="line"><a name="l01112"></a><span class="lineno"> 1112</span>  <span class="comment">// There's another type.</span></div><div class="line"><a name="l01113"></a><span class="lineno"> 1113</span>  ss << <span class="stringliteral">", "</span>;</div><div class="line"><a name="l01114"></a><span class="lineno"> 1114</span>  }</div><div class="line"><a name="l01115"></a><span class="lineno"> 1115</span>  }</div><div class="line"><a name="l01116"></a><span class="lineno"> 1116</span> </div><div class="line"><a name="l01117"></a><span class="lineno"> 1117</span>  ss << <span class="stringliteral">")"</span>;</div><div class="line"><a name="l01118"></a><span class="lineno"> 1118</span>  }</div><div class="line"><a name="l01119"></a><span class="lineno"> 1119</span> </div><div class="line"><a name="l01120"></a><span class="lineno"> 1120</span>  ss << st->getName().str();</div><div class="line"><a name="l01121"></a><span class="lineno"> 1121</span>  }</div><div class="line"><a name="l01122"></a><span class="lineno"> 1122</span> </div><div class="line"><a name="l01123"></a><span class="lineno"> 1123</span>  <span class="keywordflow">return</span> ss.str();</div><div class="line"><a name="l01124"></a><span class="lineno"> 1124</span> }</div><div class="line"><a name="l01125"></a><span class="lineno"> 1125</span> </div><div class="line"><a name="l01126"></a><span class="lineno"><a class="line" href="DCHG_8cpp.html#a6673217180d3b6fb73c7c6387777f269"> 1126</a></span> <span class="keyword">static</span> <a class="code" href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">std::string</a> <a class="code" href="DCHG_8cpp.html#a6673217180d3b6fb73c7c6387777f269">indent</a>(<span class="keywordtype">size_t</span> <a class="code" href="cJSON_8cpp.html#ab6e2ea6dc7bd57d1483413449998230a">n</a>)</div><div class="line"><a name="l01127"></a><span class="lineno"> 1127</span> {</div><div class="line"><a name="l01128"></a><span class="lineno"> 1128</span>  <span class="keywordflow">return</span> <a class="code" href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">std::string</a>(n, <span class="charliteral">' '</span>);</div><div class="line"><a name="l01129"></a><span class="lineno"> 1129</span> }</div><div class="line"><a name="l01130"></a><span class="lineno"> 1130</span> </div><div class="line"><a name="l01131"></a><span class="lineno"><a class="line" href="classSVF_1_1DCHGraph.html#a5f08ed4cbba3e4b7a348d5ad77664726"> 1131</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1DCHGraph.html#a5f08ed4cbba3e4b7a348d5ad77664726">DCHGraph::print</a>(<span class="keywordtype">void</span>)</div><div class="line"><a name="l01132"></a><span class="lineno"> 1132</span> {</div><div class="line"><a name="l01133"></a><span class="lineno"> 1133</span>  <span class="keyword">static</span> <span class="keyword">const</span> <a class="code" href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">std::string</a> line = <span class="stringliteral">"-------------------------------------\n"</span>;</div><div class="line"><a name="l01134"></a><span class="lineno"> 1134</span>  <span class="keyword">static</span> <span class="keyword">const</span> <a class="code" href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">std::string</a> thickLine = <span class="stringliteral">"=====================================\n"</span>;</div><div class="line"><a name="l01135"></a><span class="lineno"> 1135</span>  <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">size_t</span> singleIndent = 2;</div><div class="line"><a name="l01136"></a><span class="lineno"> 1136</span> </div><div class="line"><a name="l01137"></a><span class="lineno"> 1137</span>  <span class="keywordtype">size_t</span> currIndent = 0;</div><div class="line"><a name="l01138"></a><span class="lineno"> 1138</span>  <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">SVFUtil::outs</a>() << thickLine;</div><div class="line"><a name="l01139"></a><span class="lineno"> 1139</span>  <span class="keywordtype">unsigned</span> numStructs = 0;</div><div class="line"><a name="l01140"></a><span class="lineno"> 1140</span>  <span class="keywordtype">unsigned</span> largestStruct = 0;</div><div class="line"><a name="l01141"></a><span class="lineno"> 1141</span>  <a class="code" href="namespaceSVF.html#a212231734fa43d5c7414137deaac7df3">NodeSet</a> <a class="code" href="namespaceSVF.html#ae6c7046834fe00382052ece7d06eb0ac">nodes</a>;</div><div class="line"><a name="l01142"></a><span class="lineno"> 1142</span>  <span class="keywordflow">for</span> (<a class="code" href="classSVF_1_1GenericGraph.html#a5dfa3f178d4abf37177d0d74ff4c6a97">DCHGraph::const_iterator</a> it = <a class="code" href="classSVF_1_1GenericGraph.html#a0d9744b1b0e7a09a6f7af29188e243b7">begin</a>(); it != <a class="code" href="classSVF_1_1GenericGraph.html#a4bef15157423cef48dc7333a803cd27d">end</a>(); ++it)</div><div class="line"><a name="l01143"></a><span class="lineno"> 1143</span>  {</div><div class="line"><a name="l01144"></a><span class="lineno"> 1144</span>  nodes.insert(it->first);</div><div class="line"><a name="l01145"></a><span class="lineno"> 1145</span>  }</div><div class="line"><a name="l01146"></a><span class="lineno"> 1146</span> </div><div class="line"><a name="l01147"></a><span class="lineno"> 1147</span>  <span class="keywordflow">for</span> (<a class="code" href="namespaceSVF.html#a350ae9bf8606bdfe23c8679681b969dc">NodeID</a> <span class="keywordtype">id</span> : nodes)</div><div class="line"><a name="l01148"></a><span class="lineno"> 1148</span>  {</div><div class="line"><a name="l01149"></a><span class="lineno"> 1149</span>  <span class="keywordflow">if</span> (*nodes.begin() != id)</div><div class="line"><a name="l01150"></a><span class="lineno"> 1150</span>  {</div><div class="line"><a name="l01151"></a><span class="lineno"> 1151</span>  <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">SVFUtil::outs</a>() << line;</div><div class="line"><a name="l01152"></a><span class="lineno"> 1152</span>  }</div><div class="line"><a name="l01153"></a><span class="lineno"> 1153</span> </div><div class="line"><a name="l01154"></a><span class="lineno"> 1154</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1DCHNode.html">DCHNode</a> *node = <a class="code" href="classSVF_1_1GenericGraph.html#a43c9c773bfa17abf481c33073e30d01b">getGNode</a>(<span class="keywordtype">id</span>);</div><div class="line"><a name="l01155"></a><span class="lineno"> 1155</span> </div><div class="line"><a name="l01156"></a><span class="lineno"> 1156</span>  <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">SVFUtil::outs</a>() << <a class="code" href="DCHG_8cpp.html#a6673217180d3b6fb73c7c6387777f269">indent</a>(currIndent) << <span class="keywordtype">id</span> << <span class="stringliteral">": "</span> << <a class="code" href="classSVF_1_1DCHGraph.html#a2dc488345cc3a5f37079952f638d8c2b">diTypeToStr</a>(node-><a class="code" href="classSVF_1_1DCHNode.html#aaf4036d892bdae02a01d31bfe3db2153">getType</a>()) << <span class="stringliteral">" ["</span> << node-><a class="code" href="classSVF_1_1DCHNode.html#aaf4036d892bdae02a01d31bfe3db2153">getType</a>() << <span class="stringliteral">"]"</span> << <span class="stringliteral">"\n"</span>;</div><div class="line"><a name="l01157"></a><span class="lineno"> 1157</span>  <span class="keywordflow">if</span> (node-><a class="code" href="classSVF_1_1DCHNode.html#aaf4036d892bdae02a01d31bfe3db2153">getType</a>() != <span class="keyword">nullptr</span></div><div class="line"><a name="l01158"></a><span class="lineno"> 1158</span>  && (node-><a class="code" href="classSVF_1_1DCHNode.html#aaf4036d892bdae02a01d31bfe3db2153">getType</a>()->getTag() == dwarf::DW_TAG_class_type</div><div class="line"><a name="l01159"></a><span class="lineno"> 1159</span>  || node-><a class="code" href="classSVF_1_1DCHNode.html#aaf4036d892bdae02a01d31bfe3db2153">getType</a>()->getTag() == dwarf::DW_TAG_structure_type))</div><div class="line"><a name="l01160"></a><span class="lineno"> 1160</span>  {</div><div class="line"><a name="l01161"></a><span class="lineno"> 1161</span>  ++numStructs;</div><div class="line"><a name="l01162"></a><span class="lineno"> 1162</span>  <span class="keywordtype">unsigned</span> numFields = <a class="code" href="classSVF_1_1DCHGraph.html#ae9a0007299178912e2568dc7158d6824">getFieldTypes</a>(node-><a class="code" href="classSVF_1_1DCHNode.html#aaf4036d892bdae02a01d31bfe3db2153">getType</a>()).size();</div><div class="line"><a name="l01163"></a><span class="lineno"> 1163</span>  largestStruct = numFields > largestStruct ? numFields : largestStruct;</div><div class="line"><a name="l01164"></a><span class="lineno"> 1164</span>  }</div><div class="line"><a name="l01165"></a><span class="lineno"> 1165</span> </div><div class="line"><a name="l01166"></a><span class="lineno"> 1166</span>  currIndent += singleIndent;</div><div class="line"><a name="l01167"></a><span class="lineno"> 1167</span>  <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">SVFUtil::outs</a>() << <a class="code" href="DCHG_8cpp.html#a6673217180d3b6fb73c7c6387777f269">indent</a>(currIndent) << <span class="stringliteral">"Virtual functions\n"</span>;</div><div class="line"><a name="l01168"></a><span class="lineno"> 1168</span>  currIndent += singleIndent;</div><div class="line"><a name="l01169"></a><span class="lineno"> 1169</span>  <span class="keyword">const</span> std::vector<std::vector<const Function* >> &vfnVectors = node-><a class="code" href="classSVF_1_1DCHNode.html#a806a65f35c9f4ea118c1ef44ddb46079">getVfnVectors</a>();</div><div class="line"><a name="l01170"></a><span class="lineno"> 1170</span>  <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> i = 0; i < vfnVectors.size(); ++i)</div><div class="line"><a name="l01171"></a><span class="lineno"> 1171</span>  {</div><div class="line"><a name="l01172"></a><span class="lineno"> 1172</span>  <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">SVFUtil::outs</a>() << <a class="code" href="DCHG_8cpp.html#a6673217180d3b6fb73c7c6387777f269">indent</a>(currIndent) << <span class="stringliteral">"[ vtable #"</span> << i << <span class="stringliteral">" ]\n"</span>;</div><div class="line"><a name="l01173"></a><span class="lineno"> 1173</span>  currIndent += singleIndent;</div><div class="line"><a name="l01174"></a><span class="lineno"> 1174</span>  <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> j = 0; j < vfnVectors[i].size(); ++j)</div><div class="line"><a name="l01175"></a><span class="lineno"> 1175</span>  {</div><div class="line"><a name="l01176"></a><span class="lineno"> 1176</span>  <span class="keyword">struct </span><a class="code" href="structSVF_1_1cppUtil_1_1DemangledName.html">cppUtil::DemangledName</a> dname = <a class="code" href="namespaceSVF_1_1cppUtil.html#a1007c092efaeae41002efd91b803a7f6">cppUtil::demangle</a>(vfnVectors[i][j]->getName().str());</div><div class="line"><a name="l01177"></a><span class="lineno"> 1177</span>  <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">SVFUtil::outs</a>() << <a class="code" href="DCHG_8cpp.html#a6673217180d3b6fb73c7c6387777f269">indent</a>(currIndent) << <span class="stringliteral">"["</span> << j << <span class="stringliteral">"] "</span></div><div class="line"><a name="l01178"></a><span class="lineno"> 1178</span>  << dname.<a class="code" href="structSVF_1_1cppUtil_1_1DemangledName.html#a5cd207bce618521166e6fa235014b297">className</a> << <span class="stringliteral">"::"</span> << dname.<a class="code" href="structSVF_1_1cppUtil_1_1DemangledName.html#a1dd17b240663bc9412adefde82385e02">funcName</a> << <span class="stringliteral">"\n"</span>;</div><div class="line"><a name="l01179"></a><span class="lineno"> 1179</span>  }</div><div class="line"><a name="l01180"></a><span class="lineno"> 1180</span> </div><div class="line"><a name="l01181"></a><span class="lineno"> 1181</span>  currIndent -= singleIndent;</div><div class="line"><a name="l01182"></a><span class="lineno"> 1182</span>  }</div><div class="line"><a name="l01183"></a><span class="lineno"> 1183</span> </div><div class="line"><a name="l01184"></a><span class="lineno"> 1184</span>  <span class="comment">// Nothing was printed.</span></div><div class="line"><a name="l01185"></a><span class="lineno"> 1185</span>  <span class="keywordflow">if</span> (vfnVectors.size() == 0)</div><div class="line"><a name="l01186"></a><span class="lineno"> 1186</span>  {</div><div class="line"><a name="l01187"></a><span class="lineno"> 1187</span>  <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">SVFUtil::outs</a>() << <a class="code" href="DCHG_8cpp.html#a6673217180d3b6fb73c7c6387777f269">indent</a>(currIndent) << <span class="stringliteral">"(none)\n"</span>;</div><div class="line"><a name="l01188"></a><span class="lineno"> 1188</span>  }</div><div class="line"><a name="l01189"></a><span class="lineno"> 1189</span> </div><div class="line"><a name="l01190"></a><span class="lineno"> 1190</span>  currIndent -= singleIndent;</div><div class="line"><a name="l01191"></a><span class="lineno"> 1191</span> </div><div class="line"><a name="l01192"></a><span class="lineno"> 1192</span>  <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">SVFUtil::outs</a>() << <a class="code" href="DCHG_8cpp.html#a6673217180d3b6fb73c7c6387777f269">indent</a>(currIndent) << <span class="stringliteral">"Bases\n"</span>;</div><div class="line"><a name="l01193"></a><span class="lineno"> 1193</span>  currIndent += singleIndent;</div><div class="line"><a name="l01194"></a><span class="lineno"> 1194</span>  <span class="keywordflow">for</span> (<span class="keyword">const</span> <a class="code" href="classSVF_1_1DCHEdge.html">DCHEdge</a> *edge : node-><a class="code" href="classSVF_1_1GenericNode.html#a2d9cd758d6f8c5189d9b90b74f43e009">getOutEdges</a>())</div><div class="line"><a name="l01195"></a><span class="lineno"> 1195</span>  {</div><div class="line"><a name="l01196"></a><span class="lineno"> 1196</span>  <a class="code" href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">std::string</a> arrow;</div><div class="line"><a name="l01197"></a><span class="lineno"> 1197</span>  <span class="keywordflow">if</span> (edge->getEdgeKind() == <a class="code" href="classSVF_1_1DCHEdge.html#a48f01c4a02c4e278a1ab70b16efdef4ba9c05805c60fe04033bd9815968059e90">DCHEdge::INHERITANCE</a>)</div><div class="line"><a name="l01198"></a><span class="lineno"> 1198</span>  {</div><div class="line"><a name="l01199"></a><span class="lineno"> 1199</span>  arrow = <span class="stringliteral">"--inheritance-->"</span>;</div><div class="line"><a name="l01200"></a><span class="lineno"> 1200</span>  }</div><div class="line"><a name="l01201"></a><span class="lineno"> 1201</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (edge->getEdgeKind() == <a class="code" href="classSVF_1_1DCHEdge.html#a48f01c4a02c4e278a1ab70b16efdef4ba3b49b95b713f585b717810dce5ac6564">DCHEdge::FIRST_FIELD</a>)</div><div class="line"><a name="l01202"></a><span class="lineno"> 1202</span>  {</div><div class="line"><a name="l01203"></a><span class="lineno"> 1203</span>  arrow = <span class="stringliteral">"--first-field-->"</span>;</div><div class="line"><a name="l01204"></a><span class="lineno"> 1204</span>  }</div><div class="line"><a name="l01205"></a><span class="lineno"> 1205</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (edge->getEdgeKind() == <a class="code" href="classSVF_1_1DCHEdge.html#a48f01c4a02c4e278a1ab70b16efdef4ba3e807b4caeb170c5cd1e855ac1a92d77">DCHEdge::INSTANCE</a>)</div><div class="line"><a name="l01206"></a><span class="lineno"> 1206</span>  {</div><div class="line"><a name="l01207"></a><span class="lineno"> 1207</span>  arrow = <span class="stringliteral">"---instance---->"</span>;</div><div class="line"><a name="l01208"></a><span class="lineno"> 1208</span>  }</div><div class="line"><a name="l01209"></a><span class="lineno"> 1209</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (edge->getEdgeKind() == <a class="code" href="classSVF_1_1DCHEdge.html#a48f01c4a02c4e278a1ab70b16efdef4ba8b07351616a1798fa34ec3828f485ebb">DCHEdge::STD_DEF</a>)</div><div class="line"><a name="l01210"></a><span class="lineno"> 1210</span>  {</div><div class="line"><a name="l01211"></a><span class="lineno"> 1211</span>  arrow = <span class="stringliteral">"---standard---->"</span>;</div><div class="line"><a name="l01212"></a><span class="lineno"> 1212</span>  }</div><div class="line"><a name="l01213"></a><span class="lineno"> 1213</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l01214"></a><span class="lineno"> 1214</span>  {</div><div class="line"><a name="l01215"></a><span class="lineno"> 1215</span>  arrow = <span class="stringliteral">"----unknown---->"</span>;</div><div class="line"><a name="l01216"></a><span class="lineno"> 1216</span>  }</div><div class="line"><a name="l01217"></a><span class="lineno"> 1217</span> </div><div class="line"><a name="l01218"></a><span class="lineno"> 1218</span>  <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">SVFUtil::outs</a>() << <a class="code" href="DCHG_8cpp.html#a6673217180d3b6fb73c7c6387777f269">indent</a>(currIndent) << <span class="stringliteral">"[ "</span> << <a class="code" href="classSVF_1_1DCHGraph.html#a2dc488345cc3a5f37079952f638d8c2b">diTypeToStr</a>(node-><a class="code" href="classSVF_1_1DCHNode.html#aaf4036d892bdae02a01d31bfe3db2153">getType</a>()) << <span class="stringliteral">" ] "</span></div><div class="line"><a name="l01219"></a><span class="lineno"> 1219</span>  << arrow << <span class="stringliteral">" [ "</span> << <a class="code" href="classSVF_1_1DCHGraph.html#a2dc488345cc3a5f37079952f638d8c2b">diTypeToStr</a>(edge->getDstNode()->getType()) << <span class="stringliteral">" ]\n"</span>;</div><div class="line"><a name="l01220"></a><span class="lineno"> 1220</span>  }</div><div class="line"><a name="l01221"></a><span class="lineno"> 1221</span> </div><div class="line"><a name="l01222"></a><span class="lineno"> 1222</span>  <span class="keywordflow">if</span> (node-><a class="code" href="classSVF_1_1GenericNode.html#a2d9cd758d6f8c5189d9b90b74f43e009">getOutEdges</a>().size() == 0)</div><div class="line"><a name="l01223"></a><span class="lineno"> 1223</span>  {</div><div class="line"><a name="l01224"></a><span class="lineno"> 1224</span>  <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">SVFUtil::outs</a>() << <a class="code" href="DCHG_8cpp.html#a6673217180d3b6fb73c7c6387777f269">indent</a>(currIndent) << <span class="stringliteral">"(none)\n"</span>;</div><div class="line"><a name="l01225"></a><span class="lineno"> 1225</span>  }</div><div class="line"><a name="l01226"></a><span class="lineno"> 1226</span> </div><div class="line"><a name="l01227"></a><span class="lineno"> 1227</span>  currIndent -= singleIndent;</div><div class="line"><a name="l01228"></a><span class="lineno"> 1228</span> </div><div class="line"><a name="l01229"></a><span class="lineno"> 1229</span>  <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">SVFUtil::outs</a>() << <a class="code" href="DCHG_8cpp.html#a6673217180d3b6fb73c7c6387777f269">indent</a>(currIndent) << <span class="stringliteral">"Typedefs\n"</span>;</div><div class="line"><a name="l01230"></a><span class="lineno"> 1230</span> </div><div class="line"><a name="l01231"></a><span class="lineno"> 1231</span>  currIndent += singleIndent;</div><div class="line"><a name="l01232"></a><span class="lineno"> 1232</span> </div><div class="line"><a name="l01233"></a><span class="lineno"> 1233</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#af739db846e47ba6b2fd15eaad31ab7fb">Set<const DIDerivedType *></a> &typedefs = node-><a class="code" href="classSVF_1_1DCHNode.html#ac77edc44c3c5acc185c27c018837d066">getTypedefs</a>();</div><div class="line"><a name="l01234"></a><span class="lineno"> 1234</span>  <span class="keywordflow">for</span> (<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a852e75c562139237fcc754c7461533e6">DIDerivedType</a> *tdef : typedefs)</div><div class="line"><a name="l01235"></a><span class="lineno"> 1235</span>  {</div><div class="line"><a name="l01236"></a><span class="lineno"> 1236</span>  <a class="code" href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">std::string</a> typedefName = <span class="stringliteral">"void"</span>;</div><div class="line"><a name="l01237"></a><span class="lineno"> 1237</span>  <span class="keywordflow">if</span> (tdef != <span class="keyword">nullptr</span>)</div><div class="line"><a name="l01238"></a><span class="lineno"> 1238</span>  {</div><div class="line"><a name="l01239"></a><span class="lineno"> 1239</span>  typedefName = tdef->getName().str();</div><div class="line"><a name="l01240"></a><span class="lineno"> 1240</span>  }</div><div class="line"><a name="l01241"></a><span class="lineno"> 1241</span> </div><div class="line"><a name="l01242"></a><span class="lineno"> 1242</span>  <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">SVFUtil::outs</a>() << <a class="code" href="DCHG_8cpp.html#a6673217180d3b6fb73c7c6387777f269">indent</a>(currIndent) << typedefName << <span class="stringliteral">"\n"</span>;</div><div class="line"><a name="l01243"></a><span class="lineno"> 1243</span>  }</div><div class="line"><a name="l01244"></a><span class="lineno"> 1244</span> </div><div class="line"><a name="l01245"></a><span class="lineno"> 1245</span>  <span class="keywordflow">if</span> (typedefs.size() == 0)</div><div class="line"><a name="l01246"></a><span class="lineno"> 1246</span>  {</div><div class="line"><a name="l01247"></a><span class="lineno"> 1247</span>  <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">SVFUtil::outs</a>() << <a class="code" href="DCHG_8cpp.html#a6673217180d3b6fb73c7c6387777f269">indent</a>(currIndent) << <span class="stringliteral">"(none)\n"</span>;</div><div class="line"><a name="l01248"></a><span class="lineno"> 1248</span>  }</div><div class="line"><a name="l01249"></a><span class="lineno"> 1249</span> </div><div class="line"><a name="l01250"></a><span class="lineno"> 1250</span>  currIndent -= singleIndent;</div><div class="line"><a name="l01251"></a><span class="lineno"> 1251</span> </div><div class="line"><a name="l01252"></a><span class="lineno"> 1252</span>  currIndent -= singleIndent;</div><div class="line"><a name="l01253"></a><span class="lineno"> 1253</span>  }</div><div class="line"><a name="l01254"></a><span class="lineno"> 1254</span> </div><div class="line"><a name="l01255"></a><span class="lineno"> 1255</span>  <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">SVFUtil::outs</a>() << thickLine;</div><div class="line"><a name="l01256"></a><span class="lineno"> 1256</span> </div><div class="line"><a name="l01257"></a><span class="lineno"> 1257</span>  <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">SVFUtil::outs</a>() << <span class="stringliteral">"Other stats\n"</span>;</div><div class="line"><a name="l01258"></a><span class="lineno"> 1258</span>  <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">SVFUtil::outs</a>() << line;</div><div class="line"><a name="l01259"></a><span class="lineno"> 1259</span>  <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">SVFUtil::outs</a>() << <span class="stringliteral">"# Canonical types : "</span> << <a class="code" href="classSVF_1_1DCHGraph.html#a10225f56b21eb7f0870fdc433de3c393">canonicalTypes</a>.size() << <span class="stringliteral">"\n"</span>;</div><div class="line"><a name="l01260"></a><span class="lineno"> 1260</span>  <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">SVFUtil::outs</a>() << <span class="stringliteral">"# structs : "</span> << numStructs << <span class="stringliteral">"\n"</span>;</div><div class="line"><a name="l01261"></a><span class="lineno"> 1261</span>  <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">SVFUtil::outs</a>() << <span class="stringliteral">"Largest struct : "</span> << largestStruct << <span class="stringliteral">" fields\n"</span>;</div><div class="line"><a name="l01262"></a><span class="lineno"> 1262</span>  <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">SVFUtil::outs</a>() << thickLine;</div><div class="line"><a name="l01263"></a><span class="lineno"> 1263</span> </div><div class="line"><a name="l01264"></a><span class="lineno"> 1264</span>  <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">SVFUtil::outs</a>().flush();</div><div class="line"><a name="l01265"></a><span class="lineno"> 1265</span> }</div><div class="ttc" id="namespaceSVF_1_1LLVMUtil_html_a4f6431ca72e0378bf2428de8a87ba648"><div class="ttname"><a href="namespaceSVF_1_1LLVMUtil.html#a4f6431ca72e0378bf2428de8a87ba648">SVF::LLVMUtil::getFunction</a></div><div class="ttdeci">const SVFFunction * getFunction(std::string name)</div><div class="ttdoc">Get the corresponding Function based on its name. </div><div class="ttdef"><b>Definition:</b> <a href="LLVMUtil_8h_source.html#l00368">LLVMUtil.h:368</a></div></div>
|
|
69
|
+
<a href="DCHG_8cpp.html">Go to the documentation of this file.</a><div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span> <span class="comment">//===----- DCHG.cpp CHG using DWARF debug info ------------------------//</span></div><div class="line"><a name="l00002"></a><span class="lineno"> 2</span> <span class="comment">//</span></div><div class="line"><a name="l00003"></a><span class="lineno"> 3</span> <span class="comment">/*</span></div><div class="line"><a name="l00004"></a><span class="lineno"> 4</span> <span class="comment"> * DCHG.cpp</span></div><div class="line"><a name="l00005"></a><span class="lineno"> 5</span> <span class="comment"> *</span></div><div class="line"><a name="l00006"></a><span class="lineno"> 6</span> <span class="comment"> * Created on: Aug 24, 2019</span></div><div class="line"><a name="l00007"></a><span class="lineno"> 7</span> <span class="comment"> * Author: Mohamad Barbar</span></div><div class="line"><a name="l00008"></a><span class="lineno"> 8</span> <span class="comment"> */</span></div><div class="line"><a name="l00009"></a><span class="lineno"> 9</span> </div><div class="line"><a name="l00010"></a><span class="lineno"> 10</span> <span class="preprocessor">#include <sstream></span></div><div class="line"><a name="l00011"></a><span class="lineno"> 11</span> </div><div class="line"><a name="l00012"></a><span class="lineno"> 12</span> <span class="preprocessor">#include "<a class="code" href="Options_8h.html">Util/Options.h</a>"</span></div><div class="line"><a name="l00013"></a><span class="lineno"> 13</span> <span class="preprocessor">#include "<a class="code" href="DCHG_8h.html">SVF-LLVM/DCHG.h</a>"</span></div><div class="line"><a name="l00014"></a><span class="lineno"> 14</span> <span class="preprocessor">#include "<a class="code" href="CPPUtil_8h.html">SVF-LLVM/CPPUtil.h</a>"</span></div><div class="line"><a name="l00015"></a><span class="lineno"> 15</span> <span class="preprocessor">#include "<a class="code" href="SVFUtil_8h.html">Util/SVFUtil.h</a>"</span></div><div class="line"><a name="l00016"></a><span class="lineno"> 16</span> <span class="preprocessor">#include "<a class="code" href="LLVMUtil_8h.html">SVF-LLVM/LLVMUtil.h</a>"</span></div><div class="line"><a name="l00017"></a><span class="lineno"> 17</span> </div><div class="line"><a name="l00018"></a><span class="lineno"> 18</span> <span class="keyword">using namespace </span><a class="code" href="namespaceSVF.html">SVF</a>;</div><div class="line"><a name="l00019"></a><span class="lineno"> 19</span> </div><div class="line"><a name="l00020"></a><span class="lineno"> 20</span> </div><div class="line"><a name="l00021"></a><span class="lineno"><a class="line" href="classSVF_1_1DCHGraph.html#a86bf48776ccf53092f4cb742cf95f8eb"> 21</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1DCHGraph.html#a86bf48776ccf53092f4cb742cf95f8eb">DCHGraph::handleDIBasicType</a>(<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#ada0513be7e25325325ccc9183aeca278">DIBasicType</a> *basicType)</div><div class="line"><a name="l00022"></a><span class="lineno"> 22</span> {</div><div class="line"><a name="l00023"></a><span class="lineno"> 23</span>  <a class="code" href="classSVF_1_1DCHGraph.html#a9ed6b91fad334605f514049a2072b538">getOrCreateNode</a>(basicType);</div><div class="line"><a name="l00024"></a><span class="lineno"> 24</span> }</div><div class="line"><a name="l00025"></a><span class="lineno"> 25</span> </div><div class="line"><a name="l00026"></a><span class="lineno"><a class="line" href="classSVF_1_1DCHGraph.html#a3ce75cbe92a1fa7d34c6fca2d2ca1b0f"> 26</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1DCHGraph.html#a3ce75cbe92a1fa7d34c6fca2d2ca1b0f">DCHGraph::handleDICompositeType</a>(<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#aded9b991c77acc5284ccead0739e84f1">DICompositeType</a> *compositeType)</div><div class="line"><a name="l00027"></a><span class="lineno"> 27</span> {</div><div class="line"><a name="l00028"></a><span class="lineno"> 28</span>  <span class="keywordflow">switch</span> (compositeType->getTag())</div><div class="line"><a name="l00029"></a><span class="lineno"> 29</span>  {</div><div class="line"><a name="l00030"></a><span class="lineno"> 30</span>  <span class="keywordflow">case</span> dwarf::DW_TAG_array_type:</div><div class="line"><a name="l00031"></a><span class="lineno"> 31</span>  <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1DCHGraph.html#aa6f49dfc9e3580d3f2d8c257395eb11e">extended</a>) <a class="code" href="classSVF_1_1DCHGraph.html#a9ed6b91fad334605f514049a2072b538">getOrCreateNode</a>(compositeType);</div><div class="line"><a name="l00032"></a><span class="lineno"> 32</span>  <a class="code" href="classSVF_1_1DCHGraph.html#a8fcbea9435a77beb27ad64d5a3175b0b">gatherAggs</a>(compositeType);</div><div class="line"><a name="l00033"></a><span class="lineno"> 33</span>  <span class="keywordflow">break</span>;</div><div class="line"><a name="l00034"></a><span class="lineno"> 34</span>  <span class="keywordflow">case</span> dwarf::DW_TAG_class_type:</div><div class="line"><a name="l00035"></a><span class="lineno"> 35</span>  <span class="keywordflow">case</span> dwarf::DW_TAG_structure_type:</div><div class="line"><a name="l00036"></a><span class="lineno"> 36</span>  <a class="code" href="classSVF_1_1DCHGraph.html#a9ed6b91fad334605f514049a2072b538">getOrCreateNode</a>(compositeType);</div><div class="line"><a name="l00037"></a><span class="lineno"> 37</span>  <span class="comment">// If we're extending, we need to add the first-field relation.</span></div><div class="line"><a name="l00038"></a><span class="lineno"> 38</span>  <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1DCHGraph.html#aa6f49dfc9e3580d3f2d8c257395eb11e">extended</a>)</div><div class="line"><a name="l00039"></a><span class="lineno"> 39</span>  {</div><div class="line"><a name="l00040"></a><span class="lineno"> 40</span>  <a class="code" href="namespaceSVF.html#a0f825e73d115173b05ca54fb8ec65003">DINodeArray</a> fields = compositeType->getElements();</div><div class="line"><a name="l00041"></a><span class="lineno"> 41</span>  <span class="keywordflow">if</span> (!fields.empty())</div><div class="line"><a name="l00042"></a><span class="lineno"> 42</span>  {</div><div class="line"><a name="l00043"></a><span class="lineno"> 43</span>  <span class="comment">// We want the first non-static, non-function member; it may not exist.</span></div><div class="line"><a name="l00044"></a><span class="lineno"> 44</span>  <a class="code" href="namespaceSVF.html#a852e75c562139237fcc754c7461533e6">DIDerivedType</a> *firstMember = <span class="keyword">nullptr</span>;</div><div class="line"><a name="l00045"></a><span class="lineno"> 45</span>  <span class="keywordflow">for</span> (<a class="code" href="namespaceSVF.html#a758f3bee97ed46a719d64a2d4f2bc62d">DINode</a> *<a class="code" href="cJSON_8cpp.html#ab6e2ea6dc7bd57d1483413449998230a">n</a> : fields)</div><div class="line"><a name="l00046"></a><span class="lineno"> 46</span>  {</div><div class="line"><a name="l00047"></a><span class="lineno"> 47</span>  <span class="keywordflow">if</span> (<a class="code" href="namespaceSVF.html#a852e75c562139237fcc754c7461533e6">DIDerivedType</a> *fm = SVFUtil::dyn_cast<DIDerivedType>(<a class="code" href="cJSON_8cpp.html#ab6e2ea6dc7bd57d1483413449998230a">n</a>))</div><div class="line"><a name="l00048"></a><span class="lineno"> 48</span>  {</div><div class="line"><a name="l00049"></a><span class="lineno"> 49</span>  <span class="keywordflow">if</span> (fm->getTag() == dwarf::DW_TAG_member && !fm->isStaticMember())</div><div class="line"><a name="l00050"></a><span class="lineno"> 50</span>  {</div><div class="line"><a name="l00051"></a><span class="lineno"> 51</span>  firstMember = fm;</div><div class="line"><a name="l00052"></a><span class="lineno"> 52</span>  <span class="keywordflow">break</span>;</div><div class="line"><a name="l00053"></a><span class="lineno"> 53</span>  }</div><div class="line"><a name="l00054"></a><span class="lineno"> 54</span>  }</div><div class="line"><a name="l00055"></a><span class="lineno"> 55</span>  }</div><div class="line"><a name="l00056"></a><span class="lineno"> 56</span> </div><div class="line"><a name="l00057"></a><span class="lineno"> 57</span>  <span class="keywordflow">if</span> (firstMember != <span class="keyword">nullptr</span>)</div><div class="line"><a name="l00058"></a><span class="lineno"> 58</span>  {</div><div class="line"><a name="l00059"></a><span class="lineno"> 59</span>  <span class="comment">// firstMember is a DW_TAG_member, we want the base type beneath it.</span></div><div class="line"><a name="l00060"></a><span class="lineno"> 60</span>  <a class="code" href="classSVF_1_1DCHGraph.html#a294a2075c97e1db8003393fb472c1def">addEdge</a>(compositeType, firstMember->getBaseType(), <a class="code" href="classSVF_1_1DCHEdge.html#a48f01c4a02c4e278a1ab70b16efdef4ba3b49b95b713f585b717810dce5ac6564">DCHEdge::FIRST_FIELD</a>);</div><div class="line"><a name="l00061"></a><span class="lineno"> 61</span>  }</div><div class="line"><a name="l00062"></a><span class="lineno"> 62</span>  }</div><div class="line"><a name="l00063"></a><span class="lineno"> 63</span>  }</div><div class="line"><a name="l00064"></a><span class="lineno"> 64</span> </div><div class="line"><a name="l00065"></a><span class="lineno"> 65</span>  <a class="code" href="classSVF_1_1DCHGraph.html#ab96874bc8f6461fe0c3eb53b7f5cedce">flatten</a>(compositeType);</div><div class="line"><a name="l00066"></a><span class="lineno"> 66</span>  <a class="code" href="classSVF_1_1DCHGraph.html#a8fcbea9435a77beb27ad64d5a3175b0b">gatherAggs</a>(compositeType);</div><div class="line"><a name="l00067"></a><span class="lineno"> 67</span> </div><div class="line"><a name="l00068"></a><span class="lineno"> 68</span>  <span class="keywordflow">break</span>;</div><div class="line"><a name="l00069"></a><span class="lineno"> 69</span>  <span class="keywordflow">case</span> dwarf::DW_TAG_union_type:</div><div class="line"><a name="l00070"></a><span class="lineno"> 70</span>  <a class="code" href="classSVF_1_1DCHGraph.html#a9ed6b91fad334605f514049a2072b538">getOrCreateNode</a>(compositeType);</div><div class="line"><a name="l00071"></a><span class="lineno"> 71</span>  <span class="comment">// All fields are first fields.</span></div><div class="line"><a name="l00072"></a><span class="lineno"> 72</span>  <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1DCHGraph.html#aa6f49dfc9e3580d3f2d8c257395eb11e">extended</a>)</div><div class="line"><a name="l00073"></a><span class="lineno"> 73</span>  {</div><div class="line"><a name="l00074"></a><span class="lineno"> 74</span>  <a class="code" href="namespaceSVF.html#a0f825e73d115173b05ca54fb8ec65003">DINodeArray</a> fields = compositeType->getElements();</div><div class="line"><a name="l00075"></a><span class="lineno"> 75</span>  <span class="keywordflow">for</span> (<a class="code" href="namespaceSVF.html#a758f3bee97ed46a719d64a2d4f2bc62d">DINode</a> *field : fields)</div><div class="line"><a name="l00076"></a><span class="lineno"> 76</span>  {</div><div class="line"><a name="l00077"></a><span class="lineno"> 77</span>  <span class="comment">// fields[0] gives a type which is DW_TAG_member, we want the member's type (getBaseType).</span></div><div class="line"><a name="l00078"></a><span class="lineno"> 78</span>  <a class="code" href="namespaceSVF.html#a852e75c562139237fcc754c7461533e6">DIDerivedType</a> *firstMember = <a class="code" href="namespaceSVF_1_1SVFUtil.html#af6e96694d983643a66c238cce01bff0e">SVFUtil::dyn_cast</a><<a class="code" href="namespaceSVF.html#a852e75c562139237fcc754c7461533e6">DIDerivedType</a>>(field);</div><div class="line"><a name="l00079"></a><span class="lineno"> 79</span>  assert(firstMember != <span class="keyword">nullptr</span> && <span class="stringliteral">"DCHG: expected member type"</span>);</div><div class="line"><a name="l00080"></a><span class="lineno"> 80</span>  <a class="code" href="classSVF_1_1DCHGraph.html#a294a2075c97e1db8003393fb472c1def">addEdge</a>(compositeType, firstMember->getBaseType(), <a class="code" href="classSVF_1_1DCHEdge.html#a48f01c4a02c4e278a1ab70b16efdef4ba3b49b95b713f585b717810dce5ac6564">DCHEdge::FIRST_FIELD</a>);</div><div class="line"><a name="l00081"></a><span class="lineno"> 81</span>  }</div><div class="line"><a name="l00082"></a><span class="lineno"> 82</span>  }</div><div class="line"><a name="l00083"></a><span class="lineno"> 83</span> </div><div class="line"><a name="l00084"></a><span class="lineno"> 84</span>  <span class="comment">// flatten(compositeType);</span></div><div class="line"><a name="l00085"></a><span class="lineno"> 85</span>  <a class="code" href="classSVF_1_1DCHGraph.html#a8fcbea9435a77beb27ad64d5a3175b0b">gatherAggs</a>(compositeType);</div><div class="line"><a name="l00086"></a><span class="lineno"> 86</span> </div><div class="line"><a name="l00087"></a><span class="lineno"> 87</span>  <span class="keywordflow">break</span>;</div><div class="line"><a name="l00088"></a><span class="lineno"> 88</span>  <span class="keywordflow">case</span> dwarf::DW_TAG_enumeration_type:</div><div class="line"><a name="l00089"></a><span class="lineno"> 89</span>  <a class="code" href="classSVF_1_1DCHGraph.html#a9ed6b91fad334605f514049a2072b538">getOrCreateNode</a>(compositeType);</div><div class="line"><a name="l00090"></a><span class="lineno"> 90</span>  <span class="keywordflow">break</span>;</div><div class="line"><a name="l00091"></a><span class="lineno"> 91</span>  <span class="keywordflow">default</span>:</div><div class="line"><a name="l00092"></a><span class="lineno"> 92</span>  assert(<span class="keyword">false</span> && <span class="stringliteral">"DCHGraph::buildCHG: unexpected CompositeType tag."</span>);</div><div class="line"><a name="l00093"></a><span class="lineno"> 93</span>  }</div><div class="line"><a name="l00094"></a><span class="lineno"> 94</span> }</div><div class="line"><a name="l00095"></a><span class="lineno"> 95</span> </div><div class="line"><a name="l00096"></a><span class="lineno"><a class="line" href="classSVF_1_1DCHGraph.html#a1a4162e68b22d53e9dca73c6780ed3e5"> 96</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1DCHGraph.html#a1a4162e68b22d53e9dca73c6780ed3e5">DCHGraph::handleDIDerivedType</a>(<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a852e75c562139237fcc754c7461533e6">DIDerivedType</a> *derivedType)</div><div class="line"><a name="l00097"></a><span class="lineno"> 97</span> {</div><div class="line"><a name="l00098"></a><span class="lineno"> 98</span>  <span class="keywordflow">switch</span> (derivedType->getTag())</div><div class="line"><a name="l00099"></a><span class="lineno"> 99</span>  {</div><div class="line"><a name="l00100"></a><span class="lineno"> 100</span>  <span class="keywordflow">case</span> dwarf::DW_TAG_inheritance:</div><div class="line"><a name="l00101"></a><span class="lineno"> 101</span>  {</div><div class="line"><a name="l00102"></a><span class="lineno"> 102</span>  assert(SVFUtil::isa<DIType>(derivedType->getScope()) && <span class="stringliteral">"inheriting from non-type?"</span>);</div><div class="line"><a name="l00103"></a><span class="lineno"> 103</span>  <a class="code" href="classSVF_1_1DCHEdge.html">DCHEdge</a> *edge = <a class="code" href="classSVF_1_1DCHGraph.html#a294a2075c97e1db8003393fb472c1def">addEdge</a>(SVFUtil::dyn_cast<DIType>(derivedType->getScope()),</div><div class="line"><a name="l00104"></a><span class="lineno"> 104</span>  derivedType->getBaseType(), <a class="code" href="classSVF_1_1DCHEdge.html#a48f01c4a02c4e278a1ab70b16efdef4ba9c05805c60fe04033bd9815968059e90">DCHEdge::INHERITANCE</a>);</div><div class="line"><a name="l00105"></a><span class="lineno"> 105</span>  <span class="comment">// If the offset does not exist (for primary base), getConstantFieldIdx should return 0.</span></div><div class="line"><a name="l00106"></a><span class="lineno"> 106</span>  edge-><a class="code" href="classSVF_1_1DCHEdge.html#a70f757826082c95766c8324c1264e977">setOffset</a>(derivedType->getOffsetInBits());</div><div class="line"><a name="l00107"></a><span class="lineno"> 107</span>  <span class="keywordflow">break</span>;</div><div class="line"><a name="l00108"></a><span class="lineno"> 108</span>  }</div><div class="line"><a name="l00109"></a><span class="lineno"> 109</span>  <span class="keywordflow">case</span> dwarf::DW_TAG_member:</div><div class="line"><a name="l00110"></a><span class="lineno"> 110</span>  <span class="keywordflow">case</span> dwarf::DW_TAG_friend:</div><div class="line"><a name="l00111"></a><span class="lineno"> 111</span>  <span class="comment">// Don't care.</span></div><div class="line"><a name="l00112"></a><span class="lineno"> 112</span>  <span class="keywordflow">break</span>;</div><div class="line"><a name="l00113"></a><span class="lineno"> 113</span>  <span class="keywordflow">case</span> dwarf::DW_TAG_typedef:</div><div class="line"><a name="l00114"></a><span class="lineno"> 114</span>  <a class="code" href="classSVF_1_1DCHGraph.html#a6d97a772afe16c1483e65eea81f82603">handleTypedef</a>(derivedType);</div><div class="line"><a name="l00115"></a><span class="lineno"> 115</span>  <span class="keywordflow">break</span>;</div><div class="line"><a name="l00116"></a><span class="lineno"> 116</span>  <span class="keywordflow">case</span> dwarf::DW_TAG_pointer_type:</div><div class="line"><a name="l00117"></a><span class="lineno"> 117</span>  <span class="keywordflow">case</span> dwarf::DW_TAG_ptr_to_member_type:</div><div class="line"><a name="l00118"></a><span class="lineno"> 118</span>  <span class="keywordflow">case</span> dwarf::DW_TAG_reference_type:</div><div class="line"><a name="l00119"></a><span class="lineno"> 119</span>  <span class="keywordflow">case</span> dwarf::DW_TAG_rvalue_reference_type:</div><div class="line"><a name="l00120"></a><span class="lineno"> 120</span>  <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1DCHGraph.html#aa6f49dfc9e3580d3f2d8c257395eb11e">extended</a>) <a class="code" href="classSVF_1_1DCHGraph.html#a9ed6b91fad334605f514049a2072b538">getOrCreateNode</a>(derivedType);</div><div class="line"><a name="l00121"></a><span class="lineno"> 121</span>  <span class="keywordflow">break</span>;</div><div class="line"><a name="l00122"></a><span class="lineno"> 122</span>  <span class="keywordflow">case</span> dwarf::DW_TAG_const_type:</div><div class="line"><a name="l00123"></a><span class="lineno"> 123</span>  <span class="keywordflow">case</span> dwarf::DW_TAG_atomic_type:</div><div class="line"><a name="l00124"></a><span class="lineno"> 124</span>  <span class="keywordflow">case</span> dwarf::DW_TAG_volatile_type:</div><div class="line"><a name="l00125"></a><span class="lineno"> 125</span>  <span class="keywordflow">case</span> dwarf::DW_TAG_restrict_type:</div><div class="line"><a name="l00126"></a><span class="lineno"> 126</span>  <span class="keywordflow">break</span>;</div><div class="line"><a name="l00127"></a><span class="lineno"> 127</span>  <span class="keywordflow">default</span>:</div><div class="line"><a name="l00128"></a><span class="lineno"> 128</span>  assert(<span class="keyword">false</span> && <span class="stringliteral">"DCHGraph::buildCHG: unexpected DerivedType tag."</span>);</div><div class="line"><a name="l00129"></a><span class="lineno"> 129</span>  }</div><div class="line"><a name="l00130"></a><span class="lineno"> 130</span> }</div><div class="line"><a name="l00131"></a><span class="lineno"> 131</span> </div><div class="line"><a name="l00132"></a><span class="lineno"><a class="line" href="classSVF_1_1DCHGraph.html#a671f379ae54eef247b5e013478eb3f0c"> 132</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1DCHGraph.html#a671f379ae54eef247b5e013478eb3f0c">DCHGraph::handleDISubroutineType</a>(<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a090e0791e8c200104ed3ab6bab157129">DISubroutineType</a> *subroutineType)</div><div class="line"><a name="l00133"></a><span class="lineno"> 133</span> {</div><div class="line"><a name="l00134"></a><span class="lineno"> 134</span>  <a class="code" href="classSVF_1_1DCHGraph.html#a9ed6b91fad334605f514049a2072b538">getOrCreateNode</a>(subroutineType);</div><div class="line"><a name="l00135"></a><span class="lineno"> 135</span> }</div><div class="line"><a name="l00136"></a><span class="lineno"> 136</span> </div><div class="line"><a name="l00137"></a><span class="lineno"><a class="line" href="classSVF_1_1DCHGraph.html#a6d97a772afe16c1483e65eea81f82603"> 137</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1DCHGraph.html#a6d97a772afe16c1483e65eea81f82603">DCHGraph::handleTypedef</a>(<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#ad127b0ad478640ede3d426e3a58d2632">DIType</a> *typedefType)</div><div class="line"><a name="l00138"></a><span class="lineno"> 138</span> {</div><div class="line"><a name="l00139"></a><span class="lineno"> 139</span>  assert(typedefType && typedefType->getTag() == dwarf::DW_TAG_typedef);</div><div class="line"><a name="l00140"></a><span class="lineno"> 140</span> </div><div class="line"><a name="l00141"></a><span class="lineno"> 141</span>  <span class="comment">// Need to gather them in a set first because we don't know the base type till</span></div><div class="line"><a name="l00142"></a><span class="lineno"> 142</span>  <span class="comment">// we get to the bottom of the (potentially many) typedefs.</span></div><div class="line"><a name="l00143"></a><span class="lineno"> 143</span>  std::vector<const DIDerivedType *> typedefs;</div><div class="line"><a name="l00144"></a><span class="lineno"> 144</span>  <span class="comment">// Check for nullptr because you can typedef void.</span></div><div class="line"><a name="l00145"></a><span class="lineno"> 145</span>  <span class="keywordflow">while</span> (typedefType != <span class="keyword">nullptr</span> && typedefType->getTag() == dwarf::DW_TAG_typedef)</div><div class="line"><a name="l00146"></a><span class="lineno"> 146</span>  {</div><div class="line"><a name="l00147"></a><span class="lineno"> 147</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a852e75c562139237fcc754c7461533e6">DIDerivedType</a> *typedefDerivedType = <a class="code" href="namespaceSVF_1_1SVFUtil.html#af6e96694d983643a66c238cce01bff0e">SVFUtil::dyn_cast</a><<a class="code" href="namespaceSVF.html#a852e75c562139237fcc754c7461533e6">DIDerivedType</a>>(typedefType);</div><div class="line"><a name="l00148"></a><span class="lineno"> 148</span>  <span class="comment">// The typedef itself.</span></div><div class="line"><a name="l00149"></a><span class="lineno"> 149</span>  typedefs.push_back(typedefDerivedType);</div><div class="line"><a name="l00150"></a><span class="lineno"> 150</span> </div><div class="line"><a name="l00151"></a><span class="lineno"> 151</span>  <span class="comment">// Next in the typedef line.</span></div><div class="line"><a name="l00152"></a><span class="lineno"> 152</span>  typedefType = typedefDerivedType->getBaseType();</div><div class="line"><a name="l00153"></a><span class="lineno"> 153</span>  }</div><div class="line"><a name="l00154"></a><span class="lineno"> 154</span> </div><div class="line"><a name="l00155"></a><span class="lineno"> 155</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#ad127b0ad478640ede3d426e3a58d2632">DIType</a> *baseType = typedefType;</div><div class="line"><a name="l00156"></a><span class="lineno"> 156</span>  <a class="code" href="classSVF_1_1DCHNode.html">DCHNode</a> *baseTypeNode = <a class="code" href="classSVF_1_1DCHGraph.html#a9ed6b91fad334605f514049a2072b538">getOrCreateNode</a>(baseType);</div><div class="line"><a name="l00157"></a><span class="lineno"> 157</span> </div><div class="line"><a name="l00158"></a><span class="lineno"> 158</span>  <span class="keywordflow">for</span> (<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a852e75c562139237fcc754c7461533e6">DIDerivedType</a> *tdef : typedefs)</div><div class="line"><a name="l00159"></a><span class="lineno"> 159</span>  {</div><div class="line"><a name="l00160"></a><span class="lineno"> 160</span>  <span class="comment">// Base type needs to hold its typedefs.</span></div><div class="line"><a name="l00161"></a><span class="lineno"> 161</span>  baseTypeNode-><a class="code" href="classSVF_1_1DCHNode.html#a9d1016e3da3462664198b1125dfc8f6e">addTypedef</a>(tdef);</div><div class="line"><a name="l00162"></a><span class="lineno"> 162</span>  }</div><div class="line"><a name="l00163"></a><span class="lineno"> 163</span> }</div><div class="line"><a name="l00164"></a><span class="lineno"> 164</span> </div><div class="line"><a name="l00165"></a><span class="lineno"><a class="line" href="classSVF_1_1DCHGraph.html#a1215db390515a30fbc416fb14d2e863f"> 165</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1DCHGraph.html#a1215db390515a30fbc416fb14d2e863f">DCHGraph::buildVTables</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFModule.html">SVFModule</a> &module)</div><div class="line"><a name="l00166"></a><span class="lineno"> 166</span> {</div><div class="line"><a name="l00167"></a><span class="lineno"> 167</span>  <span class="keywordflow">for</span> (<a class="code" href="namespaceSVF.html#aa7a770b5dd5cd0e37d06a1088f252906">Module</a> &M : <a class="code" href="classSVF_1_1LLVMModuleSet.html#acf40310917909e4234282c0695a43160">LLVMModuleSet::getLLVMModuleSet</a>()->getLLVMModules())</div><div class="line"><a name="l00168"></a><span class="lineno"> 168</span>  {</div><div class="line"><a name="l00169"></a><span class="lineno"> 169</span>  <span class="keywordflow">for</span> (Module::const_global_iterator gvI = M.global_begin(); gvI != M.global_end(); ++gvI)</div><div class="line"><a name="l00170"></a><span class="lineno"> 170</span>  {</div><div class="line"><a name="l00171"></a><span class="lineno"> 171</span>  <span class="comment">// Though this will return more than GlobalVariables, we only care about GlobalVariables (for the vtbls).</span></div><div class="line"><a name="l00172"></a><span class="lineno"> 172</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a09f5fa3bc44bf53612a085e3a611cc4e">GlobalVariable</a> *gv = <a class="code" href="namespaceSVF_1_1SVFUtil.html#af6e96694d983643a66c238cce01bff0e">SVFUtil::dyn_cast</a><<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a09f5fa3bc44bf53612a085e3a611cc4e">GlobalVariable</a>>(&*gvI);</div><div class="line"><a name="l00173"></a><span class="lineno"> 173</span>  <span class="keywordflow">if</span> (gv == <span class="keyword">nullptr</span>) <span class="keywordflow">continue</span>;</div><div class="line"><a name="l00174"></a><span class="lineno"> 174</span>  <span class="keywordflow">if</span> (gv->hasMetadata(<a class="code" href="namespaceSVF_1_1cppUtil_1_1ctir.html#aa4630844aa25aa4801659304a2552058">cppUtil::ctir::vtMDName</a>) && gv->getNumOperands() > 0)</div><div class="line"><a name="l00175"></a><span class="lineno"> 175</span>  {</div><div class="line"><a name="l00176"></a><span class="lineno"> 176</span>  <a class="code" href="namespaceSVF.html#ad127b0ad478640ede3d426e3a58d2632">DIType</a> *<a class="code" href="cJSON_8cpp.html#a3f9a0d3265a6254722587175dac3e4dc">type</a> = <a class="code" href="namespaceSVF_1_1SVFUtil.html#af6e96694d983643a66c238cce01bff0e">SVFUtil::dyn_cast</a><<a class="code" href="namespaceSVF.html#ad127b0ad478640ede3d426e3a58d2632">DIType</a>>(gv->getMetadata(<a class="code" href="namespaceSVF_1_1cppUtil_1_1ctir.html#aa4630844aa25aa4801659304a2552058">cppUtil::ctir::vtMDName</a>));</div><div class="line"><a name="l00177"></a><span class="lineno"> 177</span>  assert(type && <span class="stringliteral">"DCHG::buildVTables: bad metadata for ctir.vt"</span>);</div><div class="line"><a name="l00178"></a><span class="lineno"> 178</span>  <a class="code" href="classSVF_1_1DCHNode.html">DCHNode</a> *node = <a class="code" href="classSVF_1_1DCHGraph.html#a9ed6b91fad334605f514049a2072b538">getOrCreateNode</a>(type);</div><div class="line"><a name="l00179"></a><span class="lineno"> 179</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFGlobalValue.html">SVFGlobalValue</a>* svfgv = <a class="code" href="classSVF_1_1LLVMModuleSet.html#acf40310917909e4234282c0695a43160">LLVMModuleSet::getLLVMModuleSet</a>()-><a class="code" href="classSVF_1_1LLVMModuleSet.html#a3cbba2eb702a3481478b2590dfffa352">getSVFGlobalValue</a>(gv);</div><div class="line"><a name="l00180"></a><span class="lineno"> 180</span>  node-><a class="code" href="classSVF_1_1DCHNode.html#ad3144bcf462769c687bc7b65ef2f1639">setVTable</a>(svfgv);</div><div class="line"><a name="l00181"></a><span class="lineno"> 181</span>  <a class="code" href="classSVF_1_1DCHGraph.html#a42f373998403f615a248ce94bc836b63">vtblToTypeMap</a>[svfgv] = <a class="code" href="classSVF_1_1DCHGraph.html#a079feacdcc3783f4a9108a3b2d2aed2c">getCanonicalType</a>(type);</div><div class="line"><a name="l00182"></a><span class="lineno"> 182</span> </div><div class="line"><a name="l00183"></a><span class="lineno"> 183</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a2b28f48dde0a9a91d251e654ce1f9477">ConstantStruct</a> *vtbls = <a class="code" href="namespaceSVF_1_1SVFUtil.html#af6e96694d983643a66c238cce01bff0e">SVFUtil::dyn_cast</a><<a class="code" href="namespaceSVF.html#a2b28f48dde0a9a91d251e654ce1f9477">ConstantStruct</a>>(gv->getOperand(0));</div><div class="line"><a name="l00184"></a><span class="lineno"> 184</span>  assert(vtbls && <span class="stringliteral">"unexpected vtable type"</span>);</div><div class="line"><a name="l00185"></a><span class="lineno"> 185</span>  <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> nthVtbl = 0; nthVtbl < vtbls->getNumOperands(); ++nthVtbl)</div><div class="line"><a name="l00186"></a><span class="lineno"> 186</span>  {</div><div class="line"><a name="l00187"></a><span class="lineno"> 187</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a5ae718cba37d8e34d2946530dc098c8e">ConstantArray</a> *vtbl = <a class="code" href="namespaceSVF_1_1SVFUtil.html#af6e96694d983643a66c238cce01bff0e">SVFUtil::dyn_cast</a><<a class="code" href="namespaceSVF.html#a5ae718cba37d8e34d2946530dc098c8e">ConstantArray</a>>(vtbls->getOperand(nthVtbl));</div><div class="line"><a name="l00188"></a><span class="lineno"> 188</span>  assert(vtbl && <span class="stringliteral">"Element of vtbl struct not an array"</span>);</div><div class="line"><a name="l00189"></a><span class="lineno"> 189</span> </div><div class="line"><a name="l00190"></a><span class="lineno"> 190</span>  std::vector<const Function* > &vfns = node-><a class="code" href="classSVF_1_1DCHNode.html#a41ba902b643e2aec828be1a89f4536af">getVfnVector</a>(nthVtbl);</div><div class="line"><a name="l00191"></a><span class="lineno"> 191</span> </div><div class="line"><a name="l00192"></a><span class="lineno"> 192</span>  <span class="comment">// Iterating over the vtbl, we will run into:</span></div><div class="line"><a name="l00193"></a><span class="lineno"> 193</span>  <span class="comment">// 1. i8* null (don't care for now).</span></div><div class="line"><a name="l00194"></a><span class="lineno"> 194</span>  <span class="comment">// 2. i8* inttoptr ... (don't care for now).</span></div><div class="line"><a name="l00195"></a><span class="lineno"> 195</span>  <span class="comment">// 3. i8* bitcast ... (we only care when a function pointer is being bitcasted).</span></div><div class="line"><a name="l00196"></a><span class="lineno"> 196</span>  <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> cN = 0; cN < vtbl->getNumOperands(); ++cN)</div><div class="line"><a name="l00197"></a><span class="lineno"> 197</span>  {</div><div class="line"><a name="l00198"></a><span class="lineno"> 198</span>  <a class="code" href="namespaceSVF.html#a7e230c0cba2e3a7c2e5a5f2ee7d88af9">Constant</a> *c = vtbl->getOperand(cN);</div><div class="line"><a name="l00199"></a><span class="lineno"> 199</span>  <span class="keywordflow">if</span> (SVFUtil::isa<ConstantPointerNull>(c))</div><div class="line"><a name="l00200"></a><span class="lineno"> 200</span>  {</div><div class="line"><a name="l00201"></a><span class="lineno"> 201</span>  <span class="comment">// Don't care for now.</span></div><div class="line"><a name="l00202"></a><span class="lineno"> 202</span>  <span class="keywordflow">continue</span>;</div><div class="line"><a name="l00203"></a><span class="lineno"> 203</span>  }</div><div class="line"><a name="l00204"></a><span class="lineno"> 204</span> </div><div class="line"><a name="l00205"></a><span class="lineno"> 205</span>  <a class="code" href="namespaceSVF.html#a911dbaab38cb42deb9c195c7f687853d">ConstantExpr</a> *ce = <a class="code" href="namespaceSVF_1_1SVFUtil.html#af6e96694d983643a66c238cce01bff0e">SVFUtil::dyn_cast</a><<a class="code" href="namespaceSVF.html#a911dbaab38cb42deb9c195c7f687853d">ConstantExpr</a>>(c);</div><div class="line"><a name="l00206"></a><span class="lineno"> 206</span>  assert(ce && <span class="stringliteral">"non-ConstantExpr, non-ConstantPointerNull in vtable?"</span>);</div><div class="line"><a name="l00207"></a><span class="lineno"> 207</span>  <span class="keywordflow">if</span> (ce->getOpcode() == Instruction::BitCast)</div><div class="line"><a name="l00208"></a><span class="lineno"> 208</span>  {</div><div class="line"><a name="l00209"></a><span class="lineno"> 209</span>  <span class="comment">// Could be a GlobalAlias which we don't care about, or a virtual/thunk function.</span></div><div class="line"><a name="l00210"></a><span class="lineno"> 210</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a5faee14fa1dd41447bc73ac365fe33c1">Function</a>* vfn = <a class="code" href="namespaceSVF_1_1SVFUtil.html#af6e96694d983643a66c238cce01bff0e">SVFUtil::dyn_cast</a><<a class="code" href="namespaceSVF.html#a5faee14fa1dd41447bc73ac365fe33c1">Function</a>>(ce->getOperand(0));</div><div class="line"><a name="l00211"></a><span class="lineno"> 211</span>  <span class="keywordflow">if</span> (vfn != <span class="keyword">nullptr</span>)</div><div class="line"><a name="l00212"></a><span class="lineno"> 212</span>  {</div><div class="line"><a name="l00213"></a><span class="lineno"> 213</span>  vfns.push_back(vfn);</div><div class="line"><a name="l00214"></a><span class="lineno"> 214</span>  }</div><div class="line"><a name="l00215"></a><span class="lineno"> 215</span>  }</div><div class="line"><a name="l00216"></a><span class="lineno"> 216</span>  }</div><div class="line"><a name="l00217"></a><span class="lineno"> 217</span>  }</div><div class="line"><a name="l00218"></a><span class="lineno"> 218</span>  }</div><div class="line"><a name="l00219"></a><span class="lineno"> 219</span>  }</div><div class="line"><a name="l00220"></a><span class="lineno"> 220</span>  }</div><div class="line"><a name="l00221"></a><span class="lineno"> 221</span> }</div><div class="line"><a name="l00222"></a><span class="lineno"> 222</span> </div><div class="line"><a name="l00223"></a><span class="lineno"><a class="line" href="classSVF_1_1DCHGraph.html#a0a3dfe1f2757eabd75082e2c4caec47a"> 223</a></span> <span class="keyword">const</span> <a class="code" href="classSVF_1_1SparseBitVector.html">NodeBS</a> &<a class="code" href="classSVF_1_1DCHGraph.html#a0a3dfe1f2757eabd75082e2c4caec47a">DCHGraph::cha</a>(<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#ad127b0ad478640ede3d426e3a58d2632">DIType</a> *<a class="code" href="cJSON_8cpp.html#a3f9a0d3265a6254722587175dac3e4dc">type</a>, <span class="keywordtype">bool</span> firstField)</div><div class="line"><a name="l00224"></a><span class="lineno"> 224</span> {</div><div class="line"><a name="l00225"></a><span class="lineno"> 225</span>  type = <a class="code" href="classSVF_1_1DCHGraph.html#a079feacdcc3783f4a9108a3b2d2aed2c">getCanonicalType</a>(type);</div><div class="line"><a name="l00226"></a><span class="lineno"> 226</span>  <a class="code" href="namespaceSVF.html#a8234d4b959abc9123993bcff4eee34c1">Map<const DIType *, NodeBS></a> &cacheMap = firstField ? <a class="code" href="classSVF_1_1DCHGraph.html#abe8d313b501182ab62f2276a19d670a4">chaFFMap</a> : <a class="code" href="classSVF_1_1DCHGraph.html#ac0d5f1e10f642aac5b64792bf5fcbd9d">chaMap</a>;</div><div class="line"><a name="l00227"></a><span class="lineno"> 227</span> </div><div class="line"><a name="l00228"></a><span class="lineno"> 228</span>  <span class="comment">// Check if we've already computed.</span></div><div class="line"><a name="l00229"></a><span class="lineno"> 229</span>  <span class="keywordflow">if</span> (cacheMap.find(type) != cacheMap.end())</div><div class="line"><a name="l00230"></a><span class="lineno"> 230</span>  {</div><div class="line"><a name="l00231"></a><span class="lineno"> 231</span>  <span class="keywordflow">return</span> cacheMap[<a class="code" href="cJSON_8cpp.html#a3f9a0d3265a6254722587175dac3e4dc">type</a>];</div><div class="line"><a name="l00232"></a><span class="lineno"> 232</span>  }</div><div class="line"><a name="l00233"></a><span class="lineno"> 233</span> </div><div class="line"><a name="l00234"></a><span class="lineno"> 234</span>  <a class="code" href="classSVF_1_1SparseBitVector.html">NodeBS</a> <a class="code" href="namespaceSVF.html#a67f454fa9341632d195fd5da619130f0">children</a>;</div><div class="line"><a name="l00235"></a><span class="lineno"> 235</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1DCHNode.html">DCHNode</a> *node = <a class="code" href="classSVF_1_1DCHGraph.html#a9ed6b91fad334605f514049a2072b538">getOrCreateNode</a>(type);</div><div class="line"><a name="l00236"></a><span class="lineno"> 236</span>  <span class="comment">// Consider oneself a child, otherwise the recursion will just come up with nothing.</span></div><div class="line"><a name="l00237"></a><span class="lineno"> 237</span>  children.<a class="code" href="classSVF_1_1SparseBitVector.html#a61bd86909a141f9de873d92c0f904832">set</a>(node-><a class="code" href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">getId</a>());</div><div class="line"><a name="l00238"></a><span class="lineno"> 238</span>  <span class="keywordflow">for</span> (<span class="keyword">const</span> <a class="code" href="classSVF_1_1DCHEdge.html">DCHEdge</a> *edge : node-><a class="code" href="classSVF_1_1GenericNode.html#afc8b5f86d7795b6a0dfc0687d942d79b">getInEdges</a>())</div><div class="line"><a name="l00239"></a><span class="lineno"> 239</span>  {</div><div class="line"><a name="l00240"></a><span class="lineno"> 240</span>  <span class="comment">// Don't care about anything but inheritance, first-field, and standard def. edges.</span></div><div class="line"><a name="l00241"></a><span class="lineno"> 241</span>  <span class="keywordflow">if</span> ( edge->getEdgeKind() != <a class="code" href="classSVF_1_1DCHEdge.html#a48f01c4a02c4e278a1ab70b16efdef4ba9c05805c60fe04033bd9815968059e90">DCHEdge::INHERITANCE</a></div><div class="line"><a name="l00242"></a><span class="lineno"> 242</span>  && edge->getEdgeKind() != <a class="code" href="classSVF_1_1DCHEdge.html#a48f01c4a02c4e278a1ab70b16efdef4ba3b49b95b713f585b717810dce5ac6564">DCHEdge::FIRST_FIELD</a></div><div class="line"><a name="l00243"></a><span class="lineno"> 243</span>  && edge->getEdgeKind() != <a class="code" href="classSVF_1_1DCHEdge.html#a48f01c4a02c4e278a1ab70b16efdef4ba8b07351616a1798fa34ec3828f485ebb">DCHEdge::STD_DEF</a>)</div><div class="line"><a name="l00244"></a><span class="lineno"> 244</span>  {</div><div class="line"><a name="l00245"></a><span class="lineno"> 245</span>  <span class="keywordflow">continue</span>;</div><div class="line"><a name="l00246"></a><span class="lineno"> 246</span>  }</div><div class="line"><a name="l00247"></a><span class="lineno"> 247</span> </div><div class="line"><a name="l00248"></a><span class="lineno"> 248</span>  <span class="comment">// We only care about first-field edges if the flag is on.</span></div><div class="line"><a name="l00249"></a><span class="lineno"> 249</span>  <span class="keywordflow">if</span> (!firstField && edge->getEdgeKind() == <a class="code" href="classSVF_1_1DCHEdge.html#a48f01c4a02c4e278a1ab70b16efdef4ba3b49b95b713f585b717810dce5ac6564">DCHEdge::FIRST_FIELD</a>)</div><div class="line"><a name="l00250"></a><span class="lineno"> 250</span>  {</div><div class="line"><a name="l00251"></a><span class="lineno"> 251</span>  <span class="keywordflow">continue</span>;</div><div class="line"><a name="l00252"></a><span class="lineno"> 252</span>  }</div><div class="line"><a name="l00253"></a><span class="lineno"> 253</span> </div><div class="line"><a name="l00254"></a><span class="lineno"> 254</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1SparseBitVector.html">NodeBS</a> &cchildren = <a class="code" href="classSVF_1_1DCHGraph.html#a0a3dfe1f2757eabd75082e2c4caec47a">cha</a>(edge->getSrcNode()->getType(), firstField);</div><div class="line"><a name="l00255"></a><span class="lineno"> 255</span>  <span class="comment">// Children's children are my children.</span></div><div class="line"><a name="l00256"></a><span class="lineno"> 256</span>  <span class="keywordflow">for</span> (<a class="code" href="namespaceSVF.html#a350ae9bf8606bdfe23c8679681b969dc">NodeID</a> cchild : cchildren)</div><div class="line"><a name="l00257"></a><span class="lineno"> 257</span>  {</div><div class="line"><a name="l00258"></a><span class="lineno"> 258</span>  children.<a class="code" href="classSVF_1_1SparseBitVector.html#a61bd86909a141f9de873d92c0f904832">set</a>(cchild);</div><div class="line"><a name="l00259"></a><span class="lineno"> 259</span>  }</div><div class="line"><a name="l00260"></a><span class="lineno"> 260</span>  }</div><div class="line"><a name="l00261"></a><span class="lineno"> 261</span> </div><div class="line"><a name="l00262"></a><span class="lineno"> 262</span>  <span class="comment">// Cache results.</span></div><div class="line"><a name="l00263"></a><span class="lineno"> 263</span>  cacheMap.insert({<a class="code" href="cJSON_8cpp.html#a3f9a0d3265a6254722587175dac3e4dc">type</a>, children});</div><div class="line"><a name="l00264"></a><span class="lineno"> 264</span>  <span class="comment">// Return the permanent object; we're returning a reference.</span></div><div class="line"><a name="l00265"></a><span class="lineno"> 265</span>  <span class="keywordflow">return</span> cacheMap[<a class="code" href="cJSON_8cpp.html#a3f9a0d3265a6254722587175dac3e4dc">type</a>];</div><div class="line"><a name="l00266"></a><span class="lineno"> 266</span> }</div><div class="line"><a name="l00267"></a><span class="lineno"> 267</span> </div><div class="line"><a name="l00268"></a><span class="lineno"><a class="line" href="classSVF_1_1DCHGraph.html#ab96874bc8f6461fe0c3eb53b7f5cedce"> 268</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1DCHGraph.html#ab96874bc8f6461fe0c3eb53b7f5cedce">DCHGraph::flatten</a>(<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#aded9b991c77acc5284ccead0739e84f1">DICompositeType</a> *<a class="code" href="cJSON_8cpp.html#a3f9a0d3265a6254722587175dac3e4dc">type</a>)</div><div class="line"><a name="l00269"></a><span class="lineno"> 269</span> {</div><div class="line"><a name="l00270"></a><span class="lineno"> 270</span>  type = <a class="code" href="namespaceSVF_1_1SVFUtil.html#af6e96694d983643a66c238cce01bff0e">SVFUtil::dyn_cast</a><<a class="code" href="namespaceSVF.html#aded9b991c77acc5284ccead0739e84f1">DICompositeType</a>>(<a class="code" href="classSVF_1_1DCHGraph.html#a079feacdcc3783f4a9108a3b2d2aed2c">getCanonicalType</a>(type));</div><div class="line"><a name="l00271"></a><span class="lineno"> 271</span>  assert(type && <span class="stringliteral">"DCHG::flatten: canon type of struct/class is not struct/class"</span>);</div><div class="line"><a name="l00272"></a><span class="lineno"> 272</span>  <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1DCHGraph.html#a574ec14099f1112b394b00a79f3fdf1a">fieldTypes</a>.find(type) != <a class="code" href="classSVF_1_1DCHGraph.html#a574ec14099f1112b394b00a79f3fdf1a">fieldTypes</a>.end())</div><div class="line"><a name="l00273"></a><span class="lineno"> 273</span>  {</div><div class="line"><a name="l00274"></a><span class="lineno"> 274</span>  <span class="comment">// Already done (necessary because of the recursion).</span></div><div class="line"><a name="l00275"></a><span class="lineno"> 275</span>  <span class="keywordflow">return</span>;</div><div class="line"><a name="l00276"></a><span class="lineno"> 276</span>  }</div><div class="line"><a name="l00277"></a><span class="lineno"> 277</span> </div><div class="line"><a name="l00278"></a><span class="lineno"> 278</span>  <span class="comment">// Create empty vector.</span></div><div class="line"><a name="l00279"></a><span class="lineno"> 279</span>  <a class="code" href="classSVF_1_1DCHGraph.html#a574ec14099f1112b394b00a79f3fdf1a">fieldTypes</a>[<a class="code" href="cJSON_8cpp.html#a3f9a0d3265a6254722587175dac3e4dc">type</a>];</div><div class="line"><a name="l00280"></a><span class="lineno"> 280</span> </div><div class="line"><a name="l00281"></a><span class="lineno"> 281</span>  assert(type != <span class="keyword">nullptr</span></div><div class="line"><a name="l00282"></a><span class="lineno"> 282</span>  && (type->getTag() == dwarf::DW_TAG_class_type</div><div class="line"><a name="l00283"></a><span class="lineno"> 283</span>  || type->getTag() == dwarf::DW_TAG_structure_type)</div><div class="line"><a name="l00284"></a><span class="lineno"> 284</span>  && <span class="stringliteral">"DCHG::flatten: expected a class/struct"</span>);</div><div class="line"><a name="l00285"></a><span class="lineno"> 285</span> </div><div class="line"><a name="l00286"></a><span class="lineno"> 286</span>  <span class="comment">// Sort the fields from getElements. Especially a problem for classes; it's all jumbled up.</span></div><div class="line"><a name="l00287"></a><span class="lineno"> 287</span>  std::vector<const DIDerivedType *> fields;</div><div class="line"><a name="l00288"></a><span class="lineno"> 288</span>  <a class="code" href="namespaceSVF.html#a0f825e73d115173b05ca54fb8ec65003">DINodeArray</a> fieldsDINA = type->getElements();</div><div class="line"><a name="l00289"></a><span class="lineno"> 289</span>  <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> i = 0; i < fieldsDINA.size(); ++i)</div><div class="line"><a name="l00290"></a><span class="lineno"> 290</span>  {</div><div class="line"><a name="l00291"></a><span class="lineno"> 291</span>  <span class="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a852e75c562139237fcc754c7461533e6">DIDerivedType</a> *dt = SVFUtil::dyn_cast<DIDerivedType>(fieldsDINA[i]))</div><div class="line"><a name="l00292"></a><span class="lineno"> 292</span>  {</div><div class="line"><a name="l00293"></a><span class="lineno"> 293</span>  <span class="comment">// Don't care about subprograms, only member/inheritance.</span></div><div class="line"><a name="l00294"></a><span class="lineno"> 294</span>  fields.push_back(dt);</div><div class="line"><a name="l00295"></a><span class="lineno"> 295</span>  }</div><div class="line"><a name="l00296"></a><span class="lineno"> 296</span>  }</div><div class="line"><a name="l00297"></a><span class="lineno"> 297</span> </div><div class="line"><a name="l00298"></a><span class="lineno"> 298</span>  <span class="comment">// TODO: virtual inheritance is not handled at all!</span></div><div class="line"><a name="l00299"></a><span class="lineno"> 299</span>  std::sort(fields.begin(), fields.end(),</div><div class="line"><a name="l00300"></a><span class="lineno"> 300</span>  [](<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a852e75c562139237fcc754c7461533e6">DIDerivedType</a> *&<a class="code" href="cJSON_8cpp.html#a8a1a0a26c50cc4becfc754bb68d1dc6b">a</a>, <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a852e75c562139237fcc754c7461533e6">DIDerivedType</a> *&<a class="code" href="cJSON_8h.html#a1a175e87536301df98c805ac0636ad7c">b</a>) -> <span class="keywordtype">bool</span></div><div class="line"><a name="l00301"></a><span class="lineno"> 301</span>  { <span class="keywordflow">return</span> a->getOffsetInBits() < <a class="code" href="cJSON_8h.html#a1a175e87536301df98c805ac0636ad7c">b</a>->getOffsetInBits(); });</div><div class="line"><a name="l00302"></a><span class="lineno"> 302</span> </div><div class="line"><a name="l00303"></a><span class="lineno"> 303</span>  <span class="keywordflow">for</span> (<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a852e75c562139237fcc754c7461533e6">DIDerivedType</a> *mt : fields)</div><div class="line"><a name="l00304"></a><span class="lineno"> 304</span>  {</div><div class="line"><a name="l00305"></a><span class="lineno"> 305</span>  assert((mt->getTag() == dwarf::DW_TAG_member || mt->getTag() == dwarf::DW_TAG_inheritance)</div><div class="line"><a name="l00306"></a><span class="lineno"> 306</span>  && <span class="stringliteral">"DCHG: expected member/inheritance"</span>);</div><div class="line"><a name="l00307"></a><span class="lineno"> 307</span>  <span class="comment">// Either we have a class, struct, array, or something not in need of flattening.</span></div><div class="line"><a name="l00308"></a><span class="lineno"> 308</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#ad127b0ad478640ede3d426e3a58d2632">DIType</a> *fieldType = mt->getBaseType();</div><div class="line"><a name="l00309"></a><span class="lineno"> 309</span>  <span class="keywordflow">if</span> (fieldType->getTag() == dwarf::DW_TAG_structure_type</div><div class="line"><a name="l00310"></a><span class="lineno"> 310</span>  || fieldType->getTag() == dwarf::DW_TAG_class_type)</div><div class="line"><a name="l00311"></a><span class="lineno"> 311</span>  {</div><div class="line"><a name="l00312"></a><span class="lineno"> 312</span>  <a class="code" href="classSVF_1_1DCHGraph.html#ab96874bc8f6461fe0c3eb53b7f5cedce">flatten</a>(SVFUtil::dyn_cast<DICompositeType>(fieldType));</div><div class="line"><a name="l00313"></a><span class="lineno"> 313</span>  <span class="keywordflow">for</span> (<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#ad127b0ad478640ede3d426e3a58d2632">DIType</a> *ft : <a class="code" href="classSVF_1_1DCHGraph.html#a574ec14099f1112b394b00a79f3fdf1a">fieldTypes</a>[fieldType])</div><div class="line"><a name="l00314"></a><span class="lineno"> 314</span>  {</div><div class="line"><a name="l00315"></a><span class="lineno"> 315</span>  <span class="comment">// ft is already a canonical type because the "root" additions insert</span></div><div class="line"><a name="l00316"></a><span class="lineno"> 316</span>  <span class="comment">// canonical types.</span></div><div class="line"><a name="l00317"></a><span class="lineno"> 317</span>  <a class="code" href="classSVF_1_1DCHGraph.html#a574ec14099f1112b394b00a79f3fdf1a">fieldTypes</a>[<a class="code" href="cJSON_8cpp.html#a3f9a0d3265a6254722587175dac3e4dc">type</a>].push_back(ft);</div><div class="line"><a name="l00318"></a><span class="lineno"> 318</span>  }</div><div class="line"><a name="l00319"></a><span class="lineno"> 319</span>  }</div><div class="line"><a name="l00320"></a><span class="lineno"> 320</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (fieldType->getTag() == dwarf::DW_TAG_array_type)</div><div class="line"><a name="l00321"></a><span class="lineno"> 321</span>  {</div><div class="line"><a name="l00322"></a><span class="lineno"> 322</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#aded9b991c77acc5284ccead0739e84f1">DICompositeType</a> *arrayType = <a class="code" href="namespaceSVF_1_1SVFUtil.html#af6e96694d983643a66c238cce01bff0e">SVFUtil::dyn_cast</a><<a class="code" href="namespaceSVF.html#aded9b991c77acc5284ccead0739e84f1">DICompositeType</a>>(fieldType);</div><div class="line"><a name="l00323"></a><span class="lineno"> 323</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#ad127b0ad478640ede3d426e3a58d2632">DIType</a> *baseType = arrayType->getBaseType();</div><div class="line"><a name="l00324"></a><span class="lineno"> 324</span>  <span class="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#aded9b991c77acc5284ccead0739e84f1">DICompositeType</a> *cbt = SVFUtil::dyn_cast<DICompositeType>(baseType))</div><div class="line"><a name="l00325"></a><span class="lineno"> 325</span>  {</div><div class="line"><a name="l00326"></a><span class="lineno"> 326</span>  <a class="code" href="classSVF_1_1DCHGraph.html#ab96874bc8f6461fe0c3eb53b7f5cedce">flatten</a>(cbt);</div><div class="line"><a name="l00327"></a><span class="lineno"> 327</span>  <span class="keywordflow">for</span> (<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#ad127b0ad478640ede3d426e3a58d2632">DIType</a> *ft : <a class="code" href="classSVF_1_1DCHGraph.html#a574ec14099f1112b394b00a79f3fdf1a">fieldTypes</a>[cbt])</div><div class="line"><a name="l00328"></a><span class="lineno"> 328</span>  {</div><div class="line"><a name="l00329"></a><span class="lineno"> 329</span>  <span class="comment">// ft is already a canonical type like above.</span></div><div class="line"><a name="l00330"></a><span class="lineno"> 330</span>  <a class="code" href="classSVF_1_1DCHGraph.html#a574ec14099f1112b394b00a79f3fdf1a">fieldTypes</a>[<a class="code" href="cJSON_8cpp.html#a3f9a0d3265a6254722587175dac3e4dc">type</a>].push_back(ft);</div><div class="line"><a name="l00331"></a><span class="lineno"> 331</span>  }</div><div class="line"><a name="l00332"></a><span class="lineno"> 332</span>  }</div><div class="line"><a name="l00333"></a><span class="lineno"> 333</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l00334"></a><span class="lineno"> 334</span>  {</div><div class="line"><a name="l00335"></a><span class="lineno"> 335</span>  <a class="code" href="classSVF_1_1DCHGraph.html#a574ec14099f1112b394b00a79f3fdf1a">fieldTypes</a>[<a class="code" href="cJSON_8cpp.html#a3f9a0d3265a6254722587175dac3e4dc">type</a>].push_back(<a class="code" href="classSVF_1_1DCHGraph.html#a079feacdcc3783f4a9108a3b2d2aed2c">getCanonicalType</a>(baseType));</div><div class="line"><a name="l00336"></a><span class="lineno"> 336</span>  }</div><div class="line"><a name="l00337"></a><span class="lineno"> 337</span>  }</div><div class="line"><a name="l00338"></a><span class="lineno"> 338</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l00339"></a><span class="lineno"> 339</span>  {</div><div class="line"><a name="l00340"></a><span class="lineno"> 340</span>  <a class="code" href="classSVF_1_1DCHGraph.html#a574ec14099f1112b394b00a79f3fdf1a">fieldTypes</a>[<a class="code" href="cJSON_8cpp.html#a3f9a0d3265a6254722587175dac3e4dc">type</a>].push_back(<a class="code" href="classSVF_1_1DCHGraph.html#a079feacdcc3783f4a9108a3b2d2aed2c">getCanonicalType</a>(fieldType));</div><div class="line"><a name="l00341"></a><span class="lineno"> 341</span>  }</div><div class="line"><a name="l00342"></a><span class="lineno"> 342</span>  }</div><div class="line"><a name="l00343"></a><span class="lineno"> 343</span> }</div><div class="line"><a name="l00344"></a><span class="lineno"> 344</span> </div><div class="line"><a name="l00345"></a><span class="lineno"><a class="line" href="classSVF_1_1DCHGraph.html#a9d2be5aec5216cbc1d1709b41f79c44b"> 345</a></span> <span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1DCHGraph.html#a9d2be5aec5216cbc1d1709b41f79c44b">DCHGraph::isAgg</a>(<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#ad127b0ad478640ede3d426e3a58d2632">DIType</a> *t)</div><div class="line"><a name="l00346"></a><span class="lineno"> 346</span> {</div><div class="line"><a name="l00347"></a><span class="lineno"> 347</span>  <span class="keywordflow">if</span> (t == <span class="keyword">nullptr</span>) <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l00348"></a><span class="lineno"> 348</span>  <span class="keywordflow">return</span> t->getTag() == dwarf::DW_TAG_array_type</div><div class="line"><a name="l00349"></a><span class="lineno"> 349</span>  || t->getTag() == dwarf::DW_TAG_structure_type</div><div class="line"><a name="l00350"></a><span class="lineno"> 350</span>  || t->getTag() == dwarf::DW_TAG_class_type;</div><div class="line"><a name="l00351"></a><span class="lineno"> 351</span> }</div><div class="line"><a name="l00352"></a><span class="lineno"> 352</span> </div><div class="line"><a name="l00353"></a><span class="lineno"><a class="line" href="classSVF_1_1DCHGraph.html#a8fcbea9435a77beb27ad64d5a3175b0b"> 353</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1DCHGraph.html#a8fcbea9435a77beb27ad64d5a3175b0b">DCHGraph::gatherAggs</a>(<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#aded9b991c77acc5284ccead0739e84f1">DICompositeType</a> *<a class="code" href="cJSON_8cpp.html#a3f9a0d3265a6254722587175dac3e4dc">type</a>)</div><div class="line"><a name="l00354"></a><span class="lineno"> 354</span> {</div><div class="line"><a name="l00355"></a><span class="lineno"> 355</span>  <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1DCHGraph.html#adc7a17f70ac3fa89624ad874dbd16ff9">containingAggs</a>.find(<a class="code" href="classSVF_1_1DCHGraph.html#a079feacdcc3783f4a9108a3b2d2aed2c">getCanonicalType</a>(type)) != <a class="code" href="classSVF_1_1DCHGraph.html#adc7a17f70ac3fa89624ad874dbd16ff9">containingAggs</a>.end())</div><div class="line"><a name="l00356"></a><span class="lineno"> 356</span>  {</div><div class="line"><a name="l00357"></a><span class="lineno"> 357</span>  <span class="keywordflow">return</span>;</div><div class="line"><a name="l00358"></a><span class="lineno"> 358</span>  }</div><div class="line"><a name="l00359"></a><span class="lineno"> 359</span> </div><div class="line"><a name="l00360"></a><span class="lineno"> 360</span>  <span class="comment">// Initialise an empty set. We want all aggregates to have a value in</span></div><div class="line"><a name="l00361"></a><span class="lineno"> 361</span>  <span class="comment">// this map, even if empty (e.g. struct has no aggs, only scalars).</span></div><div class="line"><a name="l00362"></a><span class="lineno"> 362</span>  <a class="code" href="classSVF_1_1DCHGraph.html#adc7a17f70ac3fa89624ad874dbd16ff9">containingAggs</a>[<a class="code" href="classSVF_1_1DCHGraph.html#a079feacdcc3783f4a9108a3b2d2aed2c">getCanonicalType</a>(type)];</div><div class="line"><a name="l00363"></a><span class="lineno"> 363</span> </div><div class="line"><a name="l00364"></a><span class="lineno"> 364</span>  <span class="keywordflow">if</span> (type->getTag() == dwarf::DW_TAG_array_type)</div><div class="line"><a name="l00365"></a><span class="lineno"> 365</span>  {</div><div class="line"><a name="l00366"></a><span class="lineno"> 366</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#ad127b0ad478640ede3d426e3a58d2632">DIType</a> *bt = type->getBaseType();</div><div class="line"><a name="l00367"></a><span class="lineno"> 367</span>  bt = <a class="code" href="classSVF_1_1DCHGraph.html#a175ed6ad0c9b23d5617f755ab96c76c4">stripQualifiers</a>(bt);</div><div class="line"><a name="l00368"></a><span class="lineno"> 368</span> </div><div class="line"><a name="l00369"></a><span class="lineno"> 369</span>  <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1DCHGraph.html#a9d2be5aec5216cbc1d1709b41f79c44b">isAgg</a>(bt))</div><div class="line"><a name="l00370"></a><span class="lineno"> 370</span>  {</div><div class="line"><a name="l00371"></a><span class="lineno"> 371</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#aded9b991c77acc5284ccead0739e84f1">DICompositeType</a> *cbt = <a class="code" href="namespaceSVF_1_1SVFUtil.html#af6e96694d983643a66c238cce01bff0e">SVFUtil::dyn_cast</a><<a class="code" href="namespaceSVF.html#aded9b991c77acc5284ccead0739e84f1">DICompositeType</a>>(bt);</div><div class="line"><a name="l00372"></a><span class="lineno"> 372</span>  <a class="code" href="classSVF_1_1DCHGraph.html#adc7a17f70ac3fa89624ad874dbd16ff9">containingAggs</a>[<a class="code" href="classSVF_1_1DCHGraph.html#a079feacdcc3783f4a9108a3b2d2aed2c">getCanonicalType</a>(type)].insert(<a class="code" href="classSVF_1_1DCHGraph.html#a079feacdcc3783f4a9108a3b2d2aed2c">getCanonicalType</a>(cbt));</div><div class="line"><a name="l00373"></a><span class="lineno"> 373</span>  <a class="code" href="classSVF_1_1DCHGraph.html#a8fcbea9435a77beb27ad64d5a3175b0b">gatherAggs</a>(cbt);</div><div class="line"><a name="l00374"></a><span class="lineno"> 374</span>  <span class="comment">// These must be canonical already because of aggs.insert above/below.</span></div><div class="line"><a name="l00375"></a><span class="lineno"> 375</span>  <a class="code" href="classSVF_1_1DCHGraph.html#adc7a17f70ac3fa89624ad874dbd16ff9">containingAggs</a>[<a class="code" href="classSVF_1_1DCHGraph.html#a079feacdcc3783f4a9108a3b2d2aed2c">getCanonicalType</a>(type)].insert(</div><div class="line"><a name="l00376"></a><span class="lineno"> 376</span>  <a class="code" href="classSVF_1_1DCHGraph.html#adc7a17f70ac3fa89624ad874dbd16ff9">containingAggs</a>[<a class="code" href="classSVF_1_1DCHGraph.html#a079feacdcc3783f4a9108a3b2d2aed2c">getCanonicalType</a>(cbt)].<a class="code" href="classSVF_1_1GenericGraph.html#a0d9744b1b0e7a09a6f7af29188e243b7">begin</a>(),</div><div class="line"><a name="l00377"></a><span class="lineno"> 377</span>  <a class="code" href="classSVF_1_1DCHGraph.html#adc7a17f70ac3fa89624ad874dbd16ff9">containingAggs</a>[<a class="code" href="classSVF_1_1DCHGraph.html#a079feacdcc3783f4a9108a3b2d2aed2c">getCanonicalType</a>(cbt)].<a class="code" href="classSVF_1_1GenericGraph.html#a4bef15157423cef48dc7333a803cd27d">end</a>());</div><div class="line"><a name="l00378"></a><span class="lineno"> 378</span>  }</div><div class="line"><a name="l00379"></a><span class="lineno"> 379</span>  }</div><div class="line"><a name="l00380"></a><span class="lineno"> 380</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l00381"></a><span class="lineno"> 381</span>  {</div><div class="line"><a name="l00382"></a><span class="lineno"> 382</span>  <a class="code" href="namespaceSVF.html#a0f825e73d115173b05ca54fb8ec65003">DINodeArray</a> fields = type->getElements();</div><div class="line"><a name="l00383"></a><span class="lineno"> 383</span>  <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> i = 0; i < fields.size(); ++i)</div><div class="line"><a name="l00384"></a><span class="lineno"> 384</span>  {</div><div class="line"><a name="l00385"></a><span class="lineno"> 385</span>  <span class="comment">// Unwrap the member (could be a subprogram, not type, so guard needed).</span></div><div class="line"><a name="l00386"></a><span class="lineno"> 386</span>  <span class="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a852e75c562139237fcc754c7461533e6">DIDerivedType</a> *mt = SVFUtil::dyn_cast<DIDerivedType>(fields[i]))</div><div class="line"><a name="l00387"></a><span class="lineno"> 387</span>  {</div><div class="line"><a name="l00388"></a><span class="lineno"> 388</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#ad127b0ad478640ede3d426e3a58d2632">DIType</a> *ft = mt->getBaseType();</div><div class="line"><a name="l00389"></a><span class="lineno"> 389</span>  ft = <a class="code" href="classSVF_1_1DCHGraph.html#a175ed6ad0c9b23d5617f755ab96c76c4">stripQualifiers</a>(ft);</div><div class="line"><a name="l00390"></a><span class="lineno"> 390</span> </div><div class="line"><a name="l00391"></a><span class="lineno"> 391</span>  <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1DCHGraph.html#a9d2be5aec5216cbc1d1709b41f79c44b">isAgg</a>(ft))</div><div class="line"><a name="l00392"></a><span class="lineno"> 392</span>  {</div><div class="line"><a name="l00393"></a><span class="lineno"> 393</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#aded9b991c77acc5284ccead0739e84f1">DICompositeType</a> *cft = <a class="code" href="namespaceSVF_1_1SVFUtil.html#af6e96694d983643a66c238cce01bff0e">SVFUtil::dyn_cast</a><<a class="code" href="namespaceSVF.html#aded9b991c77acc5284ccead0739e84f1">DICompositeType</a>>(ft);</div><div class="line"><a name="l00394"></a><span class="lineno"> 394</span>  <a class="code" href="classSVF_1_1DCHGraph.html#adc7a17f70ac3fa89624ad874dbd16ff9">containingAggs</a>[<a class="code" href="classSVF_1_1DCHGraph.html#a079feacdcc3783f4a9108a3b2d2aed2c">getCanonicalType</a>(type)].insert(<a class="code" href="classSVF_1_1DCHGraph.html#a079feacdcc3783f4a9108a3b2d2aed2c">getCanonicalType</a>(cft));</div><div class="line"><a name="l00395"></a><span class="lineno"> 395</span>  <a class="code" href="classSVF_1_1DCHGraph.html#a8fcbea9435a77beb27ad64d5a3175b0b">gatherAggs</a>(cft);</div><div class="line"><a name="l00396"></a><span class="lineno"> 396</span>  <span class="comment">// These must be canonical already because of aggs.insert above.</span></div><div class="line"><a name="l00397"></a><span class="lineno"> 397</span>  <a class="code" href="classSVF_1_1DCHGraph.html#adc7a17f70ac3fa89624ad874dbd16ff9">containingAggs</a>[<a class="code" href="classSVF_1_1DCHGraph.html#a079feacdcc3783f4a9108a3b2d2aed2c">getCanonicalType</a>(type)].insert(</div><div class="line"><a name="l00398"></a><span class="lineno"> 398</span>  <a class="code" href="classSVF_1_1DCHGraph.html#adc7a17f70ac3fa89624ad874dbd16ff9">containingAggs</a>[<a class="code" href="classSVF_1_1DCHGraph.html#a079feacdcc3783f4a9108a3b2d2aed2c">getCanonicalType</a>(cft)].<a class="code" href="classSVF_1_1GenericGraph.html#a0d9744b1b0e7a09a6f7af29188e243b7">begin</a>(),</div><div class="line"><a name="l00399"></a><span class="lineno"> 399</span>  <a class="code" href="classSVF_1_1DCHGraph.html#adc7a17f70ac3fa89624ad874dbd16ff9">containingAggs</a>[<a class="code" href="classSVF_1_1DCHGraph.html#a079feacdcc3783f4a9108a3b2d2aed2c">getCanonicalType</a>(cft)].<a class="code" href="classSVF_1_1GenericGraph.html#a4bef15157423cef48dc7333a803cd27d">end</a>());</div><div class="line"><a name="l00400"></a><span class="lineno"> 400</span>  }</div><div class="line"><a name="l00401"></a><span class="lineno"> 401</span>  }</div><div class="line"><a name="l00402"></a><span class="lineno"> 402</span>  }</div><div class="line"><a name="l00403"></a><span class="lineno"> 403</span>  }</div><div class="line"><a name="l00404"></a><span class="lineno"> 404</span> }</div><div class="line"><a name="l00405"></a><span class="lineno"> 405</span> </div><div class="line"><a name="l00406"></a><span class="lineno"><a class="line" href="classSVF_1_1DCHGraph.html#a9ed6b91fad334605f514049a2072b538"> 406</a></span> <a class="code" href="classSVF_1_1DCHNode.html">DCHNode</a> *<a class="code" href="classSVF_1_1DCHGraph.html#a9ed6b91fad334605f514049a2072b538">DCHGraph::getOrCreateNode</a>(<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#ad127b0ad478640ede3d426e3a58d2632">DIType</a> *<a class="code" href="cJSON_8cpp.html#a3f9a0d3265a6254722587175dac3e4dc">type</a>)</div><div class="line"><a name="l00407"></a><span class="lineno"> 407</span> {</div><div class="line"><a name="l00408"></a><span class="lineno"> 408</span>  type = <a class="code" href="classSVF_1_1DCHGraph.html#a079feacdcc3783f4a9108a3b2d2aed2c">getCanonicalType</a>(type);</div><div class="line"><a name="l00409"></a><span class="lineno"> 409</span> </div><div class="line"><a name="l00410"></a><span class="lineno"> 410</span>  <span class="comment">// Check, does the node for type exist?</span></div><div class="line"><a name="l00411"></a><span class="lineno"> 411</span>  <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1DCHGraph.html#a581ce71cbc7994f71c9a6b9b145d3b9f">diTypeToNodeMap</a>[type] != <span class="keyword">nullptr</span>)</div><div class="line"><a name="l00412"></a><span class="lineno"> 412</span>  {</div><div class="line"><a name="l00413"></a><span class="lineno"> 413</span>  <span class="keywordflow">return</span> <a class="code" href="classSVF_1_1DCHGraph.html#a581ce71cbc7994f71c9a6b9b145d3b9f">diTypeToNodeMap</a>[<a class="code" href="cJSON_8cpp.html#a3f9a0d3265a6254722587175dac3e4dc">type</a>];</div><div class="line"><a name="l00414"></a><span class="lineno"> 414</span>  }</div><div class="line"><a name="l00415"></a><span class="lineno"> 415</span> </div><div class="line"><a name="l00416"></a><span class="lineno"> 416</span>  <a class="code" href="classSVF_1_1DCHNode.html">DCHNode</a> *node = <span class="keyword">new</span> <a class="code" href="classSVF_1_1DCHNode.html">DCHNode</a>(type, <a class="code" href="classSVF_1_1DCHGraph.html#a76fd3154a31584bb64683f2d762cc56c">numTypes</a>++);</div><div class="line"><a name="l00417"></a><span class="lineno"> 417</span>  <a class="code" href="classSVF_1_1GenericGraph.html#a0a8831a5429005ff9d71adbd6bf3994f">addGNode</a>(node-><a class="code" href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">getId</a>(), node);</div><div class="line"><a name="l00418"></a><span class="lineno"> 418</span>  <a class="code" href="classSVF_1_1DCHGraph.html#a581ce71cbc7994f71c9a6b9b145d3b9f">diTypeToNodeMap</a>[<a class="code" href="cJSON_8cpp.html#a3f9a0d3265a6254722587175dac3e4dc">type</a>] = node;</div><div class="line"><a name="l00419"></a><span class="lineno"> 419</span>  <span class="comment">// TODO: handle templates.</span></div><div class="line"><a name="l00420"></a><span class="lineno"> 420</span> </div><div class="line"><a name="l00421"></a><span class="lineno"> 421</span>  <span class="keywordflow">return</span> node;</div><div class="line"><a name="l00422"></a><span class="lineno"> 422</span> }</div><div class="line"><a name="l00423"></a><span class="lineno"> 423</span> </div><div class="line"><a name="l00424"></a><span class="lineno"><a class="line" href="classSVF_1_1DCHGraph.html#a294a2075c97e1db8003393fb472c1def"> 424</a></span> <a class="code" href="classSVF_1_1DCHEdge.html">DCHEdge</a> *<a class="code" href="classSVF_1_1DCHGraph.html#a294a2075c97e1db8003393fb472c1def">DCHGraph::addEdge</a>(<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#ad127b0ad478640ede3d426e3a58d2632">DIType</a> *t1, <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#ad127b0ad478640ede3d426e3a58d2632">DIType</a> *t2, <a class="code" href="classSVF_1_1GenericEdge.html#a5aceeb48929f54264807b36569019a8a">DCHEdge::GEdgeKind</a> et)</div><div class="line"><a name="l00425"></a><span class="lineno"> 425</span> {</div><div class="line"><a name="l00426"></a><span class="lineno"> 426</span>  <a class="code" href="classSVF_1_1DCHNode.html">DCHNode</a> *src = <a class="code" href="classSVF_1_1DCHGraph.html#a9ed6b91fad334605f514049a2072b538">getOrCreateNode</a>(t1);</div><div class="line"><a name="l00427"></a><span class="lineno"> 427</span>  <a class="code" href="classSVF_1_1DCHNode.html">DCHNode</a> *dst = <a class="code" href="classSVF_1_1DCHGraph.html#a9ed6b91fad334605f514049a2072b538">getOrCreateNode</a>(t2);</div><div class="line"><a name="l00428"></a><span class="lineno"> 428</span> </div><div class="line"><a name="l00429"></a><span class="lineno"> 429</span>  <a class="code" href="classSVF_1_1DCHEdge.html">DCHEdge</a> *edge = <a class="code" href="classSVF_1_1DCHGraph.html#a74b2e5787f65cf3e3b4a03ebec806b91">hasEdge</a>(t1, t2, et);</div><div class="line"><a name="l00430"></a><span class="lineno"> 430</span>  <span class="keywordflow">if</span> (edge == <span class="keyword">nullptr</span>)</div><div class="line"><a name="l00431"></a><span class="lineno"> 431</span>  {</div><div class="line"><a name="l00432"></a><span class="lineno"> 432</span>  <span class="comment">// Create a new edge.</span></div><div class="line"><a name="l00433"></a><span class="lineno"> 433</span>  edge = <span class="keyword">new</span> <a class="code" href="classSVF_1_1DCHEdge.html">DCHEdge</a>(src, dst, et);</div><div class="line"><a name="l00434"></a><span class="lineno"> 434</span>  src-><a class="code" href="classSVF_1_1GenericNode.html#ae74283fbc788665296a69e56f334557b">addOutgoingEdge</a>(edge);</div><div class="line"><a name="l00435"></a><span class="lineno"> 435</span>  dst-><a class="code" href="classSVF_1_1GenericNode.html#a93d217b0c9fd8008a2989ca2b4f3fbfb">addIncomingEdge</a>(edge);</div><div class="line"><a name="l00436"></a><span class="lineno"> 436</span>  }</div><div class="line"><a name="l00437"></a><span class="lineno"> 437</span> </div><div class="line"><a name="l00438"></a><span class="lineno"> 438</span>  <span class="keywordflow">return</span> edge;</div><div class="line"><a name="l00439"></a><span class="lineno"> 439</span> }</div><div class="line"><a name="l00440"></a><span class="lineno"> 440</span> </div><div class="line"><a name="l00441"></a><span class="lineno"><a class="line" href="classSVF_1_1DCHGraph.html#a74b2e5787f65cf3e3b4a03ebec806b91"> 441</a></span> <a class="code" href="classSVF_1_1DCHEdge.html">DCHEdge</a> *<a class="code" href="classSVF_1_1DCHGraph.html#a74b2e5787f65cf3e3b4a03ebec806b91">DCHGraph::hasEdge</a>(<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#ad127b0ad478640ede3d426e3a58d2632">DIType</a> *t1, <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#ad127b0ad478640ede3d426e3a58d2632">DIType</a> *t2, <a class="code" href="classSVF_1_1GenericEdge.html#a5aceeb48929f54264807b36569019a8a">DCHEdge::GEdgeKind</a> et)</div><div class="line"><a name="l00442"></a><span class="lineno"> 442</span> {</div><div class="line"><a name="l00443"></a><span class="lineno"> 443</span>  <a class="code" href="classSVF_1_1DCHNode.html">DCHNode</a> *src = <a class="code" href="classSVF_1_1DCHGraph.html#a9ed6b91fad334605f514049a2072b538">getOrCreateNode</a>(t1);</div><div class="line"><a name="l00444"></a><span class="lineno"> 444</span>  <a class="code" href="classSVF_1_1DCHNode.html">DCHNode</a> *dst = <a class="code" href="classSVF_1_1DCHGraph.html#a9ed6b91fad334605f514049a2072b538">getOrCreateNode</a>(t2);</div><div class="line"><a name="l00445"></a><span class="lineno"> 445</span> </div><div class="line"><a name="l00446"></a><span class="lineno"> 446</span>  <span class="keywordflow">for</span> (<a class="code" href="classSVF_1_1DCHEdge.html">DCHEdge</a> *edge : src-><a class="code" href="classSVF_1_1GenericNode.html#a2d9cd758d6f8c5189d9b90b74f43e009">getOutEdges</a>())</div><div class="line"><a name="l00447"></a><span class="lineno"> 447</span>  {</div><div class="line"><a name="l00448"></a><span class="lineno"> 448</span>  <a class="code" href="classSVF_1_1DCHNode.html">DCHNode</a> *node = edge->getDstNode();</div><div class="line"><a name="l00449"></a><span class="lineno"> 449</span>  <a class="code" href="classSVF_1_1GenericEdge.html#a5aceeb48929f54264807b36569019a8a">DCHEdge::GEdgeKind</a> edgeType = edge->getEdgeKind();</div><div class="line"><a name="l00450"></a><span class="lineno"> 450</span>  <span class="keywordflow">if</span> (node == dst && edgeType == et)</div><div class="line"><a name="l00451"></a><span class="lineno"> 451</span>  {</div><div class="line"><a name="l00452"></a><span class="lineno"> 452</span>  assert(SVFUtil::isa<DCHEdge>(edge) && <span class="stringliteral">"Non-DCHEdge in DCHNode edge set."</span>);</div><div class="line"><a name="l00453"></a><span class="lineno"> 453</span>  <span class="keywordflow">return</span> edge;</div><div class="line"><a name="l00454"></a><span class="lineno"> 454</span>  }</div><div class="line"><a name="l00455"></a><span class="lineno"> 455</span>  }</div><div class="line"><a name="l00456"></a><span class="lineno"> 456</span> </div><div class="line"><a name="l00457"></a><span class="lineno"> 457</span>  <span class="keywordflow">return</span> <span class="keyword">nullptr</span>;</div><div class="line"><a name="l00458"></a><span class="lineno"> 458</span> }</div><div class="line"><a name="l00459"></a><span class="lineno"> 459</span> </div><div class="line"><a name="l00460"></a><span class="lineno"><a class="line" href="classSVF_1_1DCHGraph.html#a710c6b87fd475552eddb425e38de8889"> 460</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1DCHGraph.html#a710c6b87fd475552eddb425e38de8889">DCHGraph::buildCHG</a>(<span class="keywordtype">bool</span> extend)</div><div class="line"><a name="l00461"></a><span class="lineno"> 461</span> {</div><div class="line"><a name="l00462"></a><span class="lineno"> 462</span>  <a class="code" href="classSVF_1_1DCHGraph.html#aa6f49dfc9e3580d3f2d8c257395eb11e">extended</a> = extend;</div><div class="line"><a name="l00463"></a><span class="lineno"> 463</span>  <a class="code" href="namespaceSVF.html#a5ae98f122c64b0114df2e5861b341321">DebugInfoFinder</a> finder;</div><div class="line"><a name="l00464"></a><span class="lineno"> 464</span>  <span class="keywordflow">for</span> (<a class="code" href="namespaceSVF.html#aa7a770b5dd5cd0e37d06a1088f252906">Module</a> &M : <a class="code" href="classSVF_1_1LLVMModuleSet.html#acf40310917909e4234282c0695a43160">LLVMModuleSet::getLLVMModuleSet</a>()->getLLVMModules())</div><div class="line"><a name="l00465"></a><span class="lineno"> 465</span>  {</div><div class="line"><a name="l00466"></a><span class="lineno"> 466</span>  finder.processModule(M);</div><div class="line"><a name="l00467"></a><span class="lineno"> 467</span>  }</div><div class="line"><a name="l00468"></a><span class="lineno"> 468</span> </div><div class="line"><a name="l00469"></a><span class="lineno"> 469</span>  <span class="comment">// Create the void node regardless of whether it appears.</span></div><div class="line"><a name="l00470"></a><span class="lineno"> 470</span>  <a class="code" href="classSVF_1_1DCHGraph.html#a9ed6b91fad334605f514049a2072b538">getOrCreateNode</a>(<span class="keyword">nullptr</span>);</div><div class="line"><a name="l00471"></a><span class="lineno"> 471</span>  <span class="comment">// Find any char type.</span></div><div class="line"><a name="l00472"></a><span class="lineno"> 472</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#ad127b0ad478640ede3d426e3a58d2632">DIType</a> *charType = <span class="keyword">nullptr</span>;</div><div class="line"><a name="l00473"></a><span class="lineno"> 473</span>  <span class="comment">/*</span></div><div class="line"><a name="l00474"></a><span class="lineno"> 474</span> <span class="comment"> * We want void at the top, char as a child, and everything is a child of char:</span></div><div class="line"><a name="l00475"></a><span class="lineno"> 475</span> <span class="comment"> * void</span></div><div class="line"><a name="l00476"></a><span class="lineno"> 476</span> <span class="comment"> * |</span></div><div class="line"><a name="l00477"></a><span class="lineno"> 477</span> <span class="comment"> * char</span></div><div class="line"><a name="l00478"></a><span class="lineno"> 478</span> <span class="comment"> * / | \</span></div><div class="line"><a name="l00479"></a><span class="lineno"> 479</span> <span class="comment"> * x y z</span></div><div class="line"><a name="l00480"></a><span class="lineno"> 480</span> <span class="comment"> */</span></div><div class="line"><a name="l00481"></a><span class="lineno"> 481</span> </div><div class="line"><a name="l00482"></a><span class="lineno"> 482</span> </div><div class="line"><a name="l00483"></a><span class="lineno"> 483</span>  <span class="keywordflow">for</span> (<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#ad127b0ad478640ede3d426e3a58d2632">DIType</a> *<a class="code" href="cJSON_8cpp.html#a3f9a0d3265a6254722587175dac3e4dc">type</a> : finder.types())</div><div class="line"><a name="l00484"></a><span class="lineno"> 484</span>  {</div><div class="line"><a name="l00485"></a><span class="lineno"> 485</span>  <span class="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#ada0513be7e25325325ccc9183aeca278">DIBasicType</a> *basicType = SVFUtil::dyn_cast<DIBasicType>(<a class="code" href="cJSON_8cpp.html#a3f9a0d3265a6254722587175dac3e4dc">type</a>))</div><div class="line"><a name="l00486"></a><span class="lineno"> 486</span>  {</div><div class="line"><a name="l00487"></a><span class="lineno"> 487</span>  <span class="keywordflow">if</span> (basicType->getEncoding() == dwarf::DW_ATE_unsigned_char</div><div class="line"><a name="l00488"></a><span class="lineno"> 488</span>  || basicType->getEncoding() == dwarf::DW_ATE_signed_char)</div><div class="line"><a name="l00489"></a><span class="lineno"> 489</span>  {</div><div class="line"><a name="l00490"></a><span class="lineno"> 490</span>  charType = <a class="code" href="cJSON_8cpp.html#a3f9a0d3265a6254722587175dac3e4dc">type</a>;</div><div class="line"><a name="l00491"></a><span class="lineno"> 491</span>  }</div><div class="line"><a name="l00492"></a><span class="lineno"> 492</span> </div><div class="line"><a name="l00493"></a><span class="lineno"> 493</span>  <a class="code" href="classSVF_1_1DCHGraph.html#a86bf48776ccf53092f4cb742cf95f8eb">handleDIBasicType</a>(basicType);</div><div class="line"><a name="l00494"></a><span class="lineno"> 494</span>  }</div><div class="line"><a name="l00495"></a><span class="lineno"> 495</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#aded9b991c77acc5284ccead0739e84f1">DICompositeType</a> *compositeType = SVFUtil::dyn_cast<DICompositeType>(<a class="code" href="cJSON_8cpp.html#a3f9a0d3265a6254722587175dac3e4dc">type</a>))</div><div class="line"><a name="l00496"></a><span class="lineno"> 496</span>  {</div><div class="line"><a name="l00497"></a><span class="lineno"> 497</span>  <a class="code" href="classSVF_1_1DCHGraph.html#a3ce75cbe92a1fa7d34c6fca2d2ca1b0f">handleDICompositeType</a>(compositeType);</div><div class="line"><a name="l00498"></a><span class="lineno"> 498</span>  }</div><div class="line"><a name="l00499"></a><span class="lineno"> 499</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a852e75c562139237fcc754c7461533e6">DIDerivedType</a> *derivedType = SVFUtil::dyn_cast<DIDerivedType>(<a class="code" href="cJSON_8cpp.html#a3f9a0d3265a6254722587175dac3e4dc">type</a>))</div><div class="line"><a name="l00500"></a><span class="lineno"> 500</span>  {</div><div class="line"><a name="l00501"></a><span class="lineno"> 501</span>  <a class="code" href="classSVF_1_1DCHGraph.html#a1a4162e68b22d53e9dca73c6780ed3e5">handleDIDerivedType</a>(derivedType);</div><div class="line"><a name="l00502"></a><span class="lineno"> 502</span>  }</div><div class="line"><a name="l00503"></a><span class="lineno"> 503</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a090e0791e8c200104ed3ab6bab157129">DISubroutineType</a> *subroutineType = SVFUtil::dyn_cast<DISubroutineType>(<a class="code" href="cJSON_8cpp.html#a3f9a0d3265a6254722587175dac3e4dc">type</a>))</div><div class="line"><a name="l00504"></a><span class="lineno"> 504</span>  {</div><div class="line"><a name="l00505"></a><span class="lineno"> 505</span>  <a class="code" href="classSVF_1_1DCHGraph.html#a671f379ae54eef247b5e013478eb3f0c">handleDISubroutineType</a>(subroutineType);</div><div class="line"><a name="l00506"></a><span class="lineno"> 506</span>  }</div><div class="line"><a name="l00507"></a><span class="lineno"> 507</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l00508"></a><span class="lineno"> 508</span>  {</div><div class="line"><a name="l00509"></a><span class="lineno"> 509</span>  assert(<span class="keyword">false</span> && <span class="stringliteral">"DCHGraph::buildCHG: unexpected DIType."</span>);</div><div class="line"><a name="l00510"></a><span class="lineno"> 510</span>  }</div><div class="line"><a name="l00511"></a><span class="lineno"> 511</span>  }</div><div class="line"><a name="l00512"></a><span class="lineno"> 512</span> </div><div class="line"><a name="l00513"></a><span class="lineno"> 513</span>  <a class="code" href="classSVF_1_1DCHGraph.html#a1215db390515a30fbc416fb14d2e863f">buildVTables</a>(*(<a class="code" href="classSVF_1_1LLVMModuleSet.html#acf40310917909e4234282c0695a43160">LLVMModuleSet::getLLVMModuleSet</a>()->getSVFModule()));</div><div class="line"><a name="l00514"></a><span class="lineno"> 514</span> </div><div class="line"><a name="l00515"></a><span class="lineno"> 515</span>  <span class="comment">// Build the void/char/everything else relation.</span></div><div class="line"><a name="l00516"></a><span class="lineno"> 516</span>  <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1DCHGraph.html#aa6f49dfc9e3580d3f2d8c257395eb11e">extended</a> && charType != <span class="keyword">nullptr</span>)</div><div class="line"><a name="l00517"></a><span class="lineno"> 517</span>  {</div><div class="line"><a name="l00518"></a><span class="lineno"> 518</span>  <span class="comment">// void <-- char</span></div><div class="line"><a name="l00519"></a><span class="lineno"> 519</span>  <a class="code" href="classSVF_1_1DCHGraph.html#a294a2075c97e1db8003393fb472c1def">addEdge</a>(charType, <span class="keyword">nullptr</span>, <a class="code" href="classSVF_1_1DCHEdge.html#a48f01c4a02c4e278a1ab70b16efdef4ba8b07351616a1798fa34ec3828f485ebb">DCHEdge::STD_DEF</a>);</div><div class="line"><a name="l00520"></a><span class="lineno"> 520</span>  <span class="comment">// char <-- x, char <-- y, ...</span></div><div class="line"><a name="l00521"></a><span class="lineno"> 521</span>  <span class="keywordflow">for</span> (<a class="code" href="classSVF_1_1GenericGraph.html#ac213302cf5c7cdf3b66f7b18649d0fbc">iterator</a> nodeI = <a class="code" href="classSVF_1_1GenericGraph.html#a0d9744b1b0e7a09a6f7af29188e243b7">begin</a>(); nodeI != <a class="code" href="classSVF_1_1GenericGraph.html#a4bef15157423cef48dc7333a803cd27d">end</a>(); ++nodeI)</div><div class="line"><a name="l00522"></a><span class="lineno"> 522</span>  {</div><div class="line"><a name="l00523"></a><span class="lineno"> 523</span>  <span class="comment">// Everything without a parent gets char as a parent.</span></div><div class="line"><a name="l00524"></a><span class="lineno"> 524</span>  <span class="keywordflow">if</span> (nodeI->second->getType() != <span class="keyword">nullptr</span></div><div class="line"><a name="l00525"></a><span class="lineno"> 525</span>  && nodeI->second->getOutEdges().size() == 0)</div><div class="line"><a name="l00526"></a><span class="lineno"> 526</span>  {</div><div class="line"><a name="l00527"></a><span class="lineno"> 527</span>  <a class="code" href="classSVF_1_1DCHGraph.html#a294a2075c97e1db8003393fb472c1def">addEdge</a>(nodeI->second->getType(), charType, <a class="code" href="classSVF_1_1DCHEdge.html#a48f01c4a02c4e278a1ab70b16efdef4ba8b07351616a1798fa34ec3828f485ebb">DCHEdge::STD_DEF</a>);</div><div class="line"><a name="l00528"></a><span class="lineno"> 528</span>  }</div><div class="line"><a name="l00529"></a><span class="lineno"> 529</span>  }</div><div class="line"><a name="l00530"></a><span class="lineno"> 530</span>  }</div><div class="line"><a name="l00531"></a><span class="lineno"> 531</span> </div><div class="line"><a name="l00532"></a><span class="lineno"> 532</span>  <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1Options.html#aab85f2c2ceb235b1291301f33154d182">Options::PrintDCHG</a>())</div><div class="line"><a name="l00533"></a><span class="lineno"> 533</span>  {</div><div class="line"><a name="l00534"></a><span class="lineno"> 534</span>  <a class="code" href="classSVF_1_1DCHGraph.html#a5f08ed4cbba3e4b7a348d5ad77664726">print</a>();</div><div class="line"><a name="l00535"></a><span class="lineno"> 535</span>  }</div><div class="line"><a name="l00536"></a><span class="lineno"> 536</span> }</div><div class="line"><a name="l00537"></a><span class="lineno"> 537</span> </div><div class="line"><a name="l00538"></a><span class="lineno"><a class="line" href="classSVF_1_1DCHGraph.html#ad398e58286af020fb4dcc03644f2a24f"> 538</a></span> <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#ad2b487757f1e1a1d81073120fc1d49c7">VFunSet</a> &<a class="code" href="classSVF_1_1DCHGraph.html#ad398e58286af020fb4dcc03644f2a24f">DCHGraph::getCSVFsBasedonCHA</a>(<a class="code" href="classSVF_1_1CallSite.html">CallSite</a> cs)</div><div class="line"><a name="l00539"></a><span class="lineno"> 539</span> {</div><div class="line"><a name="l00540"></a><span class="lineno"> 540</span>  <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1DCHGraph.html#ad79a569e77f94fa8494eed3f18e07e90">csCHAMap</a>.find(cs) != <a class="code" href="classSVF_1_1DCHGraph.html#ad79a569e77f94fa8494eed3f18e07e90">csCHAMap</a>.end())</div><div class="line"><a name="l00541"></a><span class="lineno"> 541</span>  {</div><div class="line"><a name="l00542"></a><span class="lineno"> 542</span>  <span class="keywordflow">return</span> <a class="code" href="classSVF_1_1DCHGraph.html#ad79a569e77f94fa8494eed3f18e07e90">csCHAMap</a>[cs];</div><div class="line"><a name="l00543"></a><span class="lineno"> 543</span>  }</div><div class="line"><a name="l00544"></a><span class="lineno"> 544</span> </div><div class="line"><a name="l00545"></a><span class="lineno"> 545</span>  <a class="code" href="namespaceSVF.html#ad2b487757f1e1a1d81073120fc1d49c7">VFunSet</a> vfns;</div><div class="line"><a name="l00546"></a><span class="lineno"> 546</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a340a9e77adc2bbfdee79e22da9ead234">VTableSet</a> &vtbls = <a class="code" href="classSVF_1_1DCHGraph.html#a3383b841bb79ee39cb108b9906fca6a9">getCSVtblsBasedonCHA</a>(cs);</div><div class="line"><a name="l00547"></a><span class="lineno"> 547</span>  <a class="code" href="classSVF_1_1DCHGraph.html#a6a5d012fda005d45bf3196d1a7d2c6fa">getVFnsFromVtbls</a>(cs, vtbls, vfns);</div><div class="line"><a name="l00548"></a><span class="lineno"> 548</span> </div><div class="line"><a name="l00549"></a><span class="lineno"> 549</span>  <span class="comment">// Cache.</span></div><div class="line"><a name="l00550"></a><span class="lineno"> 550</span>  <a class="code" href="classSVF_1_1DCHGraph.html#ad79a569e77f94fa8494eed3f18e07e90">csCHAMap</a>.insert({cs, vfns});</div><div class="line"><a name="l00551"></a><span class="lineno"> 551</span>  <span class="comment">// Return cached object, not the stack object.</span></div><div class="line"><a name="l00552"></a><span class="lineno"> 552</span>  <span class="keywordflow">return</span> <a class="code" href="classSVF_1_1DCHGraph.html#ad79a569e77f94fa8494eed3f18e07e90">csCHAMap</a>[cs];</div><div class="line"><a name="l00553"></a><span class="lineno"> 553</span> }</div><div class="line"><a name="l00554"></a><span class="lineno"> 554</span> </div><div class="line"><a name="l00555"></a><span class="lineno"><a class="line" href="classSVF_1_1DCHGraph.html#a3383b841bb79ee39cb108b9906fca6a9"> 555</a></span> <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a340a9e77adc2bbfdee79e22da9ead234">VTableSet</a> &<a class="code" href="classSVF_1_1DCHGraph.html#a3383b841bb79ee39cb108b9906fca6a9">DCHGraph::getCSVtblsBasedonCHA</a>(<a class="code" href="classSVF_1_1CallSite.html">CallSite</a> cs)</div><div class="line"><a name="l00556"></a><span class="lineno"> 556</span> {</div><div class="line"><a name="l00557"></a><span class="lineno"> 557</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#ad127b0ad478640ede3d426e3a58d2632">DIType</a> *<a class="code" href="cJSON_8cpp.html#a3f9a0d3265a6254722587175dac3e4dc">type</a> = <a class="code" href="classSVF_1_1DCHGraph.html#a079feacdcc3783f4a9108a3b2d2aed2c">getCanonicalType</a>(<a class="code" href="classSVF_1_1DCHGraph.html#aefe2e9c130048a55a3aed63d128da7a0">getCSStaticType</a>(cs));</div><div class="line"><a name="l00558"></a><span class="lineno"> 558</span>  <span class="comment">// Check if we've already computed.</span></div><div class="line"><a name="l00559"></a><span class="lineno"> 559</span>  <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1DCHGraph.html#a294e7a04aff9cef87c1008e91a620155">vtblCHAMap</a>.find(type) != <a class="code" href="classSVF_1_1DCHGraph.html#a294e7a04aff9cef87c1008e91a620155">vtblCHAMap</a>.end())</div><div class="line"><a name="l00560"></a><span class="lineno"> 560</span>  {</div><div class="line"><a name="l00561"></a><span class="lineno"> 561</span>  <span class="keywordflow">return</span> <a class="code" href="classSVF_1_1DCHGraph.html#a294e7a04aff9cef87c1008e91a620155">vtblCHAMap</a>[<a class="code" href="cJSON_8cpp.html#a3f9a0d3265a6254722587175dac3e4dc">type</a>];</div><div class="line"><a name="l00562"></a><span class="lineno"> 562</span>  }</div><div class="line"><a name="l00563"></a><span class="lineno"> 563</span> </div><div class="line"><a name="l00564"></a><span class="lineno"> 564</span>  <a class="code" href="namespaceSVF.html#a340a9e77adc2bbfdee79e22da9ead234">VTableSet</a> vtblSet;</div><div class="line"><a name="l00565"></a><span class="lineno"> 565</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1SparseBitVector.html">NodeBS</a> &<a class="code" href="namespaceSVF.html#a67f454fa9341632d195fd5da619130f0">children</a> = <a class="code" href="classSVF_1_1DCHGraph.html#a0a3dfe1f2757eabd75082e2c4caec47a">cha</a>(type, <span class="keyword">false</span>);</div><div class="line"><a name="l00566"></a><span class="lineno"> 566</span>  <span class="keywordflow">for</span> (<a class="code" href="namespaceSVF.html#a350ae9bf8606bdfe23c8679681b969dc">NodeID</a> childId : children)</div><div class="line"><a name="l00567"></a><span class="lineno"> 567</span>  {</div><div class="line"><a name="l00568"></a><span class="lineno"> 568</span>  <a class="code" href="classSVF_1_1DCHNode.html">DCHNode</a> *<a class="code" href="cJSON_8cpp.html#ad00efb41ca386db28bacc7aefe79535c">child</a> = <a class="code" href="classSVF_1_1GenericGraph.html#a43c9c773bfa17abf481c33073e30d01b">getGNode</a>(childId);</div><div class="line"><a name="l00569"></a><span class="lineno"> 569</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFGlobalValue.html">SVFGlobalValue</a> *vtbl = child-><a class="code" href="classSVF_1_1DCHNode.html#a9184a71cd5dae94843ac89f4235d4fa2">getVTable</a>();</div><div class="line"><a name="l00570"></a><span class="lineno"> 570</span>  <span class="comment">// TODO: what if it is null?</span></div><div class="line"><a name="l00571"></a><span class="lineno"> 571</span>  <span class="keywordflow">if</span> (vtbl != <span class="keyword">nullptr</span>)</div><div class="line"><a name="l00572"></a><span class="lineno"> 572</span>  {</div><div class="line"><a name="l00573"></a><span class="lineno"> 573</span>  vtblSet.insert(vtbl);</div><div class="line"><a name="l00574"></a><span class="lineno"> 574</span>  }</div><div class="line"><a name="l00575"></a><span class="lineno"> 575</span>  }</div><div class="line"><a name="l00576"></a><span class="lineno"> 576</span> </div><div class="line"><a name="l00577"></a><span class="lineno"> 577</span>  <span class="comment">// Cache.</span></div><div class="line"><a name="l00578"></a><span class="lineno"> 578</span>  <a class="code" href="classSVF_1_1DCHGraph.html#a294e7a04aff9cef87c1008e91a620155">vtblCHAMap</a>.insert({<a class="code" href="cJSON_8cpp.html#a3f9a0d3265a6254722587175dac3e4dc">type</a>, vtblSet});</div><div class="line"><a name="l00579"></a><span class="lineno"> 579</span>  <span class="comment">// Return cached version - not the stack object.</span></div><div class="line"><a name="l00580"></a><span class="lineno"> 580</span>  <span class="keywordflow">return</span> <a class="code" href="classSVF_1_1DCHGraph.html#a294e7a04aff9cef87c1008e91a620155">vtblCHAMap</a>[<a class="code" href="cJSON_8cpp.html#a3f9a0d3265a6254722587175dac3e4dc">type</a>];</div><div class="line"><a name="l00581"></a><span class="lineno"> 581</span> }</div><div class="line"><a name="l00582"></a><span class="lineno"> 582</span> </div><div class="line"><a name="l00583"></a><span class="lineno"><a class="line" href="classSVF_1_1DCHGraph.html#a6a5d012fda005d45bf3196d1a7d2c6fa"> 583</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1DCHGraph.html#a6a5d012fda005d45bf3196d1a7d2c6fa">DCHGraph::getVFnsFromVtbls</a>(<a class="code" href="classSVF_1_1CallSite.html">CallSite</a> cs, <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a340a9e77adc2bbfdee79e22da9ead234">VTableSet</a> &vtbls, <a class="code" href="namespaceSVF.html#ad2b487757f1e1a1d81073120fc1d49c7">VFunSet</a> &virtualFunctions)</div><div class="line"><a name="l00584"></a><span class="lineno"> 584</span> {</div><div class="line"><a name="l00585"></a><span class="lineno"> 585</span>  <span class="keywordtype">size_t</span> idx = cs.<a class="code" href="classSVF_1_1CallSite.html#a6d8296c7b29e4ac07531ab36fa2b06e1">getFunIdxInVtable</a>();</div><div class="line"><a name="l00586"></a><span class="lineno"> 586</span>  <a class="code" href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">std::string</a> funName = cs.<a class="code" href="classSVF_1_1CallSite.html#a8344d90c8f5637f39c45fbc60f381cd9">getFunNameOfVirtualCall</a>();</div><div class="line"><a name="l00587"></a><span class="lineno"> 587</span>  <span class="keywordflow">for</span> (<span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFGlobalValue.html">SVFGlobalValue</a> *vtbl : vtbls)</div><div class="line"><a name="l00588"></a><span class="lineno"> 588</span>  {</div><div class="line"><a name="l00589"></a><span class="lineno"> 589</span>  assert(<a class="code" href="classSVF_1_1DCHGraph.html#a42f373998403f615a248ce94bc836b63">vtblToTypeMap</a>.find(vtbl) != <a class="code" href="classSVF_1_1DCHGraph.html#a42f373998403f615a248ce94bc836b63">vtblToTypeMap</a>.end() && <span class="stringliteral">"floating vtbl"</span>);</div><div class="line"><a name="l00590"></a><span class="lineno"> 590</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#ad127b0ad478640ede3d426e3a58d2632">DIType</a> *<a class="code" href="cJSON_8cpp.html#a3f9a0d3265a6254722587175dac3e4dc">type</a> = <a class="code" href="classSVF_1_1DCHGraph.html#a42f373998403f615a248ce94bc836b63">vtblToTypeMap</a>[vtbl];</div><div class="line"><a name="l00591"></a><span class="lineno"> 591</span>  assert(<a class="code" href="classSVF_1_1DCHGraph.html#a58341e23c1dc2b3e7fce190ed16a8a25">hasNode</a>(type) && <span class="stringliteral">"trying to get vtbl for type not in graph"</span>);</div><div class="line"><a name="l00592"></a><span class="lineno"> 592</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1DCHNode.html">DCHNode</a> *node = <a class="code" href="classSVF_1_1DCHGraph.html#a96c68bbb5ee5e939158ce0b67da2c61d">getNode</a>(type);</div><div class="line"><a name="l00593"></a><span class="lineno"> 593</span>  std::vector<std::vector<const Function* >> allVfns = node-><a class="code" href="classSVF_1_1DCHNode.html#a806a65f35c9f4ea118c1ef44ddb46079">getVfnVectors</a>();</div><div class="line"><a name="l00594"></a><span class="lineno"> 594</span>  <span class="keywordflow">for</span> (std::vector<const Function* > vfnV : allVfns)</div><div class="line"><a name="l00595"></a><span class="lineno"> 595</span>  {</div><div class="line"><a name="l00596"></a><span class="lineno"> 596</span>  <span class="comment">// We only care about any virtual function corresponding to idx.</span></div><div class="line"><a name="l00597"></a><span class="lineno"> 597</span>  <span class="keywordflow">if</span> (idx >= vfnV.size())</div><div class="line"><a name="l00598"></a><span class="lineno"> 598</span>  {</div><div class="line"><a name="l00599"></a><span class="lineno"> 599</span>  <span class="keywordflow">continue</span>;</div><div class="line"><a name="l00600"></a><span class="lineno"> 600</span>  }</div><div class="line"><a name="l00601"></a><span class="lineno"> 601</span> </div><div class="line"><a name="l00602"></a><span class="lineno"> 602</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a5faee14fa1dd41447bc73ac365fe33c1">Function</a>* callee = vfnV[idx];</div><div class="line"><a name="l00603"></a><span class="lineno"> 603</span>  <span class="comment">// Practically a copy of that in lib/MemoryModel/CHA.cpp</span></div><div class="line"><a name="l00604"></a><span class="lineno"> 604</span>  <span class="keywordflow">if</span> (cs.<a class="code" href="classSVF_1_1CallSite.html#a2a1904e6f381a0f8ac30265f2dfc48c8">arg_size</a>() == callee->arg_size() || (cs.<a class="code" href="classSVF_1_1CallSite.html#abe38a348db833b797f32ecc05f67100c">isVarArg</a>() && callee->isVarArg()))</div><div class="line"><a name="l00605"></a><span class="lineno"> 605</span>  {</div><div class="line"><a name="l00606"></a><span class="lineno"> 606</span>  <a class="code" href="structSVF_1_1cppUtil_1_1DemangledName.html">cppUtil::DemangledName</a> dname = <a class="code" href="namespaceSVF_1_1cppUtil.html#a1007c092efaeae41002efd91b803a7f6">cppUtil::demangle</a>(callee->getName().str());</div><div class="line"><a name="l00607"></a><span class="lineno"> 607</span>  <a class="code" href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">std::string</a> calleeName = dname.<a class="code" href="structSVF_1_1cppUtil_1_1DemangledName.html#a1dd17b240663bc9412adefde82385e02">funcName</a>;</div><div class="line"><a name="l00608"></a><span class="lineno"> 608</span> </div><div class="line"><a name="l00609"></a><span class="lineno"> 609</span>  <span class="comment">/*</span></div><div class="line"><a name="l00610"></a><span class="lineno"> 610</span> <span class="comment"> * The compiler will add some special suffix (e.g.,</span></div><div class="line"><a name="l00611"></a><span class="lineno"> 611</span> <span class="comment"> * "[abi:cxx11]") to the end of some virtual function:</span></div><div class="line"><a name="l00612"></a><span class="lineno"> 612</span> <span class="comment"> * In dealII</span></div><div class="line"><a name="l00613"></a><span class="lineno"> 613</span> <span class="comment"> * function: FE_Q<3>::get_name</span></div><div class="line"><a name="l00614"></a><span class="lineno"> 614</span> <span class="comment"> * will be mangled as: _ZNK4FE_QILi3EE8get_nameB5cxx11Ev</span></div><div class="line"><a name="l00615"></a><span class="lineno"> 615</span> <span class="comment"> * after demangling: FE_Q<3>::get_name[abi:cxx11]</span></div><div class="line"><a name="l00616"></a><span class="lineno"> 616</span> <span class="comment"> * The special suffix ("[abi:cxx11]") needs to be removed</span></div><div class="line"><a name="l00617"></a><span class="lineno"> 617</span> <span class="comment"> */</span></div><div class="line"><a name="l00618"></a><span class="lineno"> 618</span>  <span class="keyword">const</span> <a class="code" href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">std::string</a> suffix(<span class="stringliteral">"[abi:cxx11]"</span>);</div><div class="line"><a name="l00619"></a><span class="lineno"> 619</span>  <span class="keywordtype">size_t</span> suffixPos = calleeName.rfind(suffix);</div><div class="line"><a name="l00620"></a><span class="lineno"> 620</span>  <span class="keywordflow">if</span> (suffixPos != std::string::npos)</div><div class="line"><a name="l00621"></a><span class="lineno"> 621</span>  {</div><div class="line"><a name="l00622"></a><span class="lineno"> 622</span>  calleeName.erase(suffixPos, suffix.size());</div><div class="line"><a name="l00623"></a><span class="lineno"> 623</span>  }</div><div class="line"><a name="l00624"></a><span class="lineno"> 624</span> </div><div class="line"><a name="l00625"></a><span class="lineno"> 625</span>  <span class="comment">/*</span></div><div class="line"><a name="l00626"></a><span class="lineno"> 626</span> <span class="comment"> * if we can't get the function name of a virtual callsite, all virtual</span></div><div class="line"><a name="l00627"></a><span class="lineno"> 627</span> <span class="comment"> * functions corresponding to idx will be valid</span></div><div class="line"><a name="l00628"></a><span class="lineno"> 628</span> <span class="comment"> */</span></div><div class="line"><a name="l00629"></a><span class="lineno"> 629</span>  <span class="keywordflow">if</span> (funName.size() == 0)</div><div class="line"><a name="l00630"></a><span class="lineno"> 630</span>  {</div><div class="line"><a name="l00631"></a><span class="lineno"> 631</span>  virtualFunctions.insert(<a class="code" href="namespaceSVF_1_1LLVMUtil.html#a4f6431ca72e0378bf2428de8a87ba648">LLVMUtil::getFunction</a>(callee->getName().str()));</div><div class="line"><a name="l00632"></a><span class="lineno"> 632</span>  }</div><div class="line"><a name="l00633"></a><span class="lineno"> 633</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (funName[0] == <span class="charliteral">'~'</span>)</div><div class="line"><a name="l00634"></a><span class="lineno"> 634</span>  {</div><div class="line"><a name="l00635"></a><span class="lineno"> 635</span>  <span class="comment">/*</span></div><div class="line"><a name="l00636"></a><span class="lineno"> 636</span> <span class="comment"> * if the virtual callsite is calling a destructor, then all</span></div><div class="line"><a name="l00637"></a><span class="lineno"> 637</span> <span class="comment"> * destructors in the ch will be valid</span></div><div class="line"><a name="l00638"></a><span class="lineno"> 638</span> <span class="comment"> * class A { virtual ~A(){} };</span></div><div class="line"><a name="l00639"></a><span class="lineno"> 639</span> <span class="comment"> * class B: public A { virtual ~B(){} };</span></div><div class="line"><a name="l00640"></a><span class="lineno"> 640</span> <span class="comment"> * int main() {</span></div><div class="line"><a name="l00641"></a><span class="lineno"> 641</span> <span class="comment"> * A *a = new B;</span></div><div class="line"><a name="l00642"></a><span class="lineno"> 642</span> <span class="comment"> * delete a; /// the function name of this virtual callsite is ~A()</span></div><div class="line"><a name="l00643"></a><span class="lineno"> 643</span> <span class="comment"> * }</span></div><div class="line"><a name="l00644"></a><span class="lineno"> 644</span> <span class="comment"> */</span></div><div class="line"><a name="l00645"></a><span class="lineno"> 645</span>  <span class="keywordflow">if</span> (calleeName[0] == <span class="charliteral">'~'</span>)</div><div class="line"><a name="l00646"></a><span class="lineno"> 646</span>  {</div><div class="line"><a name="l00647"></a><span class="lineno"> 647</span>  virtualFunctions.insert(<a class="code" href="namespaceSVF_1_1LLVMUtil.html#a4f6431ca72e0378bf2428de8a87ba648">LLVMUtil::getFunction</a>(callee->getName().str()));</div><div class="line"><a name="l00648"></a><span class="lineno"> 648</span>  }</div><div class="line"><a name="l00649"></a><span class="lineno"> 649</span>  }</div><div class="line"><a name="l00650"></a><span class="lineno"> 650</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l00651"></a><span class="lineno"> 651</span>  {</div><div class="line"><a name="l00652"></a><span class="lineno"> 652</span>  <span class="comment">/*</span></div><div class="line"><a name="l00653"></a><span class="lineno"> 653</span> <span class="comment"> * For other virtual function calls, the function name of the callsite</span></div><div class="line"><a name="l00654"></a><span class="lineno"> 654</span> <span class="comment"> * and the function name of the target callee should match exactly</span></div><div class="line"><a name="l00655"></a><span class="lineno"> 655</span> <span class="comment"> */</span></div><div class="line"><a name="l00656"></a><span class="lineno"> 656</span>  <span class="keywordflow">if</span> (funName.compare(calleeName) == 0)</div><div class="line"><a name="l00657"></a><span class="lineno"> 657</span>  {</div><div class="line"><a name="l00658"></a><span class="lineno"> 658</span>  virtualFunctions.insert(<a class="code" href="namespaceSVF_1_1LLVMUtil.html#a4f6431ca72e0378bf2428de8a87ba648">LLVMUtil::getFunction</a>(callee->getName().str()));</div><div class="line"><a name="l00659"></a><span class="lineno"> 659</span>  }</div><div class="line"><a name="l00660"></a><span class="lineno"> 660</span>  }</div><div class="line"><a name="l00661"></a><span class="lineno"> 661</span>  }</div><div class="line"><a name="l00662"></a><span class="lineno"> 662</span>  }</div><div class="line"><a name="l00663"></a><span class="lineno"> 663</span>  }</div><div class="line"><a name="l00664"></a><span class="lineno"> 664</span> }</div><div class="line"><a name="l00665"></a><span class="lineno"> 665</span> </div><div class="line"><a name="l00666"></a><span class="lineno"><a class="line" href="classSVF_1_1DCHGraph.html#ab33f9af6ad22eb99dd0d9950fb0e50e6"> 666</a></span> <span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1DCHGraph.html#ab33f9af6ad22eb99dd0d9950fb0e50e6">DCHGraph::isBase</a>(<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#ad127b0ad478640ede3d426e3a58d2632">DIType</a> *<a class="code" href="cJSON_8cpp.html#a8a1a0a26c50cc4becfc754bb68d1dc6b">a</a>, <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#ad127b0ad478640ede3d426e3a58d2632">DIType</a> *<a class="code" href="cJSON_8h.html#a1a175e87536301df98c805ac0636ad7c">b</a>, <span class="keywordtype">bool</span> firstField)</div><div class="line"><a name="l00667"></a><span class="lineno"> 667</span> {</div><div class="line"><a name="l00668"></a><span class="lineno"> 668</span>  a = <a class="code" href="classSVF_1_1DCHGraph.html#a079feacdcc3783f4a9108a3b2d2aed2c">getCanonicalType</a>(a);</div><div class="line"><a name="l00669"></a><span class="lineno"> 669</span>  b = <a class="code" href="classSVF_1_1DCHGraph.html#a079feacdcc3783f4a9108a3b2d2aed2c">getCanonicalType</a>(b);</div><div class="line"><a name="l00670"></a><span class="lineno"> 670</span>  assert(<a class="code" href="classSVF_1_1DCHGraph.html#a58341e23c1dc2b3e7fce190ed16a8a25">hasNode</a>(a) && <a class="code" href="classSVF_1_1DCHGraph.html#a58341e23c1dc2b3e7fce190ed16a8a25">hasNode</a>(b) && <span class="stringliteral">"DCHG: isBase query for non-existent node!"</span>);</div><div class="line"><a name="l00671"></a><span class="lineno"> 671</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1DCHNode.html">DCHNode</a> *bNode = <a class="code" href="classSVF_1_1DCHGraph.html#a96c68bbb5ee5e939158ce0b67da2c61d">getNode</a>(b);</div><div class="line"><a name="l00672"></a><span class="lineno"> 672</span> </div><div class="line"><a name="l00673"></a><span class="lineno"> 673</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1SparseBitVector.html">NodeBS</a> &aChildren = <a class="code" href="classSVF_1_1DCHGraph.html#a0a3dfe1f2757eabd75082e2c4caec47a">cha</a>(a, firstField);</div><div class="line"><a name="l00674"></a><span class="lineno"> 674</span>  <span class="keywordflow">return</span> aChildren.<a class="code" href="classSVF_1_1SparseBitVector.html#a112f2ede1240c95f9fe810f2882fab80">test</a>(bNode-><a class="code" href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">getId</a>());</div><div class="line"><a name="l00675"></a><span class="lineno"> 675</span> }</div><div class="line"><a name="l00676"></a><span class="lineno"> 676</span> </div><div class="line"><a name="l00677"></a><span class="lineno"><a class="line" href="classSVF_1_1DCHGraph.html#af0534356b4a8c68507e1237f1d7a8c11"> 677</a></span> <span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1DCHGraph.html#af0534356b4a8c68507e1237f1d7a8c11">DCHGraph::isFieldOf</a>(<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#ad127b0ad478640ede3d426e3a58d2632">DIType</a> *f, <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#ad127b0ad478640ede3d426e3a58d2632">DIType</a> *<a class="code" href="cJSON_8h.html#a1a175e87536301df98c805ac0636ad7c">b</a>)</div><div class="line"><a name="l00678"></a><span class="lineno"> 678</span> {</div><div class="line"><a name="l00679"></a><span class="lineno"> 679</span>  assert(f && b && <span class="stringliteral">"DCHG::isFieldOf: given nullptr!"</span>);</div><div class="line"><a name="l00680"></a><span class="lineno"> 680</span> </div><div class="line"><a name="l00681"></a><span class="lineno"> 681</span>  f = <a class="code" href="classSVF_1_1DCHGraph.html#a079feacdcc3783f4a9108a3b2d2aed2c">getCanonicalType</a>(f);</div><div class="line"><a name="l00682"></a><span class="lineno"> 682</span>  b = <a class="code" href="classSVF_1_1DCHGraph.html#a079feacdcc3783f4a9108a3b2d2aed2c">getCanonicalType</a>(b);</div><div class="line"><a name="l00683"></a><span class="lineno"> 683</span>  <span class="keywordflow">if</span> (f == b) <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l00684"></a><span class="lineno"> 684</span> </div><div class="line"><a name="l00685"></a><span class="lineno"> 685</span>  <span class="keywordflow">if</span> (b->getTag() == dwarf::DW_TAG_array_type || b->getTag() == dwarf::DW_TAG_pointer_type)</div><div class="line"><a name="l00686"></a><span class="lineno"> 686</span>  {</div><div class="line"><a name="l00687"></a><span class="lineno"> 687</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#ad127b0ad478640ede3d426e3a58d2632">DIType</a> *baseType = <span class="keyword">nullptr</span>;</div><div class="line"><a name="l00688"></a><span class="lineno"> 688</span>  <span class="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#aded9b991c77acc5284ccead0739e84f1">DICompositeType</a> *arrayType = SVFUtil::dyn_cast<DICompositeType>(b))</div><div class="line"><a name="l00689"></a><span class="lineno"> 689</span>  {</div><div class="line"><a name="l00690"></a><span class="lineno"> 690</span>  baseType = arrayType->getBaseType();</div><div class="line"><a name="l00691"></a><span class="lineno"> 691</span>  }</div><div class="line"><a name="l00692"></a><span class="lineno"> 692</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a852e75c562139237fcc754c7461533e6">DIDerivedType</a> *ptrType = SVFUtil::dyn_cast<DIDerivedType>(b))</div><div class="line"><a name="l00693"></a><span class="lineno"> 693</span>  {</div><div class="line"><a name="l00694"></a><span class="lineno"> 694</span>  baseType = ptrType->getBaseType();</div><div class="line"><a name="l00695"></a><span class="lineno"> 695</span>  }</div><div class="line"><a name="l00696"></a><span class="lineno"> 696</span>  assert(baseType && <span class="stringliteral">"DCHG::isFieldOf: baseType is neither DIComposite nor DIDerived!"</span>);</div><div class="line"><a name="l00697"></a><span class="lineno"> 697</span> </div><div class="line"><a name="l00698"></a><span class="lineno"> 698</span>  baseType = <a class="code" href="classSVF_1_1DCHGraph.html#a079feacdcc3783f4a9108a3b2d2aed2c">getCanonicalType</a>(baseType);</div><div class="line"><a name="l00699"></a><span class="lineno"> 699</span>  <span class="keywordflow">return</span> f == baseType || (baseType != <span class="keyword">nullptr</span> && <a class="code" href="classSVF_1_1DCHGraph.html#af0534356b4a8c68507e1237f1d7a8c11">isFieldOf</a>(f, baseType));</div><div class="line"><a name="l00700"></a><span class="lineno"> 700</span>  }</div><div class="line"><a name="l00701"></a><span class="lineno"> 701</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (b->getTag() == dwarf::DW_TAG_class_type</div><div class="line"><a name="l00702"></a><span class="lineno"> 702</span>  || b->getTag() == dwarf::DW_TAG_structure_type)</div><div class="line"><a name="l00703"></a><span class="lineno"> 703</span>  {</div><div class="line"><a name="l00704"></a><span class="lineno"> 704</span>  <span class="keyword">const</span> std::vector<const DIType *> &fields = <a class="code" href="classSVF_1_1DCHGraph.html#ae9a0007299178912e2568dc7158d6824">getFieldTypes</a>(b);</div><div class="line"><a name="l00705"></a><span class="lineno"> 705</span>  <span class="keywordflow">return</span> std::find(fields.begin(), fields.end(), f) != fields.end();</div><div class="line"><a name="l00706"></a><span class="lineno"> 706</span>  }</div><div class="line"><a name="l00707"></a><span class="lineno"> 707</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l00708"></a><span class="lineno"> 708</span>  {</div><div class="line"><a name="l00709"></a><span class="lineno"> 709</span>  <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l00710"></a><span class="lineno"> 710</span>  }</div><div class="line"><a name="l00711"></a><span class="lineno"> 711</span> }</div><div class="line"><a name="l00712"></a><span class="lineno"> 712</span> </div><div class="line"><a name="l00713"></a><span class="lineno"><a class="line" href="classSVF_1_1DCHGraph.html#a079feacdcc3783f4a9108a3b2d2aed2c"> 713</a></span> <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#ad127b0ad478640ede3d426e3a58d2632">DIType</a> *<a class="code" href="classSVF_1_1DCHGraph.html#a079feacdcc3783f4a9108a3b2d2aed2c">DCHGraph::getCanonicalType</a>(<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#ad127b0ad478640ede3d426e3a58d2632">DIType</a> *t)</div><div class="line"><a name="l00714"></a><span class="lineno"> 714</span> {</div><div class="line"><a name="l00715"></a><span class="lineno"> 715</span>  <span class="comment">// We want stripped types to be canonical.</span></div><div class="line"><a name="l00716"></a><span class="lineno"> 716</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#ad127b0ad478640ede3d426e3a58d2632">DIType</a> *unstrippedT = t;</div><div class="line"><a name="l00717"></a><span class="lineno"> 717</span>  t = <a class="code" href="classSVF_1_1DCHGraph.html#a175ed6ad0c9b23d5617f755ab96c76c4">stripQualifiers</a>(t);</div><div class="line"><a name="l00718"></a><span class="lineno"> 718</span> </div><div class="line"><a name="l00719"></a><span class="lineno"> 719</span>  <span class="comment">// Is there a mapping for the unstripped type? Yes - return it.</span></div><div class="line"><a name="l00720"></a><span class="lineno"> 720</span>  <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1DCHGraph.html#a498a18fe8702251b6f2a4e6379e5cbb1">canonicalTypeMap</a>.find(unstrippedT) != <a class="code" href="classSVF_1_1DCHGraph.html#a498a18fe8702251b6f2a4e6379e5cbb1">canonicalTypeMap</a>.end())</div><div class="line"><a name="l00721"></a><span class="lineno"> 721</span>  {</div><div class="line"><a name="l00722"></a><span class="lineno"> 722</span>  <span class="keywordflow">return</span> <a class="code" href="classSVF_1_1DCHGraph.html#a498a18fe8702251b6f2a4e6379e5cbb1">canonicalTypeMap</a>[unstrippedT];</div><div class="line"><a name="l00723"></a><span class="lineno"> 723</span>  }</div><div class="line"><a name="l00724"></a><span class="lineno"> 724</span> </div><div class="line"><a name="l00725"></a><span class="lineno"> 725</span>  <span class="comment">// There is no mapping for unstripped type (^), is there one for the stripped</span></div><div class="line"><a name="l00726"></a><span class="lineno"> 726</span>  <span class="comment">// type? Yes - map the unstripped type to the same thing.</span></div><div class="line"><a name="l00727"></a><span class="lineno"> 727</span>  <span class="keywordflow">if</span> (unstrippedT != t)</div><div class="line"><a name="l00728"></a><span class="lineno"> 728</span>  {</div><div class="line"><a name="l00729"></a><span class="lineno"> 729</span>  <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1DCHGraph.html#a498a18fe8702251b6f2a4e6379e5cbb1">canonicalTypeMap</a>.find(t) != <a class="code" href="classSVF_1_1DCHGraph.html#a498a18fe8702251b6f2a4e6379e5cbb1">canonicalTypeMap</a>.end())</div><div class="line"><a name="l00730"></a><span class="lineno"> 730</span>  {</div><div class="line"><a name="l00731"></a><span class="lineno"> 731</span>  <a class="code" href="classSVF_1_1DCHGraph.html#a498a18fe8702251b6f2a4e6379e5cbb1">canonicalTypeMap</a>[unstrippedT] = <a class="code" href="classSVF_1_1DCHGraph.html#a498a18fe8702251b6f2a4e6379e5cbb1">canonicalTypeMap</a>[t];</div><div class="line"><a name="l00732"></a><span class="lineno"> 732</span>  <span class="keywordflow">return</span> <a class="code" href="classSVF_1_1DCHGraph.html#a498a18fe8702251b6f2a4e6379e5cbb1">canonicalTypeMap</a>[unstrippedT];</div><div class="line"><a name="l00733"></a><span class="lineno"> 733</span>  }</div><div class="line"><a name="l00734"></a><span class="lineno"> 734</span>  }</div><div class="line"><a name="l00735"></a><span class="lineno"> 735</span> </div><div class="line"><a name="l00736"></a><span class="lineno"> 736</span>  <span class="comment">// Canonical type for t is not cached, find one for it.</span></div><div class="line"><a name="l00737"></a><span class="lineno"> 737</span>  <span class="keywordflow">for</span> (<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#ad127b0ad478640ede3d426e3a58d2632">DIType</a> *canonType : <a class="code" href="classSVF_1_1DCHGraph.html#a10225f56b21eb7f0870fdc433de3c393">canonicalTypes</a>)</div><div class="line"><a name="l00738"></a><span class="lineno"> 738</span>  {</div><div class="line"><a name="l00739"></a><span class="lineno"> 739</span>  <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1DCHGraph.html#acb76ab20da1bfbec00f63d08e48cbddd">teq</a>(t, canonType))</div><div class="line"><a name="l00740"></a><span class="lineno"> 740</span>  {</div><div class="line"><a name="l00741"></a><span class="lineno"> 741</span>  <span class="comment">// Found a canonical type.</span></div><div class="line"><a name="l00742"></a><span class="lineno"> 742</span>  <a class="code" href="classSVF_1_1DCHGraph.html#a498a18fe8702251b6f2a4e6379e5cbb1">canonicalTypeMap</a>[t] = canonType;</div><div class="line"><a name="l00743"></a><span class="lineno"> 743</span>  <span class="keywordflow">return</span> <a class="code" href="classSVF_1_1DCHGraph.html#a498a18fe8702251b6f2a4e6379e5cbb1">canonicalTypeMap</a>[t];</div><div class="line"><a name="l00744"></a><span class="lineno"> 744</span>  }</div><div class="line"><a name="l00745"></a><span class="lineno"> 745</span>  }</div><div class="line"><a name="l00746"></a><span class="lineno"> 746</span> </div><div class="line"><a name="l00747"></a><span class="lineno"> 747</span>  <span class="comment">// No canonical type found, so t will be a canonical type.</span></div><div class="line"><a name="l00748"></a><span class="lineno"> 748</span>  canonicalTypes.insert(t);</div><div class="line"><a name="l00749"></a><span class="lineno"> 749</span>  <a class="code" href="classSVF_1_1DCHGraph.html#a498a18fe8702251b6f2a4e6379e5cbb1">canonicalTypeMap</a>.insert({t, t});</div><div class="line"><a name="l00750"></a><span class="lineno"> 750</span> </div><div class="line"><a name="l00751"></a><span class="lineno"> 751</span>  <span class="keywordflow">return</span> <a class="code" href="classSVF_1_1DCHGraph.html#a498a18fe8702251b6f2a4e6379e5cbb1">canonicalTypeMap</a>[t];</div><div class="line"><a name="l00752"></a><span class="lineno"> 752</span> }</div><div class="line"><a name="l00753"></a><span class="lineno"> 753</span> </div><div class="line"><a name="l00754"></a><span class="lineno"><a class="line" href="classSVF_1_1DCHGraph.html#a175ed6ad0c9b23d5617f755ab96c76c4"> 754</a></span> <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#ad127b0ad478640ede3d426e3a58d2632">DIType</a> *<a class="code" href="classSVF_1_1DCHGraph.html#a175ed6ad0c9b23d5617f755ab96c76c4">DCHGraph::stripQualifiers</a>(<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#ad127b0ad478640ede3d426e3a58d2632">DIType</a> *t)</div><div class="line"><a name="l00755"></a><span class="lineno"> 755</span> {</div><div class="line"><a name="l00756"></a><span class="lineno"> 756</span>  <span class="keywordflow">while</span> (<span class="keyword">true</span>)</div><div class="line"><a name="l00757"></a><span class="lineno"> 757</span>  {</div><div class="line"><a name="l00758"></a><span class="lineno"> 758</span>  <span class="comment">// nullptr means void.</span></div><div class="line"><a name="l00759"></a><span class="lineno"> 759</span>  <span class="keywordflow">if</span> (t == <span class="keyword">nullptr</span></div><div class="line"><a name="l00760"></a><span class="lineno"> 760</span>  || SVFUtil::isa<DIBasicType>(t)</div><div class="line"><a name="l00761"></a><span class="lineno"> 761</span>  || SVFUtil::isa<DISubroutineType>(t))</div><div class="line"><a name="l00762"></a><span class="lineno"> 762</span>  {</div><div class="line"><a name="l00763"></a><span class="lineno"> 763</span>  <span class="keywordflow">break</span>;</div><div class="line"><a name="l00764"></a><span class="lineno"> 764</span>  }</div><div class="line"><a name="l00765"></a><span class="lineno"> 765</span> </div><div class="line"><a name="l00766"></a><span class="lineno"> 766</span>  <span class="keywordtype">unsigned</span> tag = t->getTag();</div><div class="line"><a name="l00767"></a><span class="lineno"> 767</span>  <span class="comment">// Verbose for clarity.</span></div><div class="line"><a name="l00768"></a><span class="lineno"> 768</span>  <span class="keywordflow">if</span> ( tag == dwarf::DW_TAG_const_type</div><div class="line"><a name="l00769"></a><span class="lineno"> 769</span>  || tag == dwarf::DW_TAG_atomic_type</div><div class="line"><a name="l00770"></a><span class="lineno"> 770</span>  || tag == dwarf::DW_TAG_volatile_type</div><div class="line"><a name="l00771"></a><span class="lineno"> 771</span>  || tag == dwarf::DW_TAG_restrict_type</div><div class="line"><a name="l00772"></a><span class="lineno"> 772</span>  || tag == dwarf::DW_TAG_typedef)</div><div class="line"><a name="l00773"></a><span class="lineno"> 773</span>  {</div><div class="line"><a name="l00774"></a><span class="lineno"> 774</span>  <span class="comment">// Qualifier - get underlying type.</span></div><div class="line"><a name="l00775"></a><span class="lineno"> 775</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a852e75c562139237fcc754c7461533e6">DIDerivedType</a> *dt = <a class="code" href="namespaceSVF_1_1SVFUtil.html#af6e96694d983643a66c238cce01bff0e">SVFUtil::dyn_cast</a><<a class="code" href="namespaceSVF.html#a852e75c562139237fcc754c7461533e6">DIDerivedType</a>>(t);</div><div class="line"><a name="l00776"></a><span class="lineno"> 776</span>  assert(t && <span class="stringliteral">"DCHG: expected DerivedType"</span>);</div><div class="line"><a name="l00777"></a><span class="lineno"> 777</span>  t = dt->getBaseType();</div><div class="line"><a name="l00778"></a><span class="lineno"> 778</span>  }</div><div class="line"><a name="l00779"></a><span class="lineno"> 779</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> ( tag == dwarf::DW_TAG_array_type</div><div class="line"><a name="l00780"></a><span class="lineno"> 780</span>  || tag == dwarf::DW_TAG_class_type</div><div class="line"><a name="l00781"></a><span class="lineno"> 781</span>  || tag == dwarf::DW_TAG_structure_type</div><div class="line"><a name="l00782"></a><span class="lineno"> 782</span>  || tag == dwarf::DW_TAG_union_type</div><div class="line"><a name="l00783"></a><span class="lineno"> 783</span>  || tag == dwarf::DW_TAG_enumeration_type</div><div class="line"><a name="l00784"></a><span class="lineno"> 784</span>  || tag == dwarf::DW_TAG_member</div><div class="line"><a name="l00785"></a><span class="lineno"> 785</span>  || tag == dwarf::DW_TAG_pointer_type</div><div class="line"><a name="l00786"></a><span class="lineno"> 786</span>  || tag == dwarf::DW_TAG_ptr_to_member_type</div><div class="line"><a name="l00787"></a><span class="lineno"> 787</span>  || tag == dwarf::DW_TAG_reference_type</div><div class="line"><a name="l00788"></a><span class="lineno"> 788</span>  || tag == dwarf::DW_TAG_rvalue_reference_type)</div><div class="line"><a name="l00789"></a><span class="lineno"> 789</span>  {</div><div class="line"><a name="l00790"></a><span class="lineno"> 790</span>  <span class="comment">// Hit a non-qualifier.</span></div><div class="line"><a name="l00791"></a><span class="lineno"> 791</span>  <span class="keywordflow">break</span>;</div><div class="line"><a name="l00792"></a><span class="lineno"> 792</span>  }</div><div class="line"><a name="l00793"></a><span class="lineno"> 793</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> ( tag == dwarf::DW_TAG_inheritance</div><div class="line"><a name="l00794"></a><span class="lineno"> 794</span>  || tag == dwarf::DW_TAG_friend)</div><div class="line"><a name="l00795"></a><span class="lineno"> 795</span>  {</div><div class="line"><a name="l00796"></a><span class="lineno"> 796</span>  assert(<span class="keyword">false</span> && <span class="stringliteral">"DCHG: unexpected tag when stripping qualifiers"</span>);</div><div class="line"><a name="l00797"></a><span class="lineno"> 797</span>  }</div><div class="line"><a name="l00798"></a><span class="lineno"> 798</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l00799"></a><span class="lineno"> 799</span>  {</div><div class="line"><a name="l00800"></a><span class="lineno"> 800</span>  assert(<span class="keyword">false</span> && <span class="stringliteral">"DCHG: unhandled tag when stripping qualifiers"</span>);</div><div class="line"><a name="l00801"></a><span class="lineno"> 801</span>  }</div><div class="line"><a name="l00802"></a><span class="lineno"> 802</span>  }</div><div class="line"><a name="l00803"></a><span class="lineno"> 803</span> </div><div class="line"><a name="l00804"></a><span class="lineno"> 804</span>  <span class="keywordflow">return</span> t;</div><div class="line"><a name="l00805"></a><span class="lineno"> 805</span> }</div><div class="line"><a name="l00806"></a><span class="lineno"> 806</span> </div><div class="line"><a name="l00807"></a><span class="lineno"><a class="line" href="classSVF_1_1DCHGraph.html#a6c276e661e5e63c1c84387f84c8a62e4"> 807</a></span> <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#ad127b0ad478640ede3d426e3a58d2632">DIType</a> *<a class="code" href="classSVF_1_1DCHGraph.html#a6c276e661e5e63c1c84387f84c8a62e4">DCHGraph::stripArray</a>(<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#ad127b0ad478640ede3d426e3a58d2632">DIType</a> *t)</div><div class="line"><a name="l00808"></a><span class="lineno"> 808</span> {</div><div class="line"><a name="l00809"></a><span class="lineno"> 809</span>  t = <a class="code" href="classSVF_1_1DCHGraph.html#a175ed6ad0c9b23d5617f755ab96c76c4">stripQualifiers</a>(t);</div><div class="line"><a name="l00810"></a><span class="lineno"> 810</span>  <span class="keywordflow">if</span> (t->getTag() == dwarf::DW_TAG_array_type)</div><div class="line"><a name="l00811"></a><span class="lineno"> 811</span>  {</div><div class="line"><a name="l00812"></a><span class="lineno"> 812</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#aded9b991c77acc5284ccead0739e84f1">DICompositeType</a> *at = <a class="code" href="namespaceSVF_1_1SVFUtil.html#af6e96694d983643a66c238cce01bff0e">SVFUtil::dyn_cast</a><<a class="code" href="namespaceSVF.html#aded9b991c77acc5284ccead0739e84f1">DICompositeType</a>>(t);</div><div class="line"><a name="l00813"></a><span class="lineno"> 813</span>  <span class="keywordflow">return</span> <a class="code" href="classSVF_1_1DCHGraph.html#a6c276e661e5e63c1c84387f84c8a62e4">stripArray</a>(at->getBaseType());</div><div class="line"><a name="l00814"></a><span class="lineno"> 814</span>  }</div><div class="line"><a name="l00815"></a><span class="lineno"> 815</span> </div><div class="line"><a name="l00816"></a><span class="lineno"> 816</span>  <span class="keywordflow">return</span> t;</div><div class="line"><a name="l00817"></a><span class="lineno"> 817</span> }</div><div class="line"><a name="l00818"></a><span class="lineno"> 818</span> </div><div class="line"><a name="l00819"></a><span class="lineno"><a class="line" href="classSVF_1_1DCHGraph.html#acb76ab20da1bfbec00f63d08e48cbddd"> 819</a></span> <span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1DCHGraph.html#acb76ab20da1bfbec00f63d08e48cbddd">DCHGraph::teq</a>(<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#ad127b0ad478640ede3d426e3a58d2632">DIType</a> *t1, <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#ad127b0ad478640ede3d426e3a58d2632">DIType</a> *t2)</div><div class="line"><a name="l00820"></a><span class="lineno"> 820</span> {</div><div class="line"><a name="l00821"></a><span class="lineno"> 821</span>  t1 = <a class="code" href="classSVF_1_1DCHGraph.html#a175ed6ad0c9b23d5617f755ab96c76c4">stripQualifiers</a>(t1);</div><div class="line"><a name="l00822"></a><span class="lineno"> 822</span>  t2 = <a class="code" href="classSVF_1_1DCHGraph.html#a175ed6ad0c9b23d5617f755ab96c76c4">stripQualifiers</a>(t2);</div><div class="line"><a name="l00823"></a><span class="lineno"> 823</span> </div><div class="line"><a name="l00824"></a><span class="lineno"> 824</span>  <span class="keywordflow">if</span> (t1 == t2)</div><div class="line"><a name="l00825"></a><span class="lineno"> 825</span>  {</div><div class="line"><a name="l00826"></a><span class="lineno"> 826</span>  <span class="comment">// Trivial case. Handles SubRoutineTypes too.</span></div><div class="line"><a name="l00827"></a><span class="lineno"> 827</span>  <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l00828"></a><span class="lineno"> 828</span>  }</div><div class="line"><a name="l00829"></a><span class="lineno"> 829</span> </div><div class="line"><a name="l00830"></a><span class="lineno"> 830</span>  <span class="keywordflow">if</span> (t1 == <span class="keyword">nullptr</span> || t2 == <span class="keyword">nullptr</span>)</div><div class="line"><a name="l00831"></a><span class="lineno"> 831</span>  {</div><div class="line"><a name="l00832"></a><span class="lineno"> 832</span>  <span class="comment">// Since t1 != t2 and one of them is null, it is</span></div><div class="line"><a name="l00833"></a><span class="lineno"> 833</span>  <span class="comment">// impossible for them to be equal.</span></div><div class="line"><a name="l00834"></a><span class="lineno"> 834</span>  <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l00835"></a><span class="lineno"> 835</span>  }</div><div class="line"><a name="l00836"></a><span class="lineno"> 836</span> </div><div class="line"><a name="l00837"></a><span class="lineno"> 837</span>  <span class="comment">// Check if we need base type comparisons.</span></div><div class="line"><a name="l00838"></a><span class="lineno"> 838</span>  <span class="keywordflow">if</span> (SVFUtil::isa<DIBasicType>(t1) && SVFUtil::isa<DIBasicType>(t2))</div><div class="line"><a name="l00839"></a><span class="lineno"> 839</span>  {</div><div class="line"><a name="l00840"></a><span class="lineno"> 840</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#ada0513be7e25325325ccc9183aeca278">DIBasicType</a> *b1 = <a class="code" href="namespaceSVF_1_1SVFUtil.html#af6e96694d983643a66c238cce01bff0e">SVFUtil::dyn_cast</a><<a class="code" href="namespaceSVF.html#ada0513be7e25325325ccc9183aeca278">DIBasicType</a>>(t1);</div><div class="line"><a name="l00841"></a><span class="lineno"> 841</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#ada0513be7e25325325ccc9183aeca278">DIBasicType</a> *b2 = <a class="code" href="namespaceSVF_1_1SVFUtil.html#af6e96694d983643a66c238cce01bff0e">SVFUtil::dyn_cast</a><<a class="code" href="namespaceSVF.html#ada0513be7e25325325ccc9183aeca278">DIBasicType</a>>(t2);</div><div class="line"><a name="l00842"></a><span class="lineno"> 842</span> </div><div class="line"><a name="l00843"></a><span class="lineno"> 843</span>  <span class="keywordtype">unsigned</span> enc1 = b1->getEncoding();</div><div class="line"><a name="l00844"></a><span class="lineno"> 844</span>  <span class="keywordtype">unsigned</span> enc2 = b2->getEncoding();</div><div class="line"><a name="l00845"></a><span class="lineno"> 845</span>  <span class="keywordtype">bool</span> okayEnc = ((enc1 == dwarf::DW_ATE_signed || enc1 == dwarf::DW_ATE_unsigned || enc1 == dwarf::DW_ATE_boolean)</div><div class="line"><a name="l00846"></a><span class="lineno"> 846</span>  && (enc2 == dwarf::DW_ATE_signed || enc2 == dwarf::DW_ATE_unsigned || enc2 == dwarf::DW_ATE_boolean))</div><div class="line"><a name="l00847"></a><span class="lineno"> 847</span>  ||</div><div class="line"><a name="l00848"></a><span class="lineno"> 848</span>  (enc1 == dwarf::DW_ATE_float && enc2 == dwarf::DW_ATE_float)</div><div class="line"><a name="l00849"></a><span class="lineno"> 849</span>  ||</div><div class="line"><a name="l00850"></a><span class="lineno"> 850</span>  ((enc1 == dwarf::DW_ATE_signed_char || enc1 == dwarf::DW_ATE_unsigned_char)</div><div class="line"><a name="l00851"></a><span class="lineno"> 851</span>  &&</div><div class="line"><a name="l00852"></a><span class="lineno"> 852</span>  (enc2 == dwarf::DW_ATE_signed_char || enc2 == dwarf::DW_ATE_unsigned_char));</div><div class="line"><a name="l00853"></a><span class="lineno"> 853</span> </div><div class="line"><a name="l00854"></a><span class="lineno"> 854</span>  <span class="keywordflow">if</span> (!okayEnc) <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l00855"></a><span class="lineno"> 855</span>  <span class="comment">// Now we have split integers, floats, and chars, ignoring signedness.</span></div><div class="line"><a name="l00856"></a><span class="lineno"> 856</span> </div><div class="line"><a name="l00857"></a><span class="lineno"> 857</span>  <span class="keywordflow">return</span> t1->getSizeInBits() == t2->getSizeInBits()</div><div class="line"><a name="l00858"></a><span class="lineno"> 858</span>  && t1->getAlignInBits() == t2->getAlignInBits();</div><div class="line"><a name="l00859"></a><span class="lineno"> 859</span>  }</div><div class="line"><a name="l00860"></a><span class="lineno"> 860</span> </div><div class="line"><a name="l00861"></a><span class="lineno"> 861</span>  <span class="comment">// Check, do we need to compare base types?</span></div><div class="line"><a name="l00862"></a><span class="lineno"> 862</span>  <span class="comment">// This makes pointers, references, and arrays equivalent.</span></div><div class="line"><a name="l00863"></a><span class="lineno"> 863</span>  <span class="comment">// Will handle member types.</span></div><div class="line"><a name="l00864"></a><span class="lineno"> 864</span>  <span class="keywordflow">if</span> ((SVFUtil::isa<DIDerivedType>(t1) || t1->getTag() == dwarf::DW_TAG_array_type)</div><div class="line"><a name="l00865"></a><span class="lineno"> 865</span>  && (SVFUtil::isa<DIDerivedType>(t2) || t2->getTag() == dwarf::DW_TAG_array_type))</div><div class="line"><a name="l00866"></a><span class="lineno"> 866</span>  {</div><div class="line"><a name="l00867"></a><span class="lineno"> 867</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#ad127b0ad478640ede3d426e3a58d2632">DIType</a> *base1, *base2;</div><div class="line"><a name="l00868"></a><span class="lineno"> 868</span> </div><div class="line"><a name="l00869"></a><span class="lineno"> 869</span>  <span class="comment">// Set base1.</span></div><div class="line"><a name="l00870"></a><span class="lineno"> 870</span>  <span class="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a852e75c562139237fcc754c7461533e6">DIDerivedType</a> *d1 = SVFUtil::dyn_cast<DIDerivedType>(t1))</div><div class="line"><a name="l00871"></a><span class="lineno"> 871</span>  {</div><div class="line"><a name="l00872"></a><span class="lineno"> 872</span>  base1 = d1->getBaseType();</div><div class="line"><a name="l00873"></a><span class="lineno"> 873</span>  }</div><div class="line"><a name="l00874"></a><span class="lineno"> 874</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l00875"></a><span class="lineno"> 875</span>  {</div><div class="line"><a name="l00876"></a><span class="lineno"> 876</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#aded9b991c77acc5284ccead0739e84f1">DICompositeType</a> *c1 = <a class="code" href="namespaceSVF_1_1SVFUtil.html#af6e96694d983643a66c238cce01bff0e">SVFUtil::dyn_cast</a><<a class="code" href="namespaceSVF.html#aded9b991c77acc5284ccead0739e84f1">DICompositeType</a>>(t1);</div><div class="line"><a name="l00877"></a><span class="lineno"> 877</span>  assert(c1 && <span class="stringliteral">"teq: bad cast for array type"</span>);</div><div class="line"><a name="l00878"></a><span class="lineno"> 878</span>  base1 = c1->getBaseType();</div><div class="line"><a name="l00879"></a><span class="lineno"> 879</span>  }</div><div class="line"><a name="l00880"></a><span class="lineno"> 880</span> </div><div class="line"><a name="l00881"></a><span class="lineno"> 881</span>  <span class="comment">// Set base2.</span></div><div class="line"><a name="l00882"></a><span class="lineno"> 882</span>  <span class="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a852e75c562139237fcc754c7461533e6">DIDerivedType</a> *d2 = SVFUtil::dyn_cast<DIDerivedType>(t2))</div><div class="line"><a name="l00883"></a><span class="lineno"> 883</span>  {</div><div class="line"><a name="l00884"></a><span class="lineno"> 884</span>  base2 = d2->getBaseType();</div><div class="line"><a name="l00885"></a><span class="lineno"> 885</span>  }</div><div class="line"><a name="l00886"></a><span class="lineno"> 886</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l00887"></a><span class="lineno"> 887</span>  {</div><div class="line"><a name="l00888"></a><span class="lineno"> 888</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#aded9b991c77acc5284ccead0739e84f1">DICompositeType</a> *c2 = <a class="code" href="namespaceSVF_1_1SVFUtil.html#af6e96694d983643a66c238cce01bff0e">SVFUtil::dyn_cast</a><<a class="code" href="namespaceSVF.html#aded9b991c77acc5284ccead0739e84f1">DICompositeType</a>>(t2);</div><div class="line"><a name="l00889"></a><span class="lineno"> 889</span>  assert(c2 && <span class="stringliteral">"teq: bad cast for array type"</span>);</div><div class="line"><a name="l00890"></a><span class="lineno"> 890</span>  base2 = c2->getBaseType();</div><div class="line"><a name="l00891"></a><span class="lineno"> 891</span>  }</div><div class="line"><a name="l00892"></a><span class="lineno"> 892</span> </div><div class="line"><a name="l00893"></a><span class="lineno"> 893</span>  <span class="comment">// For ptr-to-member, there is some imprecision (but soundness) in</span></div><div class="line"><a name="l00894"></a><span class="lineno"> 894</span>  <span class="comment">// that we don't check the class type.</span></div><div class="line"><a name="l00895"></a><span class="lineno"> 895</span>  <span class="keywordflow">return</span> <a class="code" href="classSVF_1_1DCHGraph.html#acb76ab20da1bfbec00f63d08e48cbddd">teq</a>(base1, base2);</div><div class="line"><a name="l00896"></a><span class="lineno"> 896</span>  }</div><div class="line"><a name="l00897"></a><span class="lineno"> 897</span> </div><div class="line"><a name="l00898"></a><span class="lineno"> 898</span>  <span class="keywordflow">if</span> (SVFUtil::isa<DICompositeType>(t1) && SVFUtil::isa<DICompositeType>(t2))</div><div class="line"><a name="l00899"></a><span class="lineno"> 899</span>  {</div><div class="line"><a name="l00900"></a><span class="lineno"> 900</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#aded9b991c77acc5284ccead0739e84f1">DICompositeType</a> *ct1 = <a class="code" href="namespaceSVF_1_1SVFUtil.html#af6e96694d983643a66c238cce01bff0e">SVFUtil::dyn_cast</a><<a class="code" href="namespaceSVF.html#aded9b991c77acc5284ccead0739e84f1">DICompositeType</a>>(t1);</div><div class="line"><a name="l00901"></a><span class="lineno"> 901</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#aded9b991c77acc5284ccead0739e84f1">DICompositeType</a> *ct2 = <a class="code" href="namespaceSVF_1_1SVFUtil.html#af6e96694d983643a66c238cce01bff0e">SVFUtil::dyn_cast</a><<a class="code" href="namespaceSVF.html#aded9b991c77acc5284ccead0739e84f1">DICompositeType</a>>(t2);</div><div class="line"><a name="l00902"></a><span class="lineno"> 902</span> </div><div class="line"><a name="l00903"></a><span class="lineno"> 903</span>  <span class="keywordflow">if</span> (ct1->getTag() != ct2->getTag()) <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l00904"></a><span class="lineno"> 904</span> </div><div class="line"><a name="l00905"></a><span class="lineno"> 905</span>  <span class="comment">// Treat all enums the same.</span></div><div class="line"><a name="l00906"></a><span class="lineno"> 906</span>  <span class="keywordflow">if</span> (ct1->getTag() == dwarf::DW_TAG_enumeration_type)</div><div class="line"><a name="l00907"></a><span class="lineno"> 907</span>  {</div><div class="line"><a name="l00908"></a><span class="lineno"> 908</span>  <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l00909"></a><span class="lineno"> 909</span>  }</div><div class="line"><a name="l00910"></a><span class="lineno"> 910</span> </div><div class="line"><a name="l00911"></a><span class="lineno"> 911</span>  <span class="comment">// C++ classes? Check mangled name.</span></div><div class="line"><a name="l00912"></a><span class="lineno"> 912</span>  <span class="keywordflow">if</span> (ct1->getTag() == dwarf::DW_TAG_class_type)</div><div class="line"><a name="l00913"></a><span class="lineno"> 913</span>  {</div><div class="line"><a name="l00914"></a><span class="lineno"> 914</span>  <span class="keywordflow">return</span> ct1->getIdentifier() == ct2->getIdentifier();</div><div class="line"><a name="l00915"></a><span class="lineno"> 915</span>  }</div><div class="line"><a name="l00916"></a><span class="lineno"> 916</span> </div><div class="line"><a name="l00917"></a><span class="lineno"> 917</span>  <span class="comment">// Either union or struct, simply test all fields are equal.</span></div><div class="line"><a name="l00918"></a><span class="lineno"> 918</span>  <span class="comment">// Seems like it is enough to check it was defined in the same place.</span></div><div class="line"><a name="l00919"></a><span class="lineno"> 919</span>  <span class="comment">// The elements sometimes differ but are referring to the same fields.</span></div><div class="line"><a name="l00920"></a><span class="lineno"> 920</span>  <span class="keywordflow">return</span> ct1->getName() == ct2->getName()</div><div class="line"><a name="l00921"></a><span class="lineno"> 921</span>  && ct1->getFile() == ct2->getFile()</div><div class="line"><a name="l00922"></a><span class="lineno"> 922</span>  && ct1->getLine() == ct2->getLine();</div><div class="line"><a name="l00923"></a><span class="lineno"> 923</span>  }</div><div class="line"><a name="l00924"></a><span class="lineno"> 924</span> </div><div class="line"><a name="l00925"></a><span class="lineno"> 925</span>  <span class="comment">// They were not equal base types (discounting signedness), nor were they</span></div><div class="line"><a name="l00926"></a><span class="lineno"> 926</span>  <span class="comment">// "equal" pointers/references/arrays, nor were they the structurally equivalent,</span></div><div class="line"><a name="l00927"></a><span class="lineno"> 927</span>  <span class="comment">// nor were they completely equal.</span></div><div class="line"><a name="l00928"></a><span class="lineno"> 928</span>  <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l00929"></a><span class="lineno"> 929</span> }</div><div class="line"><a name="l00930"></a><span class="lineno"> 930</span> </div><div class="line"><a name="l00931"></a><span class="lineno"><a class="line" href="classSVF_1_1DCHGraph.html#a2b2dbc52089696854a8339f2e83fc333"> 931</a></span> <span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1DCHGraph.html#a2b2dbc52089696854a8339f2e83fc333">DCHGraph::isFirstField</a>(<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#ad127b0ad478640ede3d426e3a58d2632">DIType</a> *f, <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#ad127b0ad478640ede3d426e3a58d2632">DIType</a> *<a class="code" href="cJSON_8h.html#a1a175e87536301df98c805ac0636ad7c">b</a>)</div><div class="line"><a name="l00932"></a><span class="lineno"> 932</span> {</div><div class="line"><a name="l00933"></a><span class="lineno"> 933</span>  <span class="comment">// TODO: some improvements.</span></div><div class="line"><a name="l00934"></a><span class="lineno"> 934</span>  <span class="comment">// - cha should be changed to accept which edge types to use,</span></div><div class="line"><a name="l00935"></a><span class="lineno"> 935</span>  <span class="comment">// then we can call cha(..., DCHEdge::FIRST_FIELD).</span></div><div class="line"><a name="l00936"></a><span class="lineno"> 936</span>  <span class="comment">// - If not ^, this could benefit from caching.</span></div><div class="line"><a name="l00937"></a><span class="lineno"> 937</span>  f = <a class="code" href="classSVF_1_1DCHGraph.html#a079feacdcc3783f4a9108a3b2d2aed2c">getCanonicalType</a>(f);</div><div class="line"><a name="l00938"></a><span class="lineno"> 938</span>  b = <a class="code" href="classSVF_1_1DCHGraph.html#a079feacdcc3783f4a9108a3b2d2aed2c">getCanonicalType</a>(b);</div><div class="line"><a name="l00939"></a><span class="lineno"> 939</span> </div><div class="line"><a name="l00940"></a><span class="lineno"> 940</span>  <span class="keywordflow">if</span> (f == b) <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l00941"></a><span class="lineno"> 941</span> </div><div class="line"><a name="l00942"></a><span class="lineno"> 942</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1DCHNode.html">DCHNode</a> *node = <a class="code" href="classSVF_1_1DCHGraph.html#a96c68bbb5ee5e939158ce0b67da2c61d">getNode</a>(f);</div><div class="line"><a name="l00943"></a><span class="lineno"> 943</span>  assert(node && <span class="stringliteral">"DCHG::isFirstField: node not found"</span>);</div><div class="line"><a name="l00944"></a><span class="lineno"> 944</span>  <span class="comment">// Consider oneself a child, otherwise the recursion will just come up with nothing.</span></div><div class="line"><a name="l00945"></a><span class="lineno"> 945</span>  <span class="keywordflow">for</span> (<span class="keyword">const</span> <a class="code" href="classSVF_1_1DCHEdge.html">DCHEdge</a> *edge : node-><a class="code" href="classSVF_1_1GenericNode.html#afc8b5f86d7795b6a0dfc0687d942d79b">getInEdges</a>())</div><div class="line"><a name="l00946"></a><span class="lineno"> 946</span>  {</div><div class="line"><a name="l00947"></a><span class="lineno"> 947</span>  <span class="comment">// Only care about first-field edges.</span></div><div class="line"><a name="l00948"></a><span class="lineno"> 948</span>  <span class="keywordflow">if</span> (edge->getEdgeKind() == <a class="code" href="classSVF_1_1DCHEdge.html#a48f01c4a02c4e278a1ab70b16efdef4ba3b49b95b713f585b717810dce5ac6564">DCHEdge::FIRST_FIELD</a>)</div><div class="line"><a name="l00949"></a><span class="lineno"> 949</span>  {</div><div class="line"><a name="l00950"></a><span class="lineno"> 950</span>  <span class="keywordflow">if</span> (edge->getSrcNode()->getType() == <a class="code" href="cJSON_8h.html#a1a175e87536301df98c805ac0636ad7c">b</a>) <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l00951"></a><span class="lineno"> 951</span>  <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1DCHGraph.html#a2b2dbc52089696854a8339f2e83fc333">isFirstField</a>(edge->getSrcNode()->getType(), <a class="code" href="cJSON_8h.html#a1a175e87536301df98c805ac0636ad7c">b</a>)) <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l00952"></a><span class="lineno"> 952</span>  }</div><div class="line"><a name="l00953"></a><span class="lineno"> 953</span>  }</div><div class="line"><a name="l00954"></a><span class="lineno"> 954</span> </div><div class="line"><a name="l00955"></a><span class="lineno"> 955</span>  <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l00956"></a><span class="lineno"> 956</span> }</div><div class="line"><a name="l00957"></a><span class="lineno"> 957</span> </div><div class="line"><a name="l00958"></a><span class="lineno"><a class="line" href="classSVF_1_1DCHGraph.html#a2dc488345cc3a5f37079952f638d8c2b"> 958</a></span> <a class="code" href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">std::string</a> <a class="code" href="classSVF_1_1DCHGraph.html#a2dc488345cc3a5f37079952f638d8c2b">DCHGraph::diTypeToStr</a>(<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#ad127b0ad478640ede3d426e3a58d2632">DIType</a> *t)</div><div class="line"><a name="l00959"></a><span class="lineno"> 959</span> {</div><div class="line"><a name="l00960"></a><span class="lineno"> 960</span>  std::stringstream ss;</div><div class="line"><a name="l00961"></a><span class="lineno"> 961</span> </div><div class="line"><a name="l00962"></a><span class="lineno"> 962</span>  <span class="keywordflow">if</span> (t == <span class="keyword">nullptr</span>)</div><div class="line"><a name="l00963"></a><span class="lineno"> 963</span>  {</div><div class="line"><a name="l00964"></a><span class="lineno"> 964</span>  <span class="keywordflow">return</span> <span class="stringliteral">"void"</span>;</div><div class="line"><a name="l00965"></a><span class="lineno"> 965</span>  }</div><div class="line"><a name="l00966"></a><span class="lineno"> 966</span> </div><div class="line"><a name="l00967"></a><span class="lineno"> 967</span>  <span class="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#ada0513be7e25325325ccc9183aeca278">DIBasicType</a> *bt = SVFUtil::dyn_cast<DIBasicType>(t))</div><div class="line"><a name="l00968"></a><span class="lineno"> 968</span>  {</div><div class="line"><a name="l00969"></a><span class="lineno"> 969</span>  ss << bt->getName().str();</div><div class="line"><a name="l00970"></a><span class="lineno"> 970</span>  }</div><div class="line"><a name="l00971"></a><span class="lineno"> 971</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a852e75c562139237fcc754c7461533e6">DIDerivedType</a> *dt = SVFUtil::dyn_cast<DIDerivedType>(t))</div><div class="line"><a name="l00972"></a><span class="lineno"> 972</span>  {</div><div class="line"><a name="l00973"></a><span class="lineno"> 973</span>  <span class="keywordflow">if</span> (dt->getName() == <span class="stringliteral">"__vtbl_ptr_type"</span>)</div><div class="line"><a name="l00974"></a><span class="lineno"> 974</span>  {</div><div class="line"><a name="l00975"></a><span class="lineno"> 975</span>  ss << <span class="stringliteral">"(vtbl * =) __vtbl_ptr_type"</span>;</div><div class="line"><a name="l00976"></a><span class="lineno"> 976</span>  }</div><div class="line"><a name="l00977"></a><span class="lineno"> 977</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (dt->getTag() == dwarf::DW_TAG_const_type)</div><div class="line"><a name="l00978"></a><span class="lineno"> 978</span>  {</div><div class="line"><a name="l00979"></a><span class="lineno"> 979</span>  ss << <span class="stringliteral">"const "</span> << <a class="code" href="classSVF_1_1DCHGraph.html#a2dc488345cc3a5f37079952f638d8c2b">diTypeToStr</a>(dt->getBaseType());</div><div class="line"><a name="l00980"></a><span class="lineno"> 980</span>  }</div><div class="line"><a name="l00981"></a><span class="lineno"> 981</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (dt->getTag() == dwarf::DW_TAG_volatile_type)</div><div class="line"><a name="l00982"></a><span class="lineno"> 982</span>  {</div><div class="line"><a name="l00983"></a><span class="lineno"> 983</span>  ss << <span class="stringliteral">"volatile "</span> << <a class="code" href="classSVF_1_1DCHGraph.html#a2dc488345cc3a5f37079952f638d8c2b">diTypeToStr</a>(dt->getBaseType());</div><div class="line"><a name="l00984"></a><span class="lineno"> 984</span>  }</div><div class="line"><a name="l00985"></a><span class="lineno"> 985</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (dt->getTag() == dwarf::DW_TAG_restrict_type)</div><div class="line"><a name="l00986"></a><span class="lineno"> 986</span>  {</div><div class="line"><a name="l00987"></a><span class="lineno"> 987</span>  ss << <span class="stringliteral">"restrict "</span> << <a class="code" href="classSVF_1_1DCHGraph.html#a2dc488345cc3a5f37079952f638d8c2b">diTypeToStr</a>(dt->getBaseType());</div><div class="line"><a name="l00988"></a><span class="lineno"> 988</span>  }</div><div class="line"><a name="l00989"></a><span class="lineno"> 989</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (dt->getTag() == dwarf::DW_TAG_atomic_type)</div><div class="line"><a name="l00990"></a><span class="lineno"> 990</span>  {</div><div class="line"><a name="l00991"></a><span class="lineno"> 991</span>  ss << <span class="stringliteral">"atomic "</span> << <a class="code" href="classSVF_1_1DCHGraph.html#a2dc488345cc3a5f37079952f638d8c2b">diTypeToStr</a>(dt->getBaseType());</div><div class="line"><a name="l00992"></a><span class="lineno"> 992</span>  }</div><div class="line"><a name="l00993"></a><span class="lineno"> 993</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (dt->getTag() == dwarf::DW_TAG_pointer_type)</div><div class="line"><a name="l00994"></a><span class="lineno"> 994</span>  {</div><div class="line"><a name="l00995"></a><span class="lineno"> 995</span>  ss << <a class="code" href="classSVF_1_1DCHGraph.html#a2dc488345cc3a5f37079952f638d8c2b">diTypeToStr</a>(dt->getBaseType()) << <span class="stringliteral">" *"</span>;</div><div class="line"><a name="l00996"></a><span class="lineno"> 996</span>  }</div><div class="line"><a name="l00997"></a><span class="lineno"> 997</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (dt->getTag() == dwarf::DW_TAG_ptr_to_member_type)</div><div class="line"><a name="l00998"></a><span class="lineno"> 998</span>  {</div><div class="line"><a name="l00999"></a><span class="lineno"> 999</span>  ss << <a class="code" href="classSVF_1_1DCHGraph.html#a2dc488345cc3a5f37079952f638d8c2b">diTypeToStr</a>(dt->getBaseType())</div><div class="line"><a name="l01000"></a><span class="lineno"> 1000</span>  << <span class="stringliteral">" "</span> << <a class="code" href="classSVF_1_1DCHGraph.html#a2dc488345cc3a5f37079952f638d8c2b">diTypeToStr</a>(SVFUtil::dyn_cast<DIType>(dt->getExtraData())) << <span class="stringliteral">"::*"</span>;</div><div class="line"><a name="l01001"></a><span class="lineno"> 1001</span>  }</div><div class="line"><a name="l01002"></a><span class="lineno"> 1002</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (dt->getTag() == dwarf::DW_TAG_reference_type)</div><div class="line"><a name="l01003"></a><span class="lineno"> 1003</span>  {</div><div class="line"><a name="l01004"></a><span class="lineno"> 1004</span>  ss << <a class="code" href="classSVF_1_1DCHGraph.html#a2dc488345cc3a5f37079952f638d8c2b">diTypeToStr</a>(dt->getBaseType()) << <span class="stringliteral">" &"</span>;</div><div class="line"><a name="l01005"></a><span class="lineno"> 1005</span>  }</div><div class="line"><a name="l01006"></a><span class="lineno"> 1006</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (dt->getTag() == dwarf::DW_TAG_rvalue_reference_type)</div><div class="line"><a name="l01007"></a><span class="lineno"> 1007</span>  {</div><div class="line"><a name="l01008"></a><span class="lineno"> 1008</span>  ss << <a class="code" href="classSVF_1_1DCHGraph.html#a2dc488345cc3a5f37079952f638d8c2b">diTypeToStr</a>(dt->getBaseType()) << <span class="stringliteral">" &&"</span>;</div><div class="line"><a name="l01009"></a><span class="lineno"> 1009</span>  }</div><div class="line"><a name="l01010"></a><span class="lineno"> 1010</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (dt->getTag() == dwarf::DW_TAG_typedef)</div><div class="line"><a name="l01011"></a><span class="lineno"> 1011</span>  {</div><div class="line"><a name="l01012"></a><span class="lineno"> 1012</span>  ss << dt->getName().str() << <span class="stringliteral">"->"</span> << <a class="code" href="classSVF_1_1DCHGraph.html#a2dc488345cc3a5f37079952f638d8c2b">diTypeToStr</a>(dt->getBaseType());</div><div class="line"><a name="l01013"></a><span class="lineno"> 1013</span>  }</div><div class="line"><a name="l01014"></a><span class="lineno"> 1014</span>  }</div><div class="line"><a name="l01015"></a><span class="lineno"> 1015</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#aded9b991c77acc5284ccead0739e84f1">DICompositeType</a> *ct = SVFUtil::dyn_cast<DICompositeType>(t))</div><div class="line"><a name="l01016"></a><span class="lineno"> 1016</span>  {</div><div class="line"><a name="l01017"></a><span class="lineno"> 1017</span>  <span class="keywordflow">if</span> (ct->getTag() == dwarf::DW_TAG_class_type</div><div class="line"><a name="l01018"></a><span class="lineno"> 1018</span>  || ct->getTag() == dwarf::DW_TAG_structure_type</div><div class="line"><a name="l01019"></a><span class="lineno"> 1019</span>  || ct->getTag() == dwarf::DW_TAG_union_type)</div><div class="line"><a name="l01020"></a><span class="lineno"> 1020</span>  {</div><div class="line"><a name="l01021"></a><span class="lineno"> 1021</span> </div><div class="line"><a name="l01022"></a><span class="lineno"> 1022</span>  <span class="keywordflow">if</span> (ct->getTag() == dwarf::DW_TAG_class_type)</div><div class="line"><a name="l01023"></a><span class="lineno"> 1023</span>  {</div><div class="line"><a name="l01024"></a><span class="lineno"> 1024</span>  ss << <span class="stringliteral">"class"</span>;</div><div class="line"><a name="l01025"></a><span class="lineno"> 1025</span>  }</div><div class="line"><a name="l01026"></a><span class="lineno"> 1026</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (ct->getTag() == dwarf::DW_TAG_structure_type)</div><div class="line"><a name="l01027"></a><span class="lineno"> 1027</span>  {</div><div class="line"><a name="l01028"></a><span class="lineno"> 1028</span>  ss << <span class="stringliteral">"struct"</span>;</div><div class="line"><a name="l01029"></a><span class="lineno"> 1029</span>  }</div><div class="line"><a name="l01030"></a><span class="lineno"> 1030</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (ct->getTag() == dwarf::DW_TAG_union_type)</div><div class="line"><a name="l01031"></a><span class="lineno"> 1031</span>  {</div><div class="line"><a name="l01032"></a><span class="lineno"> 1032</span>  ss << <span class="stringliteral">"union"</span>;</div><div class="line"><a name="l01033"></a><span class="lineno"> 1033</span>  }</div><div class="line"><a name="l01034"></a><span class="lineno"> 1034</span> </div><div class="line"><a name="l01035"></a><span class="lineno"> 1035</span>  ss << <span class="stringliteral">"."</span>;</div><div class="line"><a name="l01036"></a><span class="lineno"> 1036</span> </div><div class="line"><a name="l01037"></a><span class="lineno"> 1037</span>  <span class="keywordflow">if</span> (ct->getName() != <span class="stringliteral">""</span>)</div><div class="line"><a name="l01038"></a><span class="lineno"> 1038</span>  {</div><div class="line"><a name="l01039"></a><span class="lineno"> 1039</span>  ss << ct->getName().str();</div><div class="line"><a name="l01040"></a><span class="lineno"> 1040</span>  }</div><div class="line"><a name="l01041"></a><span class="lineno"> 1041</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l01042"></a><span class="lineno"> 1042</span>  {</div><div class="line"><a name="l01043"></a><span class="lineno"> 1043</span>  <span class="comment">// Iterate over the element types.</span></div><div class="line"><a name="l01044"></a><span class="lineno"> 1044</span>  ss << <span class="stringliteral">"{ "</span>;</div><div class="line"><a name="l01045"></a><span class="lineno"> 1045</span> </div><div class="line"><a name="l01046"></a><span class="lineno"> 1046</span>  <a class="code" href="namespaceSVF.html#a0f825e73d115173b05ca54fb8ec65003">DINodeArray</a> fields = ct->getElements();</div><div class="line"><a name="l01047"></a><span class="lineno"> 1047</span>  <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> i = 0; i < fields.size(); ++i)</div><div class="line"><a name="l01048"></a><span class="lineno"> 1048</span>  {</div><div class="line"><a name="l01049"></a><span class="lineno"> 1049</span>  <span class="comment">// fields[i] gives a type which is DW_TAG_member, we want the member's type (getBaseType).</span></div><div class="line"><a name="l01050"></a><span class="lineno"> 1050</span>  <span class="comment">// It can also give a Subprogram type if the class just had non-virtual functions.</span></div><div class="line"><a name="l01051"></a><span class="lineno"> 1051</span>  <span class="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a89c7208bfc0b57873dfa574f52050295">DISubprogram</a> *sp = SVFUtil::dyn_cast<DISubprogram>(fields[i]))</div><div class="line"><a name="l01052"></a><span class="lineno"> 1052</span>  {</div><div class="line"><a name="l01053"></a><span class="lineno"> 1053</span>  ss << sp->getName().str();</div><div class="line"><a name="l01054"></a><span class="lineno"> 1054</span>  }</div><div class="line"><a name="l01055"></a><span class="lineno"> 1055</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a852e75c562139237fcc754c7461533e6">DIDerivedType</a> *mt = SVFUtil::dyn_cast<DIDerivedType>(fields[i]))</div><div class="line"><a name="l01056"></a><span class="lineno"> 1056</span>  {</div><div class="line"><a name="l01057"></a><span class="lineno"> 1057</span>  assert(mt->getTag() == dwarf::DW_TAG_member && <span class="stringliteral">"DCHG: expected member"</span>);</div><div class="line"><a name="l01058"></a><span class="lineno"> 1058</span>  ss << <a class="code" href="classSVF_1_1DCHGraph.html#a2dc488345cc3a5f37079952f638d8c2b">diTypeToStr</a>(mt->getBaseType());</div><div class="line"><a name="l01059"></a><span class="lineno"> 1059</span>  }</div><div class="line"><a name="l01060"></a><span class="lineno"> 1060</span> </div><div class="line"><a name="l01061"></a><span class="lineno"> 1061</span>  <span class="keywordflow">if</span> (i != fields.size() - 1)</div><div class="line"><a name="l01062"></a><span class="lineno"> 1062</span>  {</div><div class="line"><a name="l01063"></a><span class="lineno"> 1063</span>  ss << <span class="stringliteral">", "</span>;</div><div class="line"><a name="l01064"></a><span class="lineno"> 1064</span>  }</div><div class="line"><a name="l01065"></a><span class="lineno"> 1065</span>  }</div><div class="line"><a name="l01066"></a><span class="lineno"> 1066</span> </div><div class="line"><a name="l01067"></a><span class="lineno"> 1067</span>  ss << <span class="stringliteral">" }"</span>;</div><div class="line"><a name="l01068"></a><span class="lineno"> 1068</span>  }</div><div class="line"><a name="l01069"></a><span class="lineno"> 1069</span>  }</div><div class="line"><a name="l01070"></a><span class="lineno"> 1070</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (ct->getTag() == dwarf::DW_TAG_array_type)</div><div class="line"><a name="l01071"></a><span class="lineno"> 1071</span>  {</div><div class="line"><a name="l01072"></a><span class="lineno"> 1072</span>  ss << <a class="code" href="classSVF_1_1DCHGraph.html#a2dc488345cc3a5f37079952f638d8c2b">diTypeToStr</a>(ct->getBaseType());</div><div class="line"><a name="l01073"></a><span class="lineno"> 1073</span>  <a class="code" href="namespaceSVF.html#a0f825e73d115173b05ca54fb8ec65003">DINodeArray</a> sizes = ct->getElements();</div><div class="line"><a name="l01074"></a><span class="lineno"> 1074</span>  <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> i = 0; i < sizes.size(); ++i)</div><div class="line"><a name="l01075"></a><span class="lineno"> 1075</span>  {</div><div class="line"><a name="l01076"></a><span class="lineno"> 1076</span>  <a class="code" href="namespaceSVF.html#a99bc1228f07429855c81a720be862dc6">DISubrange</a> *sr = <a class="code" href="namespaceSVF_1_1SVFUtil.html#af6e96694d983643a66c238cce01bff0e">SVFUtil::dyn_cast</a><<a class="code" href="namespaceSVF.html#a99bc1228f07429855c81a720be862dc6">DISubrange</a>>(sizes[0]);</div><div class="line"><a name="l01077"></a><span class="lineno"> 1077</span>  assert(sr != <span class="keyword">nullptr</span> && <span class="stringliteral">"DCHG: non-subrange as array element?"</span>);</div><div class="line"><a name="l01078"></a><span class="lineno"> 1078</span>  int64_t <a class="code" href="cJSON_8h.html#ad43c3812e6d13e0518d9f8b8f463ffcf">count</a> = -1;</div><div class="line"><a name="l01079"></a><span class="lineno"> 1079</span>  <span class="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#adefcb50414ea999d70cea5ccdbcb98d7">ConstantInt</a>* ci = sr->getCount().dyn_cast<<a class="code" href="namespaceSVF.html#adefcb50414ea999d70cea5ccdbcb98d7">ConstantInt</a>* >())</div><div class="line"><a name="l01080"></a><span class="lineno"> 1080</span>  {</div><div class="line"><a name="l01081"></a><span class="lineno"> 1081</span>  count = ci->getSExtValue();</div><div class="line"><a name="l01082"></a><span class="lineno"> 1082</span>  }</div><div class="line"><a name="l01083"></a><span class="lineno"> 1083</span> </div><div class="line"><a name="l01084"></a><span class="lineno"> 1084</span>  ss << <span class="stringliteral">"["</span> << count << <span class="stringliteral">"]"</span>;</div><div class="line"><a name="l01085"></a><span class="lineno"> 1085</span>  }</div><div class="line"><a name="l01086"></a><span class="lineno"> 1086</span>  }</div><div class="line"><a name="l01087"></a><span class="lineno"> 1087</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (ct->getTag() == dwarf::DW_TAG_enumeration_type)</div><div class="line"><a name="l01088"></a><span class="lineno"> 1088</span>  {</div><div class="line"><a name="l01089"></a><span class="lineno"> 1089</span>  ss << <span class="stringliteral">"enum "</span> << <a class="code" href="classSVF_1_1DCHGraph.html#a2dc488345cc3a5f37079952f638d8c2b">diTypeToStr</a>(ct->getBaseType());</div><div class="line"><a name="l01090"></a><span class="lineno"> 1090</span>  }</div><div class="line"><a name="l01091"></a><span class="lineno"> 1091</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (ct->getTag() == dwarf::DW_TAG_union_type)</div><div class="line"><a name="l01092"></a><span class="lineno"> 1092</span>  {</div><div class="line"><a name="l01093"></a><span class="lineno"> 1093</span> </div><div class="line"><a name="l01094"></a><span class="lineno"> 1094</span>  }</div><div class="line"><a name="l01095"></a><span class="lineno"> 1095</span>  }</div><div class="line"><a name="l01096"></a><span class="lineno"> 1096</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a090e0791e8c200104ed3ab6bab157129">DISubroutineType</a> *st = SVFUtil::dyn_cast<DISubroutineType>(t))</div><div class="line"><a name="l01097"></a><span class="lineno"> 1097</span>  {</div><div class="line"><a name="l01098"></a><span class="lineno"> 1098</span>  <a class="code" href="namespaceSVF.html#a9d3ee421789884473bfacfaa9ec007cc">DITypeRefArray</a> types = st->getTypeArray();</div><div class="line"><a name="l01099"></a><span class="lineno"> 1099</span>  <span class="comment">// Must have one element at least (the first type).</span></div><div class="line"><a name="l01100"></a><span class="lineno"> 1100</span>  ss << <a class="code" href="classSVF_1_1DCHGraph.html#a2dc488345cc3a5f37079952f638d8c2b">diTypeToStr</a>(types[0]) << <span class="stringliteral">" fn("</span>;</div><div class="line"><a name="l01101"></a><span class="lineno"> 1101</span>  <span class="keywordflow">if</span> (types.size() == 1)</div><div class="line"><a name="l01102"></a><span class="lineno"> 1102</span>  {</div><div class="line"><a name="l01103"></a><span class="lineno"> 1103</span>  ss << <span class="stringliteral">"void)"</span>;</div><div class="line"><a name="l01104"></a><span class="lineno"> 1104</span>  }</div><div class="line"><a name="l01105"></a><span class="lineno"> 1105</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l01106"></a><span class="lineno"> 1106</span>  {</div><div class="line"><a name="l01107"></a><span class="lineno"> 1107</span>  <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> i = 1; i < types.size(); ++i)</div><div class="line"><a name="l01108"></a><span class="lineno"> 1108</span>  {</div><div class="line"><a name="l01109"></a><span class="lineno"> 1109</span>  ss << <a class="code" href="classSVF_1_1DCHGraph.html#a2dc488345cc3a5f37079952f638d8c2b">diTypeToStr</a>(types[i]);</div><div class="line"><a name="l01110"></a><span class="lineno"> 1110</span>  <span class="keywordflow">if</span> (i + 1 != types.size())</div><div class="line"><a name="l01111"></a><span class="lineno"> 1111</span>  {</div><div class="line"><a name="l01112"></a><span class="lineno"> 1112</span>  <span class="comment">// There's another type.</span></div><div class="line"><a name="l01113"></a><span class="lineno"> 1113</span>  ss << <span class="stringliteral">", "</span>;</div><div class="line"><a name="l01114"></a><span class="lineno"> 1114</span>  }</div><div class="line"><a name="l01115"></a><span class="lineno"> 1115</span>  }</div><div class="line"><a name="l01116"></a><span class="lineno"> 1116</span> </div><div class="line"><a name="l01117"></a><span class="lineno"> 1117</span>  ss << <span class="stringliteral">")"</span>;</div><div class="line"><a name="l01118"></a><span class="lineno"> 1118</span>  }</div><div class="line"><a name="l01119"></a><span class="lineno"> 1119</span> </div><div class="line"><a name="l01120"></a><span class="lineno"> 1120</span>  ss << st->getName().str();</div><div class="line"><a name="l01121"></a><span class="lineno"> 1121</span>  }</div><div class="line"><a name="l01122"></a><span class="lineno"> 1122</span> </div><div class="line"><a name="l01123"></a><span class="lineno"> 1123</span>  <span class="keywordflow">return</span> ss.str();</div><div class="line"><a name="l01124"></a><span class="lineno"> 1124</span> }</div><div class="line"><a name="l01125"></a><span class="lineno"> 1125</span> </div><div class="line"><a name="l01126"></a><span class="lineno"><a class="line" href="DCHG_8cpp.html#a6673217180d3b6fb73c7c6387777f269"> 1126</a></span> <span class="keyword">static</span> <a class="code" href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">std::string</a> <a class="code" href="DCHG_8cpp.html#a6673217180d3b6fb73c7c6387777f269">indent</a>(<span class="keywordtype">size_t</span> <a class="code" href="cJSON_8cpp.html#ab6e2ea6dc7bd57d1483413449998230a">n</a>)</div><div class="line"><a name="l01127"></a><span class="lineno"> 1127</span> {</div><div class="line"><a name="l01128"></a><span class="lineno"> 1128</span>  <span class="keywordflow">return</span> <a class="code" href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">std::string</a>(n, <span class="charliteral">' '</span>);</div><div class="line"><a name="l01129"></a><span class="lineno"> 1129</span> }</div><div class="line"><a name="l01130"></a><span class="lineno"> 1130</span> </div><div class="line"><a name="l01131"></a><span class="lineno"><a class="line" href="classSVF_1_1DCHGraph.html#a5f08ed4cbba3e4b7a348d5ad77664726"> 1131</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1DCHGraph.html#a5f08ed4cbba3e4b7a348d5ad77664726">DCHGraph::print</a>(<span class="keywordtype">void</span>)</div><div class="line"><a name="l01132"></a><span class="lineno"> 1132</span> {</div><div class="line"><a name="l01133"></a><span class="lineno"> 1133</span>  <span class="keyword">static</span> <span class="keyword">const</span> <a class="code" href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">std::string</a> line = <span class="stringliteral">"-------------------------------------\n"</span>;</div><div class="line"><a name="l01134"></a><span class="lineno"> 1134</span>  <span class="keyword">static</span> <span class="keyword">const</span> <a class="code" href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">std::string</a> thickLine = <span class="stringliteral">"=====================================\n"</span>;</div><div class="line"><a name="l01135"></a><span class="lineno"> 1135</span>  <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">size_t</span> singleIndent = 2;</div><div class="line"><a name="l01136"></a><span class="lineno"> 1136</span> </div><div class="line"><a name="l01137"></a><span class="lineno"> 1137</span>  <span class="keywordtype">size_t</span> currIndent = 0;</div><div class="line"><a name="l01138"></a><span class="lineno"> 1138</span>  <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">SVFUtil::outs</a>() << thickLine;</div><div class="line"><a name="l01139"></a><span class="lineno"> 1139</span>  <span class="keywordtype">unsigned</span> numStructs = 0;</div><div class="line"><a name="l01140"></a><span class="lineno"> 1140</span>  <span class="keywordtype">unsigned</span> largestStruct = 0;</div><div class="line"><a name="l01141"></a><span class="lineno"> 1141</span>  <a class="code" href="namespaceSVF.html#a212231734fa43d5c7414137deaac7df3">NodeSet</a> <a class="code" href="namespaceSVF.html#ae6c7046834fe00382052ece7d06eb0ac">nodes</a>;</div><div class="line"><a name="l01142"></a><span class="lineno"> 1142</span>  <span class="keywordflow">for</span> (<a class="code" href="classSVF_1_1GenericGraph.html#a5dfa3f178d4abf37177d0d74ff4c6a97">DCHGraph::const_iterator</a> it = <a class="code" href="classSVF_1_1GenericGraph.html#a0d9744b1b0e7a09a6f7af29188e243b7">begin</a>(); it != <a class="code" href="classSVF_1_1GenericGraph.html#a4bef15157423cef48dc7333a803cd27d">end</a>(); ++it)</div><div class="line"><a name="l01143"></a><span class="lineno"> 1143</span>  {</div><div class="line"><a name="l01144"></a><span class="lineno"> 1144</span>  nodes.insert(it->first);</div><div class="line"><a name="l01145"></a><span class="lineno"> 1145</span>  }</div><div class="line"><a name="l01146"></a><span class="lineno"> 1146</span> </div><div class="line"><a name="l01147"></a><span class="lineno"> 1147</span>  <span class="keywordflow">for</span> (<a class="code" href="namespaceSVF.html#a350ae9bf8606bdfe23c8679681b969dc">NodeID</a> <span class="keywordtype">id</span> : nodes)</div><div class="line"><a name="l01148"></a><span class="lineno"> 1148</span>  {</div><div class="line"><a name="l01149"></a><span class="lineno"> 1149</span>  <span class="keywordflow">if</span> (*nodes.begin() != id)</div><div class="line"><a name="l01150"></a><span class="lineno"> 1150</span>  {</div><div class="line"><a name="l01151"></a><span class="lineno"> 1151</span>  <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">SVFUtil::outs</a>() << line;</div><div class="line"><a name="l01152"></a><span class="lineno"> 1152</span>  }</div><div class="line"><a name="l01153"></a><span class="lineno"> 1153</span> </div><div class="line"><a name="l01154"></a><span class="lineno"> 1154</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1DCHNode.html">DCHNode</a> *node = <a class="code" href="classSVF_1_1GenericGraph.html#a43c9c773bfa17abf481c33073e30d01b">getGNode</a>(<span class="keywordtype">id</span>);</div><div class="line"><a name="l01155"></a><span class="lineno"> 1155</span> </div><div class="line"><a name="l01156"></a><span class="lineno"> 1156</span>  <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">SVFUtil::outs</a>() << <a class="code" href="DCHG_8cpp.html#a6673217180d3b6fb73c7c6387777f269">indent</a>(currIndent) << <span class="keywordtype">id</span> << <span class="stringliteral">": "</span> << <a class="code" href="classSVF_1_1DCHGraph.html#a2dc488345cc3a5f37079952f638d8c2b">diTypeToStr</a>(node-><a class="code" href="classSVF_1_1DCHNode.html#aaf4036d892bdae02a01d31bfe3db2153">getType</a>()) << <span class="stringliteral">" ["</span> << node-><a class="code" href="classSVF_1_1DCHNode.html#aaf4036d892bdae02a01d31bfe3db2153">getType</a>() << <span class="stringliteral">"]"</span> << <span class="stringliteral">"\n"</span>;</div><div class="line"><a name="l01157"></a><span class="lineno"> 1157</span>  <span class="keywordflow">if</span> (node-><a class="code" href="classSVF_1_1DCHNode.html#aaf4036d892bdae02a01d31bfe3db2153">getType</a>() != <span class="keyword">nullptr</span></div><div class="line"><a name="l01158"></a><span class="lineno"> 1158</span>  && (node-><a class="code" href="classSVF_1_1DCHNode.html#aaf4036d892bdae02a01d31bfe3db2153">getType</a>()->getTag() == dwarf::DW_TAG_class_type</div><div class="line"><a name="l01159"></a><span class="lineno"> 1159</span>  || node-><a class="code" href="classSVF_1_1DCHNode.html#aaf4036d892bdae02a01d31bfe3db2153">getType</a>()->getTag() == dwarf::DW_TAG_structure_type))</div><div class="line"><a name="l01160"></a><span class="lineno"> 1160</span>  {</div><div class="line"><a name="l01161"></a><span class="lineno"> 1161</span>  ++numStructs;</div><div class="line"><a name="l01162"></a><span class="lineno"> 1162</span>  <span class="keywordtype">unsigned</span> numFields = <a class="code" href="classSVF_1_1DCHGraph.html#ae9a0007299178912e2568dc7158d6824">getFieldTypes</a>(node-><a class="code" href="classSVF_1_1DCHNode.html#aaf4036d892bdae02a01d31bfe3db2153">getType</a>()).size();</div><div class="line"><a name="l01163"></a><span class="lineno"> 1163</span>  largestStruct = numFields > largestStruct ? numFields : largestStruct;</div><div class="line"><a name="l01164"></a><span class="lineno"> 1164</span>  }</div><div class="line"><a name="l01165"></a><span class="lineno"> 1165</span> </div><div class="line"><a name="l01166"></a><span class="lineno"> 1166</span>  currIndent += singleIndent;</div><div class="line"><a name="l01167"></a><span class="lineno"> 1167</span>  <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">SVFUtil::outs</a>() << <a class="code" href="DCHG_8cpp.html#a6673217180d3b6fb73c7c6387777f269">indent</a>(currIndent) << <span class="stringliteral">"Virtual functions\n"</span>;</div><div class="line"><a name="l01168"></a><span class="lineno"> 1168</span>  currIndent += singleIndent;</div><div class="line"><a name="l01169"></a><span class="lineno"> 1169</span>  <span class="keyword">const</span> std::vector<std::vector<const Function* >> &vfnVectors = node-><a class="code" href="classSVF_1_1DCHNode.html#a806a65f35c9f4ea118c1ef44ddb46079">getVfnVectors</a>();</div><div class="line"><a name="l01170"></a><span class="lineno"> 1170</span>  <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> i = 0; i < vfnVectors.size(); ++i)</div><div class="line"><a name="l01171"></a><span class="lineno"> 1171</span>  {</div><div class="line"><a name="l01172"></a><span class="lineno"> 1172</span>  <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">SVFUtil::outs</a>() << <a class="code" href="DCHG_8cpp.html#a6673217180d3b6fb73c7c6387777f269">indent</a>(currIndent) << <span class="stringliteral">"[ vtable #"</span> << i << <span class="stringliteral">" ]\n"</span>;</div><div class="line"><a name="l01173"></a><span class="lineno"> 1173</span>  currIndent += singleIndent;</div><div class="line"><a name="l01174"></a><span class="lineno"> 1174</span>  <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> j = 0; j < vfnVectors[i].size(); ++j)</div><div class="line"><a name="l01175"></a><span class="lineno"> 1175</span>  {</div><div class="line"><a name="l01176"></a><span class="lineno"> 1176</span>  <span class="keyword">struct </span><a class="code" href="structSVF_1_1cppUtil_1_1DemangledName.html">cppUtil::DemangledName</a> dname = <a class="code" href="namespaceSVF_1_1cppUtil.html#a1007c092efaeae41002efd91b803a7f6">cppUtil::demangle</a>(vfnVectors[i][j]->getName().str());</div><div class="line"><a name="l01177"></a><span class="lineno"> 1177</span>  <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">SVFUtil::outs</a>() << <a class="code" href="DCHG_8cpp.html#a6673217180d3b6fb73c7c6387777f269">indent</a>(currIndent) << <span class="stringliteral">"["</span> << j << <span class="stringliteral">"] "</span></div><div class="line"><a name="l01178"></a><span class="lineno"> 1178</span>  << dname.<a class="code" href="structSVF_1_1cppUtil_1_1DemangledName.html#a5cd207bce618521166e6fa235014b297">className</a> << <span class="stringliteral">"::"</span> << dname.<a class="code" href="structSVF_1_1cppUtil_1_1DemangledName.html#a1dd17b240663bc9412adefde82385e02">funcName</a> << <span class="stringliteral">"\n"</span>;</div><div class="line"><a name="l01179"></a><span class="lineno"> 1179</span>  }</div><div class="line"><a name="l01180"></a><span class="lineno"> 1180</span> </div><div class="line"><a name="l01181"></a><span class="lineno"> 1181</span>  currIndent -= singleIndent;</div><div class="line"><a name="l01182"></a><span class="lineno"> 1182</span>  }</div><div class="line"><a name="l01183"></a><span class="lineno"> 1183</span> </div><div class="line"><a name="l01184"></a><span class="lineno"> 1184</span>  <span class="comment">// Nothing was printed.</span></div><div class="line"><a name="l01185"></a><span class="lineno"> 1185</span>  <span class="keywordflow">if</span> (vfnVectors.size() == 0)</div><div class="line"><a name="l01186"></a><span class="lineno"> 1186</span>  {</div><div class="line"><a name="l01187"></a><span class="lineno"> 1187</span>  <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">SVFUtil::outs</a>() << <a class="code" href="DCHG_8cpp.html#a6673217180d3b6fb73c7c6387777f269">indent</a>(currIndent) << <span class="stringliteral">"(none)\n"</span>;</div><div class="line"><a name="l01188"></a><span class="lineno"> 1188</span>  }</div><div class="line"><a name="l01189"></a><span class="lineno"> 1189</span> </div><div class="line"><a name="l01190"></a><span class="lineno"> 1190</span>  currIndent -= singleIndent;</div><div class="line"><a name="l01191"></a><span class="lineno"> 1191</span> </div><div class="line"><a name="l01192"></a><span class="lineno"> 1192</span>  <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">SVFUtil::outs</a>() << <a class="code" href="DCHG_8cpp.html#a6673217180d3b6fb73c7c6387777f269">indent</a>(currIndent) << <span class="stringliteral">"Bases\n"</span>;</div><div class="line"><a name="l01193"></a><span class="lineno"> 1193</span>  currIndent += singleIndent;</div><div class="line"><a name="l01194"></a><span class="lineno"> 1194</span>  <span class="keywordflow">for</span> (<span class="keyword">const</span> <a class="code" href="classSVF_1_1DCHEdge.html">DCHEdge</a> *edge : node-><a class="code" href="classSVF_1_1GenericNode.html#a2d9cd758d6f8c5189d9b90b74f43e009">getOutEdges</a>())</div><div class="line"><a name="l01195"></a><span class="lineno"> 1195</span>  {</div><div class="line"><a name="l01196"></a><span class="lineno"> 1196</span>  <a class="code" href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">std::string</a> arrow;</div><div class="line"><a name="l01197"></a><span class="lineno"> 1197</span>  <span class="keywordflow">if</span> (edge->getEdgeKind() == <a class="code" href="classSVF_1_1DCHEdge.html#a48f01c4a02c4e278a1ab70b16efdef4ba9c05805c60fe04033bd9815968059e90">DCHEdge::INHERITANCE</a>)</div><div class="line"><a name="l01198"></a><span class="lineno"> 1198</span>  {</div><div class="line"><a name="l01199"></a><span class="lineno"> 1199</span>  arrow = <span class="stringliteral">"--inheritance-->"</span>;</div><div class="line"><a name="l01200"></a><span class="lineno"> 1200</span>  }</div><div class="line"><a name="l01201"></a><span class="lineno"> 1201</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (edge->getEdgeKind() == <a class="code" href="classSVF_1_1DCHEdge.html#a48f01c4a02c4e278a1ab70b16efdef4ba3b49b95b713f585b717810dce5ac6564">DCHEdge::FIRST_FIELD</a>)</div><div class="line"><a name="l01202"></a><span class="lineno"> 1202</span>  {</div><div class="line"><a name="l01203"></a><span class="lineno"> 1203</span>  arrow = <span class="stringliteral">"--first-field-->"</span>;</div><div class="line"><a name="l01204"></a><span class="lineno"> 1204</span>  }</div><div class="line"><a name="l01205"></a><span class="lineno"> 1205</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (edge->getEdgeKind() == <a class="code" href="classSVF_1_1DCHEdge.html#a48f01c4a02c4e278a1ab70b16efdef4ba3e807b4caeb170c5cd1e855ac1a92d77">DCHEdge::INSTANCE</a>)</div><div class="line"><a name="l01206"></a><span class="lineno"> 1206</span>  {</div><div class="line"><a name="l01207"></a><span class="lineno"> 1207</span>  arrow = <span class="stringliteral">"---instance---->"</span>;</div><div class="line"><a name="l01208"></a><span class="lineno"> 1208</span>  }</div><div class="line"><a name="l01209"></a><span class="lineno"> 1209</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (edge->getEdgeKind() == <a class="code" href="classSVF_1_1DCHEdge.html#a48f01c4a02c4e278a1ab70b16efdef4ba8b07351616a1798fa34ec3828f485ebb">DCHEdge::STD_DEF</a>)</div><div class="line"><a name="l01210"></a><span class="lineno"> 1210</span>  {</div><div class="line"><a name="l01211"></a><span class="lineno"> 1211</span>  arrow = <span class="stringliteral">"---standard---->"</span>;</div><div class="line"><a name="l01212"></a><span class="lineno"> 1212</span>  }</div><div class="line"><a name="l01213"></a><span class="lineno"> 1213</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l01214"></a><span class="lineno"> 1214</span>  {</div><div class="line"><a name="l01215"></a><span class="lineno"> 1215</span>  arrow = <span class="stringliteral">"----unknown---->"</span>;</div><div class="line"><a name="l01216"></a><span class="lineno"> 1216</span>  }</div><div class="line"><a name="l01217"></a><span class="lineno"> 1217</span> </div><div class="line"><a name="l01218"></a><span class="lineno"> 1218</span>  <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">SVFUtil::outs</a>() << <a class="code" href="DCHG_8cpp.html#a6673217180d3b6fb73c7c6387777f269">indent</a>(currIndent) << <span class="stringliteral">"[ "</span> << <a class="code" href="classSVF_1_1DCHGraph.html#a2dc488345cc3a5f37079952f638d8c2b">diTypeToStr</a>(node-><a class="code" href="classSVF_1_1DCHNode.html#aaf4036d892bdae02a01d31bfe3db2153">getType</a>()) << <span class="stringliteral">" ] "</span></div><div class="line"><a name="l01219"></a><span class="lineno"> 1219</span>  << arrow << <span class="stringliteral">" [ "</span> << <a class="code" href="classSVF_1_1DCHGraph.html#a2dc488345cc3a5f37079952f638d8c2b">diTypeToStr</a>(edge->getDstNode()->getType()) << <span class="stringliteral">" ]\n"</span>;</div><div class="line"><a name="l01220"></a><span class="lineno"> 1220</span>  }</div><div class="line"><a name="l01221"></a><span class="lineno"> 1221</span> </div><div class="line"><a name="l01222"></a><span class="lineno"> 1222</span>  <span class="keywordflow">if</span> (node-><a class="code" href="classSVF_1_1GenericNode.html#a2d9cd758d6f8c5189d9b90b74f43e009">getOutEdges</a>().size() == 0)</div><div class="line"><a name="l01223"></a><span class="lineno"> 1223</span>  {</div><div class="line"><a name="l01224"></a><span class="lineno"> 1224</span>  <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">SVFUtil::outs</a>() << <a class="code" href="DCHG_8cpp.html#a6673217180d3b6fb73c7c6387777f269">indent</a>(currIndent) << <span class="stringliteral">"(none)\n"</span>;</div><div class="line"><a name="l01225"></a><span class="lineno"> 1225</span>  }</div><div class="line"><a name="l01226"></a><span class="lineno"> 1226</span> </div><div class="line"><a name="l01227"></a><span class="lineno"> 1227</span>  currIndent -= singleIndent;</div><div class="line"><a name="l01228"></a><span class="lineno"> 1228</span> </div><div class="line"><a name="l01229"></a><span class="lineno"> 1229</span>  <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">SVFUtil::outs</a>() << <a class="code" href="DCHG_8cpp.html#a6673217180d3b6fb73c7c6387777f269">indent</a>(currIndent) << <span class="stringliteral">"Typedefs\n"</span>;</div><div class="line"><a name="l01230"></a><span class="lineno"> 1230</span> </div><div class="line"><a name="l01231"></a><span class="lineno"> 1231</span>  currIndent += singleIndent;</div><div class="line"><a name="l01232"></a><span class="lineno"> 1232</span> </div><div class="line"><a name="l01233"></a><span class="lineno"> 1233</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#af739db846e47ba6b2fd15eaad31ab7fb">Set<const DIDerivedType *></a> &typedefs = node-><a class="code" href="classSVF_1_1DCHNode.html#ac77edc44c3c5acc185c27c018837d066">getTypedefs</a>();</div><div class="line"><a name="l01234"></a><span class="lineno"> 1234</span>  <span class="keywordflow">for</span> (<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a852e75c562139237fcc754c7461533e6">DIDerivedType</a> *tdef : typedefs)</div><div class="line"><a name="l01235"></a><span class="lineno"> 1235</span>  {</div><div class="line"><a name="l01236"></a><span class="lineno"> 1236</span>  <a class="code" href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">std::string</a> typedefName = <span class="stringliteral">"void"</span>;</div><div class="line"><a name="l01237"></a><span class="lineno"> 1237</span>  <span class="keywordflow">if</span> (tdef != <span class="keyword">nullptr</span>)</div><div class="line"><a name="l01238"></a><span class="lineno"> 1238</span>  {</div><div class="line"><a name="l01239"></a><span class="lineno"> 1239</span>  typedefName = tdef->getName().str();</div><div class="line"><a name="l01240"></a><span class="lineno"> 1240</span>  }</div><div class="line"><a name="l01241"></a><span class="lineno"> 1241</span> </div><div class="line"><a name="l01242"></a><span class="lineno"> 1242</span>  <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">SVFUtil::outs</a>() << <a class="code" href="DCHG_8cpp.html#a6673217180d3b6fb73c7c6387777f269">indent</a>(currIndent) << typedefName << <span class="stringliteral">"\n"</span>;</div><div class="line"><a name="l01243"></a><span class="lineno"> 1243</span>  }</div><div class="line"><a name="l01244"></a><span class="lineno"> 1244</span> </div><div class="line"><a name="l01245"></a><span class="lineno"> 1245</span>  <span class="keywordflow">if</span> (typedefs.size() == 0)</div><div class="line"><a name="l01246"></a><span class="lineno"> 1246</span>  {</div><div class="line"><a name="l01247"></a><span class="lineno"> 1247</span>  <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">SVFUtil::outs</a>() << <a class="code" href="DCHG_8cpp.html#a6673217180d3b6fb73c7c6387777f269">indent</a>(currIndent) << <span class="stringliteral">"(none)\n"</span>;</div><div class="line"><a name="l01248"></a><span class="lineno"> 1248</span>  }</div><div class="line"><a name="l01249"></a><span class="lineno"> 1249</span> </div><div class="line"><a name="l01250"></a><span class="lineno"> 1250</span>  currIndent -= singleIndent;</div><div class="line"><a name="l01251"></a><span class="lineno"> 1251</span> </div><div class="line"><a name="l01252"></a><span class="lineno"> 1252</span>  currIndent -= singleIndent;</div><div class="line"><a name="l01253"></a><span class="lineno"> 1253</span>  }</div><div class="line"><a name="l01254"></a><span class="lineno"> 1254</span> </div><div class="line"><a name="l01255"></a><span class="lineno"> 1255</span>  <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">SVFUtil::outs</a>() << thickLine;</div><div class="line"><a name="l01256"></a><span class="lineno"> 1256</span> </div><div class="line"><a name="l01257"></a><span class="lineno"> 1257</span>  <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">SVFUtil::outs</a>() << <span class="stringliteral">"Other stats\n"</span>;</div><div class="line"><a name="l01258"></a><span class="lineno"> 1258</span>  <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">SVFUtil::outs</a>() << line;</div><div class="line"><a name="l01259"></a><span class="lineno"> 1259</span>  <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">SVFUtil::outs</a>() << <span class="stringliteral">"# Canonical types : "</span> << <a class="code" href="classSVF_1_1DCHGraph.html#a10225f56b21eb7f0870fdc433de3c393">canonicalTypes</a>.size() << <span class="stringliteral">"\n"</span>;</div><div class="line"><a name="l01260"></a><span class="lineno"> 1260</span>  <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">SVFUtil::outs</a>() << <span class="stringliteral">"# structs : "</span> << numStructs << <span class="stringliteral">"\n"</span>;</div><div class="line"><a name="l01261"></a><span class="lineno"> 1261</span>  <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">SVFUtil::outs</a>() << <span class="stringliteral">"Largest struct : "</span> << largestStruct << <span class="stringliteral">" fields\n"</span>;</div><div class="line"><a name="l01262"></a><span class="lineno"> 1262</span>  <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">SVFUtil::outs</a>() << thickLine;</div><div class="line"><a name="l01263"></a><span class="lineno"> 1263</span> </div><div class="line"><a name="l01264"></a><span class="lineno"> 1264</span>  <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">SVFUtil::outs</a>().flush();</div><div class="line"><a name="l01265"></a><span class="lineno"> 1265</span> }</div><div class="ttc" id="namespaceSVF_1_1LLVMUtil_html_a4f6431ca72e0378bf2428de8a87ba648"><div class="ttname"><a href="namespaceSVF_1_1LLVMUtil.html#a4f6431ca72e0378bf2428de8a87ba648">SVF::LLVMUtil::getFunction</a></div><div class="ttdeci">const SVFFunction * getFunction(std::string name)</div><div class="ttdoc">Get the corresponding Function based on its name. </div><div class="ttdef"><b>Definition:</b> <a href="LLVMUtil_8h_source.html#l00368">LLVMUtil.h:368</a></div></div>
|
|
70
70
|
<div class="ttc" id="classSVF_1_1GenericGraph_html_a0d9744b1b0e7a09a6f7af29188e243b7"><div class="ttname"><a href="classSVF_1_1GenericGraph.html#a0d9744b1b0e7a09a6f7af29188e243b7">SVF::GenericGraph< DCHNode, DCHEdge >::begin</a></div><div class="ttdeci">iterator begin()</div><div class="ttdoc">Iterators. </div><div class="ttdef"><b>Definition:</b> <a href="GenericGraph_8h_source.html#l00369">GenericGraph.h:369</a></div></div>
|
|
71
71
|
<div class="ttc" id="classSVF_1_1DCHGraph_html_a2dc488345cc3a5f37079952f638d8c2b"><div class="ttname"><a href="classSVF_1_1DCHGraph.html#a2dc488345cc3a5f37079952f638d8c2b">SVF::DCHGraph::diTypeToStr</a></div><div class="ttdeci">static std::string diTypeToStr(const DIType *)</div><div class="ttdoc">Returns a human-readable version of the DIType. </div><div class="ttdef"><b>Definition:</b> <a href="DCHG_8cpp_source.html#l00958">DCHG.cpp:958</a></div></div>
|
|
72
72
|
<div class="ttc" id="classSVF_1_1DCHGraph_html_adc7a17f70ac3fa89624ad874dbd16ff9"><div class="ttname"><a href="classSVF_1_1DCHGraph.html#adc7a17f70ac3fa89624ad874dbd16ff9">SVF::DCHGraph::containingAggs</a></div><div class="ttdeci">Map< const DIType *, Set< const DIType * > > containingAggs</div><div class="ttdoc">Maps aggregate types to all the aggregate types it transitively contains. </div><div class="ttdef"><b>Definition:</b> <a href="DCHG_8h_source.html#l00383">DCHG.h:383</a></div></div>
|
|
@@ -111,7 +111,6 @@ $(function() {
|
|
|
111
111
|
<div class="ttc" id="classSVF_1_1DCHNode_html_a41ba902b643e2aec828be1a89f4536af"><div class="ttname"><a href="classSVF_1_1DCHNode.html#a41ba902b643e2aec828be1a89f4536af">SVF::DCHNode::getVfnVector</a></div><div class="ttdeci">std::vector< const Function *> & getVfnVector(unsigned n)</div><div class="ttdoc">Return the nth virtual function vector in the vtable. </div><div class="ttdef"><b>Definition:</b> <a href="DCHG_8h_source.html#l00181">DCHG.h:181</a></div></div>
|
|
112
112
|
<div class="ttc" id="classSVF_1_1GenericGraph_html_a5dfa3f178d4abf37177d0d74ff4c6a97"><div class="ttname"><a href="classSVF_1_1GenericGraph.html#a5dfa3f178d4abf37177d0d74ff4c6a97">SVF::GenericGraph< DCHNode, DCHEdge >::const_iterator</a></div><div class="ttdeci">IDToNodeMapTy::const_iterator const_iterator</div><div class="ttdef"><b>Definition:</b> <a href="GenericGraph_8h_source.html#l00347">GenericGraph.h:347</a></div></div>
|
|
113
113
|
<div class="ttc" id="classSVF_1_1DCHGraph_html_a671f379ae54eef247b5e013478eb3f0c"><div class="ttname"><a href="classSVF_1_1DCHGraph.html#a671f379ae54eef247b5e013478eb3f0c">SVF::DCHGraph::handleDISubroutineType</a></div><div class="ttdeci">void handleDISubroutineType(const DISubroutineType *subroutineType)</div><div class="ttdoc">Construction helper to process DISubroutineTypes. </div><div class="ttdef"><b>Definition:</b> <a href="DCHG_8cpp_source.html#l00132">DCHG.cpp:132</a></div></div>
|
|
114
|
-
<div class="ttc" id="classSVF_1_1Options_html_adf6c289ef9f2d0196984dd4024ea4316"><div class="ttname"><a href="classSVF_1_1Options.html#adf6c289ef9f2d0196984dd4024ea4316">SVF::Options::PrintDCHG</a></div><div class="ttdeci">static const llvm::cl::opt< bool > PrintDCHG</div><div class="ttdef"><b>Definition:</b> <a href="Options_8h_source.html#l00208">Options.h:208</a></div></div>
|
|
115
114
|
<div class="ttc" id="cJSON_8cpp_html_ab6e2ea6dc7bd57d1483413449998230a"><div class="ttname"><a href="cJSON_8cpp.html#ab6e2ea6dc7bd57d1483413449998230a">n</a></div><div class="ttdeci">cJSON * n</div><div class="ttdef"><b>Definition:</b> <a href="cJSON_8cpp_source.html#l02558">cJSON.cpp:2558</a></div></div>
|
|
116
115
|
<div class="ttc" id="classSVF_1_1DCHGraph_html_a581ce71cbc7994f71c9a6b9b145d3b9f"><div class="ttname"><a href="classSVF_1_1DCHGraph.html#a581ce71cbc7994f71c9a6b9b145d3b9f">SVF::DCHGraph::diTypeToNodeMap</a></div><div class="ttdeci">Map< const DIType *, DCHNode * > diTypeToNodeMap</div><div class="ttdoc">Maps DITypes to their nodes. </div><div class="ttdef"><b>Definition:</b> <a href="DCHG_8h_source.html#l00365">DCHG.h:365</a></div></div>
|
|
117
116
|
<div class="ttc" id="cJSON_8h_html_a1a175e87536301df98c805ac0636ad7c"><div class="ttname"><a href="cJSON_8h.html#a1a175e87536301df98c805ac0636ad7c">b</a></div><div class="ttdeci">const cJSON *const b</div><div class="ttdef"><b>Definition:</b> <a href="cJSON_8h_source.html#l00255">cJSON.h:255</a></div></div>
|
|
@@ -191,6 +190,7 @@ $(function() {
|
|
|
191
190
|
<div class="ttc" id="classSVF_1_1DCHGraph_html_a2b2dbc52089696854a8339f2e83fc333"><div class="ttname"><a href="classSVF_1_1DCHGraph.html#a2b2dbc52089696854a8339f2e83fc333">SVF::DCHGraph::isFirstField</a></div><div class="ttdeci">bool isFirstField(const DIType *f, const DIType *b)</div><div class="ttdef"><b>Definition:</b> <a href="DCHG_8cpp_source.html#l00931">DCHG.cpp:931</a></div></div>
|
|
192
191
|
<div class="ttc" id="classSVF_1_1DCHNode_html_ac77edc44c3c5acc185c27c018837d066"><div class="ttname"><a href="classSVF_1_1DCHNode.html#ac77edc44c3c5acc185c27c018837d066">SVF::DCHNode::getTypedefs</a></div><div class="ttdeci">const Set< const DIDerivedType * > & getTypedefs(void) const</div><div class="ttdef"><b>Definition:</b> <a href="DCHG_8h_source.html#l00159">DCHG.h:159</a></div></div>
|
|
193
192
|
<div class="ttc" id="cJSON_8h_html_ad4c68ea99a26b0a98ad9a79982960458"><div class="ttname"><a href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">string</a></div><div class="ttdeci">const char *const string</div><div class="ttdef"><b>Definition:</b> <a href="cJSON_8h_source.html#l00172">cJSON.h:172</a></div></div>
|
|
193
|
+
<div class="ttc" id="classSVF_1_1Options_html_aab85f2c2ceb235b1291301f33154d182"><div class="ttname"><a href="classSVF_1_1Options.html#aab85f2c2ceb235b1291301f33154d182">SVF::Options::PrintDCHG</a></div><div class="ttdeci">static const Option< bool > PrintDCHG</div><div class="ttdef"><b>Definition:</b> <a href="Options_8h_source.html#l00208">Options.h:208</a></div></div>
|
|
194
194
|
<div class="ttc" id="namespaceSVF_html_ad127b0ad478640ede3d426e3a58d2632"><div class="ttname"><a href="namespaceSVF.html#ad127b0ad478640ede3d426e3a58d2632">SVF::DIType</a></div><div class="ttdeci">llvm::DIType DIType</div><div class="ttdef"><b>Definition:</b> <a href="BasicTypes_8h_source.html#l00204">BasicTypes.h:204</a></div></div>
|
|
195
195
|
<div class="ttc" id="LLVMUtil_8h_html"><div class="ttname"><a href="LLVMUtil_8h.html">LLVMUtil.h</a></div></div>
|
|
196
196
|
<div class="ttc" id="classSVF_1_1DCHGraph_html_a6a5d012fda005d45bf3196d1a7d2c6fa"><div class="ttname"><a href="classSVF_1_1DCHGraph.html#a6a5d012fda005d45bf3196d1a7d2c6fa">SVF::DCHGraph::getVFnsFromVtbls</a></div><div class="ttdeci">virtual void getVFnsFromVtbls(CallSite cs, const VTableSet &vtbls, VFunSet &virtualFunctions) override</div><div class="ttdef"><b>Definition:</b> <a href="DCHG_8cpp_source.html#l00583">DCHG.cpp:583</a></div></div>
|