svf-tools 1.0.472 → 1.0.475
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/AndersenSFR_8cpp_source.html +1 -1
- package/SVF-doxygen/html/html/AndersenStat_8cpp_source.html +8 -7
- package/SVF-doxygen/html/html/Andersen_8cpp_source.html +2 -2
- package/SVF-doxygen/html/html/Andersen_8h_source.html +1 -1
- package/SVF-doxygen/html/html/CFLAlias_8h_source.html +2 -2
- package/SVF-doxygen/html/html/CHGBuilder_8cpp.html +2 -2
- package/SVF-doxygen/html/html/CHGBuilder_8cpp_source.html +20 -19
- package/SVF-doxygen/html/html/CHGBuilder_8h_source.html +15 -15
- package/SVF-doxygen/html/html/CPPUtil_8cpp_source.html +2 -2
- package/SVF-doxygen/html/html/Casting_8h_source.html +1 -1
- package/SVF-doxygen/html/html/ConsG_8cpp_source.html +2 -2
- package/SVF-doxygen/html/html/ConsG_8h_source.html +1 -1
- package/SVF-doxygen/html/html/ContextDDA_8cpp_source.html +2 -2
- package/SVF-doxygen/html/html/ContextDDA_8h_source.html +1 -1
- package/SVF-doxygen/html/html/DDAClient_8cpp_source.html +1 -1
- package/SVF-doxygen/html/html/DDAPass_8cpp_source.html +1 -1
- package/SVF-doxygen/html/html/DDAStat_8cpp_source.html +1 -1
- package/SVF-doxygen/html/html/DDAVFSolver_8h_source.html +4 -4
- package/SVF-doxygen/html/html/ExeState_8cpp_source.html +3 -3
- package/SVF-doxygen/html/html/FSMPTA_8cpp_source.html +1 -1
- package/SVF-doxygen/html/html/FlowDDA_8cpp_source.html +1 -1
- package/SVF-doxygen/html/html/FlowDDA_8h_source.html +2 -2
- package/SVF-doxygen/html/html/FlowSensitiveStat_8cpp_source.html +11 -10
- package/SVF-doxygen/html/html/FlowSensitiveTBHC_8cpp_source.html +1 -1
- package/SVF-doxygen/html/html/FlowSensitive_8cpp_source.html +1 -1
- package/SVF-doxygen/html/html/Graph2Json_8cpp_source.html +1 -1
- package/SVF-doxygen/html/html/ICFGBuilder_8cpp_source.html +11 -10
- package/SVF-doxygen/html/html/ICFGBuilder_8h_source.html +7 -7
- package/SVF-doxygen/html/html/ICFG_8cpp_source.html +2 -2
- package/SVF-doxygen/html/html/IRGraph_8h_source.html +3 -3
- package/SVF-doxygen/html/html/LLVMUtil_8cpp_source.html +24 -24
- package/SVF-doxygen/html/html/LLVMUtil_8h.html +111 -111
- package/SVF-doxygen/html/html/LLVMUtil_8h_source.html +41 -40
- package/SVF-doxygen/html/html/LeakChecker_8cpp_source.html +11 -10
- package/SVF-doxygen/html/html/LeakChecker_8h_source.html +8 -8
- package/SVF-doxygen/html/html/LocationSet_8cpp_source.html +14 -13
- package/SVF-doxygen/html/html/LocationSet_8h_source.html +9 -9
- package/SVF-doxygen/html/html/LockAnalysis_8cpp_source.html +31 -30
- package/SVF-doxygen/html/html/LockAnalysis_8h_source.html +23 -23
- package/SVF-doxygen/html/html/MHP_8h_source.html +2 -2
- package/SVF-doxygen/html/html/MSSAMuChi_8h_source.html +1 -1
- package/SVF-doxygen/html/html/MTA_8cpp_source.html +2 -2
- package/SVF-doxygen/html/html/MemPartition_8cpp_source.html +1 -1
- package/SVF-doxygen/html/html/MemRegion_8cpp_source.html +35 -34
- package/SVF-doxygen/html/html/MemSSA_8cpp_source.html +28 -27
- package/SVF-doxygen/html/html/MemSSA_8h_source.html +19 -19
- package/SVF-doxygen/html/html/PTAStat_8cpp_source.html +14 -14
- package/SVF-doxygen/html/html/PathCondAllocator_8cpp_source.html +28 -27
- package/SVF-doxygen/html/html/PathCondAllocator_8h_source.html +23 -23
- package/SVF-doxygen/html/html/PointerAnalysisImpl_8cpp_source.html +5 -5
- package/SVF-doxygen/html/html/PointerAnalysisImpl_8h_source.html +2 -2
- package/SVF-doxygen/html/html/PointerAnalysis_8cpp_source.html +27 -26
- package/SVF-doxygen/html/html/PointerAnalysis_8h_source.html +24 -24
- package/SVF-doxygen/html/html/ProgSlice_8cpp_source.html +1 -1
- package/SVF-doxygen/html/html/ProgSlice_8h_source.html +3 -3
- package/SVF-doxygen/html/html/SVFBasicTypes_8h_source.html +1 -1
- package/SVF-doxygen/html/html/SVFGBuilder_8cpp_source.html +3 -3
- package/SVF-doxygen/html/html/SVFGStat_8cpp_source.html +7 -7
- package/SVF-doxygen/html/html/SVFIRBuilder_8cpp_source.html +18 -17
- package/SVF-doxygen/html/html/SVFIRBuilder_8h_source.html +43 -43
- package/SVF-doxygen/html/html/SVFIR_8cpp_source.html +12 -12
- package/SVF-doxygen/html/html/SVFIR_8h_source.html +9 -9
- package/SVF-doxygen/html/html/SVFModule_8cpp_source.html +2 -2
- package/SVF-doxygen/html/html/SVFStatements_8cpp_source.html +1 -1
- package/SVF-doxygen/html/html/SVFStatements_8h_source.html +43 -43
- package/SVF-doxygen/html/html/SVFVariables_8h_source.html +3 -3
- package/SVF-doxygen/html/html/SaberAnnotator_8cpp_source.html +1 -1
- package/SVF-doxygen/html/html/SaberAnnotator_8h_source.html +1 -1
- package/SVF-doxygen/html/html/SaberSVFGBuilder_8cpp_source.html +2 -2
- package/SVF-doxygen/html/html/SrcSnkDDA_8cpp_source.html +1 -1
- package/SVF-doxygen/html/html/SymbolTableBuilder_8cpp_source.html +39 -37
- package/SVF-doxygen/html/html/SymbolTableBuilder_8h_source.html +16 -15
- package/SVF-doxygen/html/html/SymbolTableInfo_8cpp_source.html +58 -57
- package/SVF-doxygen/html/html/SymbolTableInfo_8h_source.html +24 -24
- package/SVF-doxygen/html/html/TCT_8h_source.html +2 -2
- package/SVF-doxygen/html/html/ThreadCallGraph_8cpp_source.html +1 -1
- package/SVF-doxygen/html/html/TypeBasedHeapCloning_8cpp_source.html +1 -1
- package/SVF-doxygen/html/html/VFGNode_8h_source.html +5 -5
- package/SVF-doxygen/html/html/VFG_8cpp_source.html +7 -7
- package/SVF-doxygen/html/html/VFG_8h_source.html +6 -6
- package/SVF-doxygen/html/html/VersionedFlowSensitiveStat_8cpp_source.html +1 -1
- package/SVF-doxygen/html/html/WPAPass_8cpp_source.html +2 -2
- package/SVF-doxygen/html/html/WPAStat_8h_source.html +5 -5
- package/SVF-doxygen/html/html/cfl_8cpp.html +3 -3
- package/SVF-doxygen/html/html/cfl_8cpp_source.html +3 -3
- package/SVF-doxygen/html/html/classSVF_1_1AndersenBase.html +3 -3
- package/SVF-doxygen/html/html/classSVF_1_1AndersenSFR.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1AndersenStat.html +14 -14
- package/SVF-doxygen/html/html/classSVF_1_1BVDataPTAImpl.html +6 -6
- package/SVF-doxygen/html/html/classSVF_1_1BinaryOPStmt.html +17 -15
- package/SVF-doxygen/html/html/classSVF_1_1BranchStmt.html +32 -32
- package/SVF-doxygen/html/html/classSVF_1_1BranchVFGNode.html +3 -3
- package/SVF-doxygen/html/html/classSVF_1_1CFLAlias.html +3 -3
- package/SVF-doxygen/html/html/classSVF_1_1CHGBuilder.html +48 -48
- package/SVF-doxygen/html/html/classSVF_1_1CmpStmt.html +6 -4
- package/SVF-doxygen/html/html/classSVF_1_1CondPTAImpl.html +4 -4
- package/SVF-doxygen/html/html/classSVF_1_1ConstraintGraph.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1ContextDDA.html +3 -3
- package/SVF-doxygen/html/html/classSVF_1_1DDAPass.html +4 -4
- package/SVF-doxygen/html/html/classSVF_1_1DDAStat.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1DDAVFSolver.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1DistinctMRG.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1ExeState.html +3 -3
- package/SVF-doxygen/html/html/classSVF_1_1FSMPTA.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1FlowDDA.html +3 -3
- package/SVF-doxygen/html/html/classSVF_1_1FlowSensitive.html +4 -4
- package/SVF-doxygen/html/html/classSVF_1_1FlowSensitiveStat.html +23 -23
- package/SVF-doxygen/html/html/classSVF_1_1FlowSensitiveTBHC.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1ForkJoinAnalysis.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1FunExitICFGNode.html +4 -4
- package/SVF-doxygen/html/html/classSVF_1_1FunptrDDAClient.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1GepObjVar.html +3 -3
- package/SVF-doxygen/html/html/classSVF_1_1GepStmt.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1ICFGBuilder.html +23 -23
- package/SVF-doxygen/html/html/classSVF_1_1ICFGPrinter.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1IRGraph.html +3 -3
- package/SVF-doxygen/html/html/classSVF_1_1IntraDisjointMRG.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1LeakChecker.html +22 -22
- package/SVF-doxygen/html/html/classSVF_1_1LocationSet.html +28 -28
- package/SVF-doxygen/html/html/classSVF_1_1LockAnalysis.html +78 -78
- package/SVF-doxygen/html/html/classSVF_1_1MRGenerator.html +100 -100
- package/SVF-doxygen/html/html/classSVF_1_1MTA.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1MTAAnnotator.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1MTASVFGBuilder.html +4 -4
- package/SVF-doxygen/html/html/classSVF_1_1MemObj.html +54 -54
- package/SVF-doxygen/html/html/classSVF_1_1MemSSA.html +56 -56
- package/SVF-doxygen/html/html/classSVF_1_1MemSSAStat.html +7 -7
- package/SVF-doxygen/html/html/classSVF_1_1ObjTypeInfo.html +8 -8
- package/SVF-doxygen/html/html/classSVF_1_1ObjVar.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1PTAStat.html +15 -15
- package/SVF-doxygen/html/html/classSVF_1_1PathCondAllocator.html +74 -74
- package/SVF-doxygen/html/html/classSVF_1_1PointerAnalysis.html +59 -59
- package/SVF-doxygen/html/html/classSVF_1_1ProgSlice.html +4 -4
- package/SVF-doxygen/html/html/classSVF_1_1RaceValidator.html +7 -7
- package/SVF-doxygen/html/html/classSVF_1_1SVFGBuilder.html +3 -3
- package/SVF-doxygen/html/html/classSVF_1_1SVFIR.html +14 -14
- package/SVF-doxygen/html/html/classSVF_1_1SVFIRBuilder.html +150 -150
- package/SVF-doxygen/html/html/classSVF_1_1SVFModule.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1SaberSVFGBuilder.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1SelectStmt.html +2 -1
- package/SVF-doxygen/html/html/classSVF_1_1SrcSnkDDA.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1StInfo.html +4 -4
- package/SVF-doxygen/html/html/classSVF_1_1SymbolTableBuilder-members.html +14 -13
- package/SVF-doxygen/html/html/classSVF_1_1SymbolTableBuilder.html +111 -85
- package/SVF-doxygen/html/html/classSVF_1_1SymbolTableInfo.html +65 -65
- package/SVF-doxygen/html/html/classSVF_1_1TDForkPE.html +9 -9
- package/SVF-doxygen/html/html/classSVF_1_1TDJoinPE.html +9 -9
- package/SVF-doxygen/html/html/classSVF_1_1ThreadCallGraph.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1TypeAnalysis.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1TypeBasedHeapCloning.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1UnaryOPStmt.html +20 -20
- package/SVF-doxygen/html/html/classSVF_1_1VFG.html +8 -8
- package/SVF-doxygen/html/html/classSVF_1_1VersionedFlowSensitiveStat.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1WPAPass.html +4 -4
- package/SVF-doxygen/html/html/dda_8cpp.html +2 -2
- package/SVF-doxygen/html/html/dda_8cpp_source.html +2 -2
- package/SVF-doxygen/html/html/functions_c.html +21 -16
- package/SVF-doxygen/html/html/functions_func_c.html +16 -13
- package/SVF-doxygen/html/html/functions_l.html +3 -3
- package/SVF-doxygen/html/html/functions_o.html +16 -16
- package/SVF-doxygen/html/html/functions_p.html +7 -13
- package/SVF-doxygen/html/html/functions_s.html +7 -9
- package/SVF-doxygen/html/html/functions_t.html +4 -4
- package/SVF-doxygen/html/html/functions_v.html +3 -3
- package/SVF-doxygen/html/html/mta_8cpp.html +2 -2
- package/SVF-doxygen/html/html/mta_8cpp_source.html +2 -2
- package/SVF-doxygen/html/html/namespaceSVF.html +4 -2
- package/SVF-doxygen/html/html/namespaceSVF_1_1LLVMUtil.html +1452 -0
- package/SVF-doxygen/html/html/namespaceSVF_1_1SVFUtil.html +41 -1409
- package/SVF-doxygen/html/html/namespaceSVF_1_1cppUtil.html +4 -4
- package/SVF-doxygen/html/html/namespacemembers.html +3 -3
- package/SVF-doxygen/html/html/namespacemembers_f.html +1 -1
- package/SVF-doxygen/html/html/namespacemembers_func.html +39 -39
- package/SVF-doxygen/html/html/namespacemembers_g.html +14 -14
- package/SVF-doxygen/html/html/namespacemembers_i.html +18 -18
- package/SVF-doxygen/html/html/namespacemembers_p.html +1 -1
- package/SVF-doxygen/html/html/namespacemembers_s.html +2 -2
- package/SVF-doxygen/html/html/namespaces.html +2 -1
- package/SVF-doxygen/html/html/saber_8cpp.html +2 -2
- package/SVF-doxygen/html/html/saber_8cpp_source.html +2 -2
- package/SVF-doxygen/html/html/search/all_1.js +3 -3
- package/SVF-doxygen/html/html/search/all_10.js +5 -5
- package/SVF-doxygen/html/html/search/all_12.js +1 -1
- package/SVF-doxygen/html/html/search/all_13.js +10 -9
- package/SVF-doxygen/html/html/search/all_14.js +2 -2
- package/SVF-doxygen/html/html/search/all_15.js +1 -1
- package/SVF-doxygen/html/html/search/all_16.js +2 -2
- package/SVF-doxygen/html/html/search/all_3.js +1 -0
- package/SVF-doxygen/html/html/search/all_6.js +1 -1
- package/SVF-doxygen/html/html/search/all_7.js +14 -14
- package/SVF-doxygen/html/html/search/all_9.js +18 -18
- package/SVF-doxygen/html/html/search/all_c.js +2 -2
- package/SVF-doxygen/html/html/search/all_e.js +3 -3
- package/SVF-doxygen/html/html/search/all_f.js +4 -4
- package/SVF-doxygen/html/html/search/functions_0.js +3 -3
- package/SVF-doxygen/html/html/search/functions_11.js +3 -3
- package/SVF-doxygen/html/html/search/functions_2.js +1 -0
- package/SVF-doxygen/html/html/search/functions_5.js +1 -1
- package/SVF-doxygen/html/html/search/functions_6.js +14 -14
- package/SVF-doxygen/html/html/search/functions_8.js +18 -18
- package/SVF-doxygen/html/html/search/functions_f.js +1 -1
- package/SVF-doxygen/html/html/search/namespaces_1.js +1 -0
- package/SVF-doxygen/html/html/search/variables_14.js +1 -1
- package/SVF-doxygen/html/html/search/variables_15.js +1 -1
- package/SVF-doxygen/html/html/search/variables_e.js +3 -3
- package/SVF-doxygen/html/html/svf-ex_8cpp.html +3 -3
- package/SVF-doxygen/html/html/svf-ex_8cpp_source.html +3 -3
- package/SVF-doxygen/html/html/wpa_8cpp.html +2 -2
- package/SVF-doxygen/html/html/wpa_8cpp_source.html +2 -2
- package/include/MTA/MHP.h +1 -1
- package/include/MemoryModel/SVFStatements.h +5 -3
- package/include/SVF-FE/LLVMUtil.h +7 -7
- package/include/SVF-FE/SymbolTableBuilder.h +2 -0
- package/lib/Graphs/ICFG.cpp +2 -2
- package/lib/MSSA/MemRegion.cpp +1 -0
- package/lib/MSSA/MemSSA.cpp +1 -0
- package/lib/MTA/LockAnalysis.cpp +1 -0
- package/lib/MemoryModel/LocationSet.cpp +1 -0
- package/lib/MemoryModel/PointerAnalysis.cpp +1 -0
- package/lib/MemoryModel/SVFIR.cpp +1 -1
- package/lib/MemoryModel/SymbolTableInfo.cpp +1 -0
- package/lib/SABER/LeakChecker.cpp +1 -0
- package/lib/SABER/PathCondAllocator.cpp +1 -0
- package/lib/SVF-FE/CHGBuilder.cpp +1 -0
- package/lib/SVF-FE/CPPUtil.cpp +2 -2
- package/lib/SVF-FE/ICFGBuilder.cpp +1 -0
- package/lib/SVF-FE/LLVMUtil.cpp +32 -32
- package/lib/SVF-FE/SVFIRBuilder.cpp +2 -1
- package/lib/SVF-FE/SymbolTableBuilder.cpp +22 -16
- package/lib/WPA/AndersenStat.cpp +1 -0
- package/lib/WPA/FlowSensitiveStat.cpp +1 -0
- package/package.json +1 -1
- package/tools/CFL/cfl.cpp +1 -1
- package/tools/DDA/dda.cpp +1 -1
- package/tools/Example/svf-ex.cpp +1 -1
- package/tools/MTA/mta.cpp +1 -1
- package/tools/SABER/saber.cpp +1 -1
- package/tools/WPA/wpa.cpp +1 -1
|
@@ -66,7 +66,7 @@ $(function() {
|
|
|
66
66
|
<div class="title">Casting.h</div> </div>
|
|
67
67
|
</div><!--header-->
|
|
68
68
|
<div class="contents">
|
|
69
|
-
<a href="Casting_8h.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">/*</span></div><div class="line"><a name="l00002"></a><span class="lineno"> 2</span> <span class="comment"> * Casting.h</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"> * Created on: 19Sep.,2018</span></div><div class="line"><a name="l00005"></a><span class="lineno"> 5</span> <span class="comment"> * Author: yulei</span></div><div class="line"><a name="l00006"></a><span class="lineno"> 6</span> <span class="comment"> */</span></div><div class="line"><a name="l00007"></a><span class="lineno"> 7</span> </div><div class="line"><a name="l00008"></a><span class="lineno"> 8</span> <span class="preprocessor">#ifndef INCLUDE_UTIL_CASTING_H_</span></div><div class="line"><a name="l00009"></a><span class="lineno"> 9</span> <span class="preprocessor">#define INCLUDE_UTIL_CASTING_H_</span></div><div class="line"><a name="l00010"></a><span class="lineno"> 10</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="comment">//===- llvm/Support/Casting.h - Allow flexible, checked, casts --*- C++ -*-===//</span></div><div class="line"><a name="l00013"></a><span class="lineno"> 13</span> <span class="comment">//</span></div><div class="line"><a name="l00014"></a><span class="lineno"> 14</span> <span class="comment">// The LLVM Compiler Infrastructure</span></div><div class="line"><a name="l00015"></a><span class="lineno"> 15</span> <span class="comment">//</span></div><div class="line"><a name="l00016"></a><span class="lineno"> 16</span> <span class="comment">// This file is distributed under the University of Illinois Open Source</span></div><div class="line"><a name="l00017"></a><span class="lineno"> 17</span> <span class="comment">// License. See LICENSE.TXT for details.</span></div><div class="line"><a name="l00018"></a><span class="lineno"> 18</span> <span class="comment">//</span></div><div class="line"><a name="l00019"></a><span class="lineno"> 19</span> <span class="comment">//===----------------------------------------------------------------------===//</span></div><div class="line"><a name="l00020"></a><span class="lineno"> 20</span> <span class="comment">//</span></div><div class="line"><a name="l00021"></a><span class="lineno"> 21</span> <span class="comment">// This file defines the llvm::isa<X>(), cast<X>(), dyn_cast<X>(), cast_or_null<X>(),</span></div><div class="line"><a name="l00022"></a><span class="lineno"> 22</span> <span class="comment">// and dyn_cast_or_null<X>() templates.</span></div><div class="line"><a name="l00023"></a><span class="lineno"> 23</span> <span class="comment">//</span></div><div class="line"><a name="l00024"></a><span class="lineno"> 24</span> <span class="comment">//===----------------------------------------------------------------------===//</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"> 26</span> <span class="preprocessor">#include <llvm/Support/Compiler.h></span></div><div class="line"><a name="l00027"></a><span class="lineno"> 27</span> <span class="preprocessor">#include <llvm/Support/type_traits.h></span></div><div class="line"><a name="l00028"></a><span class="lineno"> 28</span> <span class="preprocessor">#include <cassert></span></div><div class="line"><a name="l00029"></a><span class="lineno"> 29</span> <span class="preprocessor">#include <memory></span></div><div class="line"><a name="l00030"></a><span class="lineno"> 30</span> <span class="preprocessor">#include <type_traits></span></div><div class="line"><a name="l00031"></a><span class="lineno"> 31</span> </div><div class="line"><a name="l00032"></a><span class="lineno"> 32</span> <span class="keyword">namespace </span><a class="code" href="namespaceSVF.html">SVF</a></div><div class="line"><a name="l00033"></a><span class="lineno"> 33</span> {</div><div class="line"><a name="l00034"></a><span class="lineno"> 34</span> </div><div class="line"><a name="l00035"></a><span class="lineno"> 35</span> <span class="keyword">namespace </span>SVFUtil</div><div class="line"><a name="l00036"></a><span class="lineno"> 36</span> {</div><div class="line"><a name="l00037"></a><span class="lineno"> 37</span> </div><div class="line"><a name="l00038"></a><span class="lineno"> 38</span> <span class="comment">//===----------------------------------------------------------------------===//</span></div><div class="line"><a name="l00039"></a><span class="lineno"> 39</span> <span class="comment">// llvm::isa<x> Support Templates</span></div><div class="line"><a name="l00040"></a><span class="lineno"> 40</span> <span class="comment">//===----------------------------------------------------------------------===//</span></div><div class="line"><a name="l00041"></a><span class="lineno"> 41</span> </div><div class="line"><a name="l00042"></a><span class="lineno"> 42</span> <span class="comment">// Define a template that can be specialized by smart pointers to reflect the</span></div><div class="line"><a name="l00043"></a><span class="lineno"> 43</span> <span class="comment">// fact that they are automatically dereferenced, and are not involved with the</span></div><div class="line"><a name="l00044"></a><span class="lineno"> 44</span> <span class="comment">// template selection process... the default implementation is a noop.</span></div><div class="line"><a name="l00045"></a><span class="lineno"> 45</span> <span class="comment">//</span></div><div class="line"><a name="l00046"></a><span class="lineno"><a class="line" href="structSVF_1_1SVFUtil_1_1simplify__type.html"> 46</a></span> <span class="keyword">template</span><<span class="keyword">typename</span> From> <span class="keyword">struct </span><a class="code" href="structSVF_1_1SVFUtil_1_1simplify__type.html">simplify_type</a></div><div class="line"><a name="l00047"></a><span class="lineno"> 47</span> {</div><div class="line"><a name="l00048"></a><span class="lineno"><a class="line" href="structSVF_1_1SVFUtil_1_1simplify__type.html#a40c0d9a74681d3eaa7172ba137d489e4"> 48</a></span>  <span class="keyword">using</span> <a class="code" href="structSVF_1_1SVFUtil_1_1simplify__type.html#a40c0d9a74681d3eaa7172ba137d489e4">SimpleType</a> = From; <span class="comment">// The real type this represents...</span></div><div class="line"><a name="l00049"></a><span class="lineno"> 49</span> </div><div class="line"><a name="l00050"></a><span class="lineno"> 50</span>  <span class="comment">// An accessor to get the real value...</span></div><div class="line"><a name="l00051"></a><span class="lineno"><a class="line" href="structSVF_1_1SVFUtil_1_1simplify__type.html#a8046f044d895a5c9aee85de9705161f9"> 51</a></span>  <span class="keyword">static</span> <a class="code" href="structSVF_1_1SVFUtil_1_1simplify__type.html#a40c0d9a74681d3eaa7172ba137d489e4">SimpleType</a> &<a class="code" href="structSVF_1_1SVFUtil_1_1simplify__type.html#a8046f044d895a5c9aee85de9705161f9">getSimplifiedValue</a>(From &Val)</div><div class="line"><a name="l00052"></a><span class="lineno"> 52</span>  {</div><div class="line"><a name="l00053"></a><span class="lineno"> 53</span>  <span class="keywordflow">return</span> Val;</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"><a class="line" href="structSVF_1_1SVFUtil_1_1simplify__type_3_01const_01From_01_4.html"> 57</a></span> <span class="keyword">template</span><<span class="keyword">typename</span> From> <span class="keyword">struct </span><a class="code" href="structSVF_1_1SVFUtil_1_1simplify__type.html">simplify_type</a><const From></div><div class="line"><a name="l00058"></a><span class="lineno"> 58</span> {</div><div class="line"><a name="l00059"></a><span class="lineno"><a class="line" href="structSVF_1_1SVFUtil_1_1simplify__type_3_01const_01From_01_4.html#aadddb18b44c9744dcc639a3de603151d"> 59</a></span>  <span class="keyword">using</span> <a class="code" href="structSVF_1_1SVFUtil_1_1simplify__type_3_01const_01From_01_4.html#aadddb18b44c9744dcc639a3de603151d">NonConstSimpleType</a> = <span class="keyword">typename</span> <a class="code" href="structSVF_1_1SVFUtil_1_1simplify__type.html#a40c0d9a74681d3eaa7172ba137d489e4">simplify_type<From>::SimpleType</a>;</div><div class="line"><a name="l00060"></a><span class="lineno"> 60</span>  <span class="keyword">using</span> <a class="code" href="structSVF_1_1SVFUtil_1_1simplify__type_3_01const_01From_01_4.html#afdc334dc0c584651f9ab538e38cf3aff">SimpleType</a> =</div><div class="line"><a name="l00061"></a><span class="lineno"><a class="line" href="structSVF_1_1SVFUtil_1_1simplify__type_3_01const_01From_01_4.html#afdc334dc0c584651f9ab538e38cf3aff"> 61</a></span>  <span class="keyword">typename</span> llvm::add_const_past_pointer<NonConstSimpleType>::type;</div><div class="line"><a name="l00062"></a><span class="lineno"> 62</span>  <span class="keyword">using</span> <a class="code" href="structSVF_1_1SVFUtil_1_1simplify__type_3_01const_01From_01_4.html#ae6f5437cb8355759aadc78fca716bc6a">RetType</a> =</div><div class="line"><a name="l00063"></a><span class="lineno"><a class="line" href="structSVF_1_1SVFUtil_1_1simplify__type_3_01const_01From_01_4.html#ae6f5437cb8355759aadc78fca716bc6a"> 63</a></span>  <span class="keyword">typename</span> llvm::add_lvalue_reference_if_not_pointer<SimpleType>::type;</div><div class="line"><a name="l00064"></a><span class="lineno"> 64</span> </div><div class="line"><a name="l00065"></a><span class="lineno"><a class="line" href="structSVF_1_1SVFUtil_1_1simplify__type_3_01const_01From_01_4.html#ac64f5d9a2ec97aebd7b377319d7f043b"> 65</a></span>  <span class="keyword">static</span> <a class="code" href="structSVF_1_1SVFUtil_1_1simplify__type_3_01const_01From_01_4.html#ae6f5437cb8355759aadc78fca716bc6a">RetType</a> <a class="code" href="structSVF_1_1SVFUtil_1_1simplify__type_3_01const_01From_01_4.html#ac64f5d9a2ec97aebd7b377319d7f043b">getSimplifiedValue</a>(<span class="keyword">const</span> From& Val)</div><div class="line"><a name="l00066"></a><span class="lineno"> 66</span>  {</div><div class="line"><a name="l00067"></a><span class="lineno"> 67</span>  <span class="keywordflow">return</span> <a class="code" href="structSVF_1_1SVFUtil_1_1simplify__type.html#a8046f044d895a5c9aee85de9705161f9">simplify_type<From>::getSimplifiedValue</a>(const_cast<From&>(Val));</div><div class="line"><a name="l00068"></a><span class="lineno"> 68</span>  }</div><div class="line"><a name="l00069"></a><span class="lineno"> 69</span> };</div><div class="line"><a name="l00070"></a><span class="lineno"> 70</span> </div><div class="line"><a name="l00071"></a><span class="lineno"> 71</span> <span class="comment">// The core of the implementation of llvm::isa<X> is here; To and From should be</span></div><div class="line"><a name="l00072"></a><span class="lineno"> 72</span> <span class="comment">// the names of classes. This template can be specialized to customize the</span></div><div class="line"><a name="l00073"></a><span class="lineno"> 73</span> <span class="comment">// implementation of llvm::isa<> without rewriting it from scratch.</span></div><div class="line"><a name="l00074"></a><span class="lineno"> 74</span> <span class="keyword">template</span> <<span class="keyword">typename</span> To, <span class="keyword">typename</span> From, <span class="keyword">typename</span> Enabler = <span class="keywordtype">void</span>></div><div class="line"><a name="l00075"></a><span class="lineno"><a class="line" href="structSVF_1_1SVFUtil_1_1isa__impl.html"> 75</a></span> <span class="keyword">struct </span><a class="code" href="structSVF_1_1SVFUtil_1_1isa__impl.html">isa_impl</a></div><div class="line"><a name="l00076"></a><span class="lineno"> 76</span> {</div><div class="line"><a name="l00077"></a><span class="lineno"><a class="line" href="structSVF_1_1SVFUtil_1_1isa__impl.html#a150c6a99c45befa44a4cd2bcc8d06eee"> 77</a></span>  <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">bool</span> <a class="code" href="structSVF_1_1SVFUtil_1_1isa__impl.html#a150c6a99c45befa44a4cd2bcc8d06eee">doit</a>(<span class="keyword">const</span> From &Val)</div><div class="line"><a name="l00078"></a><span class="lineno"> 78</span>  {</div><div class="line"><a name="l00079"></a><span class="lineno"> 79</span>  <span class="keywordflow">return</span> To::classof(&Val);</div><div class="line"><a name="l00080"></a><span class="lineno"> 80</span>  }</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="l00084"></a><span class="lineno"> 84</span> <span class="keyword">template</span> <<span class="keyword">typename</span> To, <span class="keyword">typename</span> From></div><div class="line"><a name="l00085"></a><span class="lineno"><a class="line" href="structSVF_1_1SVFUtil_1_1isa__impl_3_01To_00_01From_00_01typename_01std_1_1enable__if_3_01std_1_1101a002941fb8432b76e90258f1ec6b7.html"> 85</a></span> <span class="keyword">struct </span><a class="code" href="structSVF_1_1SVFUtil_1_1isa__impl.html">isa_impl</a><</div><div class="line"><a name="l00086"></a><span class="lineno"> 86</span>  To, From, typename <a class="code" href="namespacestd.html">std</a>::enable_if<std::is_base_of<To, From>::value>::type></div><div class="line"><a name="l00087"></a><span class="lineno"> 87</span> {</div><div class="line"><a name="l00088"></a><span class="lineno"><a class="line" href="structSVF_1_1SVFUtil_1_1isa__impl_3_01To_00_01From_00_01typename_01std_1_1enable__if_3_01std_1_1101a002941fb8432b76e90258f1ec6b7.html#a0da9525f6f39a3eb9ce9275731c2ad64"> 88</a></span>  <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">bool</span> <a class="code" href="structSVF_1_1SVFUtil_1_1isa__impl_3_01To_00_01From_00_01typename_01std_1_1enable__if_3_01std_1_1101a002941fb8432b76e90258f1ec6b7.html#a0da9525f6f39a3eb9ce9275731c2ad64">doit</a>(<span class="keyword">const</span> From &)</div><div class="line"><a name="l00089"></a><span class="lineno"> 89</span>  {</div><div class="line"><a name="l00090"></a><span class="lineno"> 90</span>  <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l00091"></a><span class="lineno"> 91</span>  }</div><div class="line"><a name="l00092"></a><span class="lineno"> 92</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"><a class="line" href="structSVF_1_1SVFUtil_1_1isa__impl__cl.html"> 94</a></span> <span class="keyword">template</span> <<span class="keyword">typename</span> To, <span class="keyword">typename</span> From> <span class="keyword">struct </span><a class="code" href="structSVF_1_1SVFUtil_1_1isa__impl__cl.html">isa_impl_cl</a></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="structSVF_1_1SVFUtil_1_1isa__impl__cl.html#afbe68352d888c0b15e9f46d4e378bacb"> 96</a></span>  <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">bool</span> <a class="code" href="structSVF_1_1SVFUtil_1_1isa__impl__cl.html#afbe68352d888c0b15e9f46d4e378bacb">doit</a>(<span class="keyword">const</span> From &Val)</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">return</span> <a class="code" href="structSVF_1_1SVFUtil_1_1isa__impl.html#a150c6a99c45befa44a4cd2bcc8d06eee">isa_impl<To, From>::doit</a>(Val);</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> };</div><div class="line"><a name="l00101"></a><span class="lineno"> 101</span> </div><div class="line"><a name="l00102"></a><span class="lineno"><a class="line" href="structSVF_1_1SVFUtil_1_1isa__impl__cl_3_01To_00_01const_01From_01_4.html"> 102</a></span> <span class="keyword">template</span> <<span class="keyword">typename</span> To, <span class="keyword">typename</span> From> <span class="keyword">struct </span><a class="code" href="structSVF_1_1SVFUtil_1_1isa__impl__cl.html">isa_impl_cl</a><To, const From></div><div class="line"><a name="l00103"></a><span class="lineno"> 103</span> {</div><div class="line"><a name="l00104"></a><span class="lineno"><a class="line" href="structSVF_1_1SVFUtil_1_1isa__impl__cl_3_01To_00_01const_01From_01_4.html#af9a6a9c7660d5daedf8cd907788ac78d"> 104</a></span>  <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">bool</span> <a class="code" href="structSVF_1_1SVFUtil_1_1isa__impl__cl_3_01To_00_01const_01From_01_4.html#af9a6a9c7660d5daedf8cd907788ac78d">doit</a>(<span class="keyword">const</span> From &Val)</div><div class="line"><a name="l00105"></a><span class="lineno"> 105</span>  {</div><div class="line"><a name="l00106"></a><span class="lineno"> 106</span>  <span class="keywordflow">return</span> <a class="code" href="structSVF_1_1SVFUtil_1_1isa__impl.html#a150c6a99c45befa44a4cd2bcc8d06eee">isa_impl<To, From>::doit</a>(Val);</div><div class="line"><a name="l00107"></a><span class="lineno"> 107</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> </div><div class="line"><a name="l00110"></a><span class="lineno"> 110</span> <span class="keyword">template</span> <<span class="keyword">typename</span> To, <span class="keyword">typename</span> From></div><div class="line"><a name="l00111"></a><span class="lineno"><a class="line" href="structSVF_1_1SVFUtil_1_1isa__impl__cl_3_01To_00_01const_01std_1_1unique__ptr_3_01From_01_4_01_4.html"> 111</a></span> <span class="keyword">struct </span><a class="code" href="structSVF_1_1SVFUtil_1_1isa__impl__cl.html">isa_impl_cl</a><To, const <a class="code" href="namespacestd.html">std</a>::unique_ptr<From>></div><div class="line"><a name="l00112"></a><span class="lineno"> 112</span> {</div><div class="line"><a name="l00113"></a><span class="lineno"><a class="line" href="structSVF_1_1SVFUtil_1_1isa__impl__cl_3_01To_00_01const_01std_1_1unique__ptr_3_01From_01_4_01_4.html#aff368847551a69d07b06237908594852"> 113</a></span>  <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">bool</span> <a class="code" href="structSVF_1_1SVFUtil_1_1isa__impl__cl_3_01To_00_01const_01std_1_1unique__ptr_3_01From_01_4_01_4.html#aff368847551a69d07b06237908594852">doit</a>(<span class="keyword">const</span> std::unique_ptr<From> &Val)</div><div class="line"><a name="l00114"></a><span class="lineno"> 114</span>  {</div><div class="line"><a name="l00115"></a><span class="lineno"> 115</span>  <a class="code" href="util_8h.html#a07d17d6d5d1074c0969bc5d3c3d1d84a">assert</a>(Val && <span class="stringliteral">"llvm::isa<> used on a null pointer"</span>);</div><div class="line"><a name="l00116"></a><span class="lineno"> 116</span>  <span class="keywordflow">return</span> <a class="code" href="structSVF_1_1SVFUtil_1_1isa__impl__cl.html#afbe68352d888c0b15e9f46d4e378bacb">isa_impl_cl<To, From>::doit</a>(*Val);</div><div class="line"><a name="l00117"></a><span class="lineno"> 117</span>  }</div><div class="line"><a name="l00118"></a><span class="lineno"> 118</span> };</div><div class="line"><a name="l00119"></a><span class="lineno"> 119</span> </div><div class="line"><a name="l00120"></a><span class="lineno"><a class="line" href="structSVF_1_1SVFUtil_1_1isa__impl__cl_3_01To_00_01From_01_5_01_4.html"> 120</a></span> <span class="keyword">template</span> <<span class="keyword">typename</span> To, <span class="keyword">typename</span> From> <span class="keyword">struct </span><a class="code" href="structSVF_1_1SVFUtil_1_1isa__impl__cl.html">isa_impl_cl</a><To, From*></div><div class="line"><a name="l00121"></a><span class="lineno"> 121</span> {</div><div class="line"><a name="l00122"></a><span class="lineno"><a class="line" href="structSVF_1_1SVFUtil_1_1isa__impl__cl_3_01To_00_01From_01_5_01_4.html#a8add67bd107583b7c34fce53a748bcb0"> 122</a></span>  <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">bool</span> <a class="code" href="structSVF_1_1SVFUtil_1_1isa__impl__cl_3_01To_00_01From_01_5_01_4.html#a8add67bd107583b7c34fce53a748bcb0">doit</a>(<span class="keyword">const</span> From *Val)</div><div class="line"><a name="l00123"></a><span class="lineno"> 123</span>  {</div><div class="line"><a name="l00124"></a><span class="lineno"> 124</span>  <a class="code" href="util_8h.html#a07d17d6d5d1074c0969bc5d3c3d1d84a">assert</a>(Val && <span class="stringliteral">"llvm::isa<> used on a null pointer"</span>);</div><div class="line"><a name="l00125"></a><span class="lineno"> 125</span>  <span class="keywordflow">return</span> <a class="code" href="structSVF_1_1SVFUtil_1_1isa__impl.html#a150c6a99c45befa44a4cd2bcc8d06eee">isa_impl<To, From>::doit</a>(*Val);</div><div class="line"><a name="l00126"></a><span class="lineno"> 126</span>  }</div><div class="line"><a name="l00127"></a><span class="lineno"> 127</span> };</div><div class="line"><a name="l00128"></a><span class="lineno"> 128</span> </div><div class="line"><a name="l00129"></a><span class="lineno"><a class="line" href="structSVF_1_1SVFUtil_1_1isa__impl__cl_3_01To_00_01From_01_5const_01_4.html"> 129</a></span> <span class="keyword">template</span> <<span class="keyword">typename</span> To, <span class="keyword">typename</span> From> <span class="keyword">struct </span><a class="code" href="structSVF_1_1SVFUtil_1_1isa__impl__cl.html">isa_impl_cl</a><To, From*<span class="keyword">const</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"><a class="line" href="structSVF_1_1SVFUtil_1_1isa__impl__cl_3_01To_00_01From_01_5const_01_4.html#ac95b00b5d96e6b8457ecade4dbda3de3"> 131</a></span>  <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">bool</span> <a class="code" href="structSVF_1_1SVFUtil_1_1isa__impl__cl_3_01To_00_01From_01_5const_01_4.html#ac95b00b5d96e6b8457ecade4dbda3de3">doit</a>(<span class="keyword">const</span> From *Val)</div><div class="line"><a name="l00132"></a><span class="lineno"> 132</span>  {</div><div class="line"><a name="l00133"></a><span class="lineno"> 133</span>  <a class="code" href="util_8h.html#a07d17d6d5d1074c0969bc5d3c3d1d84a">assert</a>(Val && <span class="stringliteral">"llvm::isa<> used on a null pointer"</span>);</div><div class="line"><a name="l00134"></a><span class="lineno"> 134</span>  <span class="keywordflow">return</span> <a class="code" href="structSVF_1_1SVFUtil_1_1isa__impl.html#a150c6a99c45befa44a4cd2bcc8d06eee">isa_impl<To, From>::doit</a>(*Val);</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"> 137</span> </div><div class="line"><a name="l00138"></a><span class="lineno"><a class="line" href="structSVF_1_1SVFUtil_1_1isa__impl__cl_3_01To_00_01const_01From_01_5_01_4.html"> 138</a></span> <span class="keyword">template</span> <<span class="keyword">typename</span> To, <span class="keyword">typename</span> From> <span class="keyword">struct </span><a class="code" href="structSVF_1_1SVFUtil_1_1isa__impl__cl.html">isa_impl_cl</a><To, const From*></div><div class="line"><a name="l00139"></a><span class="lineno"> 139</span> {</div><div class="line"><a name="l00140"></a><span class="lineno"><a class="line" href="structSVF_1_1SVFUtil_1_1isa__impl__cl_3_01To_00_01const_01From_01_5_01_4.html#a761b612c6ee476a28aabfbbc6b2da7ab"> 140</a></span>  <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">bool</span> <a class="code" href="structSVF_1_1SVFUtil_1_1isa__impl__cl_3_01To_00_01const_01From_01_5_01_4.html#a761b612c6ee476a28aabfbbc6b2da7ab">doit</a>(<span class="keyword">const</span> From *Val)</div><div class="line"><a name="l00141"></a><span class="lineno"> 141</span>  {</div><div class="line"><a name="l00142"></a><span class="lineno"> 142</span>  <a class="code" href="util_8h.html#a07d17d6d5d1074c0969bc5d3c3d1d84a">assert</a>(Val && <span class="stringliteral">"llvm::isa<> used on a null pointer"</span>);</div><div class="line"><a name="l00143"></a><span class="lineno"> 143</span>  <span class="keywordflow">return</span> <a class="code" href="structSVF_1_1SVFUtil_1_1isa__impl.html#a150c6a99c45befa44a4cd2bcc8d06eee">isa_impl<To, From>::doit</a>(*Val);</div><div class="line"><a name="l00144"></a><span class="lineno"> 144</span>  }</div><div class="line"><a name="l00145"></a><span class="lineno"> 145</span> };</div><div class="line"><a name="l00146"></a><span class="lineno"> 146</span> </div><div class="line"><a name="l00147"></a><span class="lineno"><a class="line" href="structSVF_1_1SVFUtil_1_1isa__impl__cl_3_01To_00_01const_01From_01_5const_01_4.html"> 147</a></span> <span class="keyword">template</span> <<span class="keyword">typename</span> To, <span class="keyword">typename</span> From> <span class="keyword">struct </span><a class="code" href="structSVF_1_1SVFUtil_1_1isa__impl__cl.html">isa_impl_cl</a><To, const From*<span class="keyword">const</span>></div><div class="line"><a name="l00148"></a><span class="lineno"> 148</span> {</div><div class="line"><a name="l00149"></a><span class="lineno"><a class="line" href="structSVF_1_1SVFUtil_1_1isa__impl__cl_3_01To_00_01const_01From_01_5const_01_4.html#af73d1d0d7eb6f51090b4df47b497483a"> 149</a></span>  <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">bool</span> <a class="code" href="structSVF_1_1SVFUtil_1_1isa__impl__cl_3_01To_00_01const_01From_01_5const_01_4.html#af73d1d0d7eb6f51090b4df47b497483a">doit</a>(<span class="keyword">const</span> From *Val)</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>  <a class="code" href="util_8h.html#a07d17d6d5d1074c0969bc5d3c3d1d84a">assert</a>(Val && <span class="stringliteral">"llvm::isa<> used on a null pointer"</span>);</div><div class="line"><a name="l00152"></a><span class="lineno"> 152</span>  <span class="keywordflow">return</span> <a class="code" href="structSVF_1_1SVFUtil_1_1isa__impl.html#a150c6a99c45befa44a4cd2bcc8d06eee">isa_impl<To, From>::doit</a>(*Val);</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> </div><div class="line"><a name="l00156"></a><span class="lineno"> 156</span> <span class="keyword">template</span><<span class="keyword">typename</span> To, <span class="keyword">typename</span> From, <span class="keyword">typename</span> SimpleFrom></div><div class="line"><a name="l00157"></a><span class="lineno"><a class="line" href="structSVF_1_1SVFUtil_1_1isa__impl__wrap.html"> 157</a></span> <span class="keyword">struct </span><a class="code" href="structSVF_1_1SVFUtil_1_1isa__impl__wrap.html">isa_impl_wrap</a></div><div class="line"><a name="l00158"></a><span class="lineno"> 158</span> {</div><div class="line"><a name="l00159"></a><span class="lineno"> 159</span>  <span class="comment">// When From != SimplifiedType, we can simplify the type some more by using</span></div><div class="line"><a name="l00160"></a><span class="lineno"> 160</span>  <span class="comment">// the simplify_type template.</span></div><div class="line"><a name="l00161"></a><span class="lineno"><a class="line" href="structSVF_1_1SVFUtil_1_1isa__impl__wrap.html#aa0f166d8bdcd1e7b954cc29c19a40b04"> 161</a></span>  <span class="keyword">static</span> <span class="keywordtype">bool</span> <a class="code" href="structSVF_1_1SVFUtil_1_1isa__impl__wrap.html#aa0f166d8bdcd1e7b954cc29c19a40b04">doit</a>(<span class="keyword">const</span> From &Val)</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>  <span class="keywordflow">return</span> <a class="code" href="structSVF_1_1SVFUtil_1_1isa__impl__wrap.html">isa_impl_wrap</a><To, SimpleFrom,</div><div class="line"><a name="l00164"></a><span class="lineno"> 164</span>  <span class="keyword">typename</span> <a class="code" href="structSVF_1_1SVFUtil_1_1simplify__type.html#a40c0d9a74681d3eaa7172ba137d489e4">simplify_type<SimpleFrom>::SimpleType</a>>::doit(</div><div class="line"><a name="l00165"></a><span class="lineno"> 165</span>  <a class="code" href="structSVF_1_1SVFUtil_1_1simplify__type.html">simplify_type<const From>::getSimplifiedValue</a>(Val));</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> };</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="keyword">template</span><<span class="keyword">typename</span> To, <span class="keyword">typename</span> FromTy></div><div class="line"><a name="l00170"></a><span class="lineno"><a class="line" href="structSVF_1_1SVFUtil_1_1isa__impl__wrap_3_01To_00_01FromTy_00_01FromTy_01_4.html"> 170</a></span> <span class="keyword">struct </span><a class="code" href="structSVF_1_1SVFUtil_1_1isa__impl__wrap.html">isa_impl_wrap</a><To, FromTy, FromTy></div><div class="line"><a name="l00171"></a><span class="lineno"> 171</span> {</div><div class="line"><a name="l00172"></a><span class="lineno"> 172</span>  <span class="comment">// When From == SimpleType, we are as simple as we are going to get.</span></div><div class="line"><a name="l00173"></a><span class="lineno"><a class="line" href="structSVF_1_1SVFUtil_1_1isa__impl__wrap_3_01To_00_01FromTy_00_01FromTy_01_4.html#a414dc089b04305b8580dede7a6337404"> 173</a></span>  <span class="keyword">static</span> <span class="keywordtype">bool</span> <a class="code" href="structSVF_1_1SVFUtil_1_1isa__impl__wrap_3_01To_00_01FromTy_00_01FromTy_01_4.html#a414dc089b04305b8580dede7a6337404">doit</a>(<span class="keyword">const</span> FromTy &Val)</div><div class="line"><a name="l00174"></a><span class="lineno"> 174</span>  {</div><div class="line"><a name="l00175"></a><span class="lineno"> 175</span>  <span class="keywordflow">return</span> <a class="code" href="structSVF_1_1SVFUtil_1_1isa__impl__cl.html#afbe68352d888c0b15e9f46d4e378bacb">isa_impl_cl<To,FromTy>::doit</a>(Val);</div><div class="line"><a name="l00176"></a><span class="lineno"> 176</span>  }</div><div class="line"><a name="l00177"></a><span class="lineno"> 177</span> };</div><div class="line"><a name="l00178"></a><span class="lineno"> 178</span> </div><div class="line"><a name="l00179"></a><span class="lineno"> 179</span> <span class="comment">// llvm::isa<X> - Return true if the parameter to the template is an instance of the</span></div><div class="line"><a name="l00180"></a><span class="lineno"> 180</span> <span class="comment">// template type argument. Used like this:</span></div><div class="line"><a name="l00181"></a><span class="lineno"> 181</span> <span class="comment">//</span></div><div class="line"><a name="l00182"></a><span class="lineno"> 182</span> <span class="comment">// if (llvm::isa<Type>(myVal)) { ... }</span></div><div class="line"><a name="l00183"></a><span class="lineno"> 183</span> <span class="comment">//</span></div><div class="line"><a name="l00184"></a><span class="lineno"><a class="line" href="namespaceSVF_1_1SVFUtil.html#a5c8cbc986cccb9d84f87aae162df3737"> 184</a></span> <span class="keyword">template</span> <<span class="keyword">class</span> X, <span class="keyword">class</span> Y> LLVM_NODISCARD <span class="keyword">inline</span> <span class="keywordtype">bool</span> <a class="code" href="namespaceSVF_1_1SVFUtil.html#a5c8cbc986cccb9d84f87aae162df3737">isa</a>(<span class="keyword">const</span> Y &Val)</div><div class="line"><a name="l00185"></a><span class="lineno"> 185</span> {</div><div class="line"><a name="l00186"></a><span class="lineno"> 186</span>  <span class="keywordflow">return</span> <a class="code" href="structSVF_1_1SVFUtil_1_1isa__impl__wrap.html">isa_impl_wrap</a><X, <span class="keyword">const</span> Y,</div><div class="line"><a name="l00187"></a><span class="lineno"> 187</span>  <span class="keyword">typename</span> <a class="code" href="structSVF_1_1SVFUtil_1_1simplify__type.html#a40c0d9a74681d3eaa7172ba137d489e4">simplify_type<const Y>::SimpleType</a>>::doit(Val);</div><div class="line"><a name="l00188"></a><span class="lineno"> 188</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> <span class="comment">//===----------------------------------------------------------------------===//</span></div><div class="line"><a name="l00191"></a><span class="lineno"> 191</span> <span class="comment">// cast<x> Support Templates</span></div><div class="line"><a name="l00192"></a><span class="lineno"> 192</span> <span class="comment">//===----------------------------------------------------------------------===//</span></div><div class="line"><a name="l00193"></a><span class="lineno"> 193</span> </div><div class="line"><a name="l00194"></a><span class="lineno"><a class="line" href="structSVF_1_1SVFUtil_1_1cast__retty.html"> 194</a></span> <span class="keyword">template</span><<span class="keyword">class</span> To, <span class="keyword">class</span> From> <span class="keyword">struct </span><a class="code" href="structSVF_1_1SVFUtil_1_1cast__retty.html">cast_retty</a>;</div><div class="line"><a name="l00195"></a><span class="lineno"> 195</span> </div><div class="line"><a name="l00196"></a><span class="lineno"> 196</span> <span class="comment">// Calculate what type the 'cast' function should return, based on a requested</span></div><div class="line"><a name="l00197"></a><span class="lineno"> 197</span> <span class="comment">// type of To and a source type of From.</span></div><div class="line"><a name="l00198"></a><span class="lineno"><a class="line" href="structSVF_1_1SVFUtil_1_1cast__retty__impl.html"> 198</a></span> <span class="keyword">template</span><<span class="keyword">class</span> To, <span class="keyword">class</span> From> <span class="keyword">struct </span><a class="code" href="structSVF_1_1SVFUtil_1_1cast__retty__impl.html">cast_retty_impl</a></div><div class="line"><a name="l00199"></a><span class="lineno"> 199</span> {</div><div class="line"><a name="l00200"></a><span class="lineno"><a class="line" href="structSVF_1_1SVFUtil_1_1cast__retty__impl.html#a5f8f6d651931eba7e0fa14c26a691a04"> 200</a></span>  <span class="keyword">using</span> <a class="code" href="structSVF_1_1SVFUtil_1_1cast__retty__impl.html#a5f8f6d651931eba7e0fa14c26a691a04">ret_type</a> = To &; <span class="comment">// Normal case, return Ty&</span></div><div class="line"><a name="l00201"></a><span class="lineno"> 201</span> };</div><div class="line"><a name="l00202"></a><span class="lineno"><a class="line" href="structSVF_1_1SVFUtil_1_1cast__retty__impl_3_01To_00_01const_01From_01_4.html"> 202</a></span> <span class="keyword">template</span><<span class="keyword">class</span> To, <span class="keyword">class</span> From> <span class="keyword">struct </span><a class="code" href="structSVF_1_1SVFUtil_1_1cast__retty__impl.html">cast_retty_impl</a><To, const From></div><div class="line"><a name="l00203"></a><span class="lineno"> 203</span> {</div><div class="line"><a name="l00204"></a><span class="lineno"><a class="line" href="structSVF_1_1SVFUtil_1_1cast__retty__impl_3_01To_00_01const_01From_01_4.html#ad0bc349135b60cc51fd040b615a979f7"> 204</a></span>  <span class="keyword">using</span> <a class="code" href="structSVF_1_1SVFUtil_1_1cast__retty__impl_3_01To_00_01const_01From_01_4.html#ad0bc349135b60cc51fd040b615a979f7">ret_type</a> = <span class="keyword">const</span> To &; <span class="comment">// Normal case, return Ty&</span></div><div class="line"><a name="l00205"></a><span class="lineno"> 205</span> };</div><div class="line"><a name="l00206"></a><span class="lineno"> 206</span> </div><div class="line"><a name="l00207"></a><span class="lineno"><a class="line" href="structSVF_1_1SVFUtil_1_1cast__retty__impl_3_01To_00_01From_01_5_01_4.html"> 207</a></span> <span class="keyword">template</span><<span class="keyword">class</span> To, <span class="keyword">class</span> From> <span class="keyword">struct </span><a class="code" href="structSVF_1_1SVFUtil_1_1cast__retty__impl.html">cast_retty_impl</a><To, From*></div><div class="line"><a name="l00208"></a><span class="lineno"> 208</span> {</div><div class="line"><a name="l00209"></a><span class="lineno"><a class="line" href="structSVF_1_1SVFUtil_1_1cast__retty__impl_3_01To_00_01From_01_5_01_4.html#a86c02dc15b65d0c052ea4447b3fb6333"> 209</a></span>  <span class="keyword">using</span> <a class="code" href="structSVF_1_1SVFUtil_1_1cast__retty__impl_3_01To_00_01From_01_5_01_4.html#a86c02dc15b65d0c052ea4447b3fb6333">ret_type</a> = To *; <span class="comment">// Pointer arg case, return Ty*</span></div><div class="line"><a name="l00210"></a><span class="lineno"> 210</span> };</div><div class="line"><a name="l00211"></a><span class="lineno"> 211</span> </div><div class="line"><a name="l00212"></a><span class="lineno"><a class="line" href="structSVF_1_1SVFUtil_1_1cast__retty__impl_3_01To_00_01const_01From_01_5_01_4.html"> 212</a></span> <span class="keyword">template</span><<span class="keyword">class</span> To, <span class="keyword">class</span> From> <span class="keyword">struct </span><a class="code" href="structSVF_1_1SVFUtil_1_1cast__retty__impl.html">cast_retty_impl</a><To, const From*></div><div class="line"><a name="l00213"></a><span class="lineno"> 213</span> {</div><div class="line"><a name="l00214"></a><span class="lineno"><a class="line" href="structSVF_1_1SVFUtil_1_1cast__retty__impl_3_01To_00_01const_01From_01_5_01_4.html#a98a60de95a331a34dcbad6da9961a9b7"> 214</a></span>  <span class="keyword">using</span> <a class="code" href="structSVF_1_1SVFUtil_1_1cast__retty__impl_3_01To_00_01const_01From_01_5_01_4.html#a98a60de95a331a34dcbad6da9961a9b7">ret_type</a> = <span class="keyword">const</span> To *; <span class="comment">// Constant pointer arg case, return const Ty*</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"><a class="line" href="structSVF_1_1SVFUtil_1_1cast__retty__impl_3_01To_00_01const_01From_01_5const_01_4.html"> 217</a></span> <span class="keyword">template</span><<span class="keyword">class</span> To, <span class="keyword">class</span> From> <span class="keyword">struct </span><a class="code" href="structSVF_1_1SVFUtil_1_1cast__retty__impl.html">cast_retty_impl</a><To, const From*<span class="keyword">const</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"><a class="line" href="structSVF_1_1SVFUtil_1_1cast__retty__impl_3_01To_00_01const_01From_01_5const_01_4.html#add8668ca96bbf0808c146cc81c62267c"> 219</a></span>  <span class="keyword">using</span> <a class="code" href="structSVF_1_1SVFUtil_1_1cast__retty__impl_3_01To_00_01const_01From_01_5const_01_4.html#add8668ca96bbf0808c146cc81c62267c">ret_type</a> = <span class="keyword">const</span> To *; <span class="comment">// Constant pointer arg case, return const Ty*</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> <span class="keyword">template</span> <<span class="keyword">class</span> To, <span class="keyword">class</span> From></div><div class="line"><a name="l00223"></a><span class="lineno"><a class="line" href="structSVF_1_1SVFUtil_1_1cast__retty__impl_3_01To_00_01std_1_1unique__ptr_3_01From_01_4_01_4.html"> 223</a></span> <span class="keyword">struct </span><a class="code" href="structSVF_1_1SVFUtil_1_1cast__retty__impl.html">cast_retty_impl</a><To, <a class="code" href="namespacestd.html">std</a>::unique_ptr<From>></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> <span class="keyword">private</span>:</div><div class="line"><a name="l00226"></a><span class="lineno"><a class="line" href="structSVF_1_1SVFUtil_1_1cast__retty__impl_3_01To_00_01std_1_1unique__ptr_3_01From_01_4_01_4.html#a9d08abc346f3b77c487eba144f3cbd8d"> 226</a></span>  <span class="keyword">using</span> <a class="code" href="structSVF_1_1SVFUtil_1_1cast__retty__impl_3_01To_00_01std_1_1unique__ptr_3_01From_01_4_01_4.html#a9d08abc346f3b77c487eba144f3cbd8d">PointerType</a> = <span class="keyword">typename</span> <a class="code" href="structSVF_1_1SVFUtil_1_1cast__retty__impl.html#a5f8f6d651931eba7e0fa14c26a691a04">cast_retty_impl<To, From *>::ret_type</a>;</div><div class="line"><a name="l00227"></a><span class="lineno"><a class="line" href="structSVF_1_1SVFUtil_1_1cast__retty__impl_3_01To_00_01std_1_1unique__ptr_3_01From_01_4_01_4.html#a052f7cd3a81e368060f132bf0268fa68"> 227</a></span>  <span class="keyword">using</span> <a class="code" href="structSVF_1_1SVFUtil_1_1cast__retty__impl_3_01To_00_01std_1_1unique__ptr_3_01From_01_4_01_4.html#a052f7cd3a81e368060f132bf0268fa68">ResultType</a> = <span class="keyword">typename</span> std::remove_pointer<PointerType>::type;</div><div class="line"><a name="l00228"></a><span class="lineno"> 228</span> </div><div class="line"><a name="l00229"></a><span class="lineno"> 229</span> <span class="keyword">public</span>:</div><div class="line"><a name="l00230"></a><span class="lineno"><a class="line" href="structSVF_1_1SVFUtil_1_1cast__retty__impl_3_01To_00_01std_1_1unique__ptr_3_01From_01_4_01_4.html#a3bf80190e39c339d4e3ec703789ae845"> 230</a></span>  <span class="keyword">using</span> <a class="code" href="structSVF_1_1SVFUtil_1_1cast__retty__impl_3_01To_00_01std_1_1unique__ptr_3_01From_01_4_01_4.html#a3bf80190e39c339d4e3ec703789ae845">ret_type</a> = std::unique_ptr<ResultType>;</div><div class="line"><a name="l00231"></a><span class="lineno"> 231</span> };</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> <span class="keyword">template</span><<span class="keyword">class</span> To, <span class="keyword">class</span> From, <span class="keyword">class</span> SimpleFrom></div><div class="line"><a name="l00234"></a><span class="lineno"><a class="line" href="structSVF_1_1SVFUtil_1_1cast__retty__wrap.html"> 234</a></span> <span class="keyword">struct </span><a class="code" href="structSVF_1_1SVFUtil_1_1cast__retty__wrap.html">cast_retty_wrap</a></div><div class="line"><a name="l00235"></a><span class="lineno"> 235</span> {</div><div class="line"><a name="l00236"></a><span class="lineno"> 236</span>  <span class="comment">// When the simplified type and the from type are not the same, use the type</span></div><div class="line"><a name="l00237"></a><span class="lineno"> 237</span>  <span class="comment">// simplifier to reduce the type, then reuse cast_retty_impl to get the</span></div><div class="line"><a name="l00238"></a><span class="lineno"> 238</span>  <span class="comment">// resultant type.</span></div><div class="line"><a name="l00239"></a><span class="lineno"><a class="line" href="structSVF_1_1SVFUtil_1_1cast__retty__wrap.html#af3d80ab43e47626f32c91a6c4454e82e"> 239</a></span>  <span class="keyword">using</span> <a class="code" href="structSVF_1_1SVFUtil_1_1cast__retty__wrap.html#af3d80ab43e47626f32c91a6c4454e82e">ret_type</a> = <span class="keyword">typename</span> <a class="code" href="structSVF_1_1SVFUtil_1_1cast__retty.html#aea91708cabb8176b031f1c1fdb89a15b">cast_retty<To, SimpleFrom>::ret_type</a>;</div><div class="line"><a name="l00240"></a><span class="lineno"> 240</span> };</div><div class="line"><a name="l00241"></a><span class="lineno"> 241</span> </div><div class="line"><a name="l00242"></a><span class="lineno"> 242</span> <span class="keyword">template</span><<span class="keyword">class</span> To, <span class="keyword">class</span> FromTy></div><div class="line"><a name="l00243"></a><span class="lineno"><a class="line" href="structSVF_1_1SVFUtil_1_1cast__retty__wrap_3_01To_00_01FromTy_00_01FromTy_01_4.html"> 243</a></span> <span class="keyword">struct </span><a class="code" href="structSVF_1_1SVFUtil_1_1cast__retty__wrap.html">cast_retty_wrap</a><To, FromTy, FromTy></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="comment">// When the simplified type is equal to the from type, use it directly.</span></div><div class="line"><a name="l00246"></a><span class="lineno"><a class="line" href="structSVF_1_1SVFUtil_1_1cast__retty__wrap_3_01To_00_01FromTy_00_01FromTy_01_4.html#ad989c130f2b6cd5a0f1ba0c7abd62b9a"> 246</a></span>  <span class="keyword">using</span> <a class="code" href="structSVF_1_1SVFUtil_1_1cast__retty__wrap_3_01To_00_01FromTy_00_01FromTy_01_4.html#ad989c130f2b6cd5a0f1ba0c7abd62b9a">ret_type</a> = <span class="keyword">typename</span> <a class="code" href="structSVF_1_1SVFUtil_1_1cast__retty__impl.html#a5f8f6d651931eba7e0fa14c26a691a04">cast_retty_impl<To,FromTy>::ret_type</a>;</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> </div><div class="line"><a name="l00249"></a><span class="lineno"> 249</span> <span class="keyword">template</span><<span class="keyword">class</span> To, <span class="keyword">class</span> From></div><div class="line"><a name="l00250"></a><span class="lineno"> 250</span> <span class="keyword">struct </span><a class="code" href="structSVF_1_1SVFUtil_1_1cast__retty.html">cast_retty</a></div><div class="line"><a name="l00251"></a><span class="lineno"> 251</span> {</div><div class="line"><a name="l00252"></a><span class="lineno"> 252</span>  <span class="keyword">using</span> <a class="code" href="structSVF_1_1SVFUtil_1_1cast__retty__wrap_3_01To_00_01FromTy_00_01FromTy_01_4.html#ad989c130f2b6cd5a0f1ba0c7abd62b9a">ret_type</a> = <span class="keyword">typename</span> <a class="code" href="structSVF_1_1SVFUtil_1_1cast__retty__wrap.html">cast_retty_wrap</a><</div><div class="line"><a name="l00253"></a><span class="lineno"><a class="line" href="structSVF_1_1SVFUtil_1_1cast__retty.html#aea91708cabb8176b031f1c1fdb89a15b"> 253</a></span>  To, From, <span class="keyword">typename</span> <a class="code" href="structSVF_1_1SVFUtil_1_1simplify__type.html#a40c0d9a74681d3eaa7172ba137d489e4">simplify_type<From>::SimpleType</a>><a class="code" href="structSVF_1_1SVFUtil_1_1cast__retty.html#aea91708cabb8176b031f1c1fdb89a15b">::ret_type</a>;</div><div class="line"><a name="l00254"></a><span class="lineno"> 254</span> };</div><div class="line"><a name="l00255"></a><span class="lineno"> 255</span> </div><div class="line"><a name="l00256"></a><span class="lineno"> 256</span> <span class="comment">// Ensure the non-simple values are converted using the simplify_type template</span></div><div class="line"><a name="l00257"></a><span class="lineno"> 257</span> <span class="comment">// that may be specialized by smart pointers...</span></div><div class="line"><a name="l00258"></a><span class="lineno"> 258</span> <span class="comment">//</span></div><div class="line"><a name="l00259"></a><span class="lineno"><a class="line" href="structSVF_1_1SVFUtil_1_1cast__convert__val.html"> 259</a></span> <span class="keyword">template</span><<span class="keyword">class</span> To, <span class="keyword">class</span> From, <span class="keyword">class</span> SimpleFrom> <span class="keyword">struct </span><a class="code" href="structSVF_1_1SVFUtil_1_1cast__convert__val.html">cast_convert_val</a></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>  <span class="comment">// This is not a simple type, use the template to simplify it...</span></div><div class="line"><a name="l00262"></a><span class="lineno"><a class="line" href="structSVF_1_1SVFUtil_1_1cast__convert__val.html#a42987ff69d76fef88044fe0b19743239"> 262</a></span>  <span class="keyword">static</span> <span class="keyword">typename</span> <a class="code" href="structSVF_1_1SVFUtil_1_1cast__retty.html#aea91708cabb8176b031f1c1fdb89a15b">cast_retty<To, From>::ret_type</a> <a class="code" href="structSVF_1_1SVFUtil_1_1cast__convert__val.html#a42987ff69d76fef88044fe0b19743239">doit</a>(From &Val)</div><div class="line"><a name="l00263"></a><span class="lineno"> 263</span>  {</div><div class="line"><a name="l00264"></a><span class="lineno"> 264</span>  <span class="keywordflow">return</span> <a class="code" href="structSVF_1_1SVFUtil_1_1cast__convert__val.html">cast_convert_val</a><To, SimpleFrom,</div><div class="line"><a name="l00265"></a><span class="lineno"> 265</span>  <span class="keyword">typename</span> <a class="code" href="structSVF_1_1SVFUtil_1_1simplify__type.html#a40c0d9a74681d3eaa7172ba137d489e4">simplify_type<SimpleFrom>::SimpleType</a>>::doit(</div><div class="line"><a name="l00266"></a><span class="lineno"> 266</span>  <a class="code" href="structSVF_1_1SVFUtil_1_1simplify__type.html">simplify_type<From>::getSimplifiedValue</a>(Val));</div><div class="line"><a name="l00267"></a><span class="lineno"> 267</span>  }</div><div class="line"><a name="l00268"></a><span class="lineno"> 268</span> };</div><div class="line"><a name="l00269"></a><span class="lineno"> 269</span> </div><div class="line"><a name="l00270"></a><span class="lineno"><a class="line" href="structSVF_1_1SVFUtil_1_1cast__convert__val_3_01To_00_01FromTy_00_01FromTy_01_4.html"> 270</a></span> <span class="keyword">template</span><<span class="keyword">class</span> To, <span class="keyword">class</span> FromTy> <span class="keyword">struct </span><a class="code" href="structSVF_1_1SVFUtil_1_1cast__convert__val.html">cast_convert_val</a><To,FromTy,FromTy></div><div class="line"><a name="l00271"></a><span class="lineno"> 271</span> {</div><div class="line"><a name="l00272"></a><span class="lineno"> 272</span>  <span class="comment">// This _is_ a simple type, just cast it.</span></div><div class="line"><a name="l00273"></a><span class="lineno"><a class="line" href="structSVF_1_1SVFUtil_1_1cast__convert__val_3_01To_00_01FromTy_00_01FromTy_01_4.html#a2dd56ef15d86f61c7fef34dc15173e4a"> 273</a></span>  <span class="keyword">static</span> <span class="keyword">typename</span> <a class="code" href="structSVF_1_1SVFUtil_1_1cast__retty.html#aea91708cabb8176b031f1c1fdb89a15b">cast_retty<To, FromTy>::ret_type</a> <a class="code" href="structSVF_1_1SVFUtil_1_1cast__convert__val_3_01To_00_01FromTy_00_01FromTy_01_4.html#a2dd56ef15d86f61c7fef34dc15173e4a">doit</a>(<span class="keyword">const</span> FromTy &Val)</div><div class="line"><a name="l00274"></a><span class="lineno"> 274</span>  {</div><div class="line"><a name="l00275"></a><span class="lineno"> 275</span>  <span class="keyword">typename</span> <a class="code" href="structSVF_1_1SVFUtil_1_1cast__retty.html#aea91708cabb8176b031f1c1fdb89a15b">cast_retty<To, FromTy>::ret_type</a> Res2</div><div class="line"><a name="l00276"></a><span class="lineno"> 276</span>  = (<span class="keyword">typename</span> <a class="code" href="structSVF_1_1SVFUtil_1_1cast__retty.html#aea91708cabb8176b031f1c1fdb89a15b">cast_retty<To, FromTy>::ret_type</a>)const_cast<FromTy&>(Val);</div><div class="line"><a name="l00277"></a><span class="lineno"> 277</span>  <span class="keywordflow">return</span> Res2;</div><div class="line"><a name="l00278"></a><span class="lineno"> 278</span>  }</div><div class="line"><a name="l00279"></a><span class="lineno"> 279</span> };</div><div class="line"><a name="l00280"></a><span class="lineno"> 280</span> </div><div class="line"><a name="l00281"></a><span class="lineno"><a class="line" href="structSVF_1_1SVFUtil_1_1is__simple__type.html"> 281</a></span> <span class="keyword">template</span> <<span class="keyword">class</span> X> <span class="keyword">struct </span><a class="code" href="structSVF_1_1SVFUtil_1_1is__simple__type.html">is_simple_type</a></div><div class="line"><a name="l00282"></a><span class="lineno"> 282</span> {</div><div class="line"><a name="l00283"></a><span class="lineno"><a class="line" href="structSVF_1_1SVFUtil_1_1is__simple__type.html#a700d43a1b318fb30fa9472da323cb34f"> 283</a></span>  <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">bool</span> value =</div><div class="line"><a name="l00284"></a><span class="lineno"> 284</span>  std::is_same<X, typename simplify_type<X>::SimpleType>::value;</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> </div><div class="line"><a name="l00287"></a><span class="lineno"> 287</span> <span class="comment">// cast<X> - Return the argument parameter cast to the specified type. This</span></div><div class="line"><a name="l00288"></a><span class="lineno"> 288</span> <span class="comment">// casting operator asserts that the type is correct, so it does not return null</span></div><div class="line"><a name="l00289"></a><span class="lineno"> 289</span> <span class="comment">// on failure. It does not allow a null argument (use cast_or_null for that).</span></div><div class="line"><a name="l00290"></a><span class="lineno"> 290</span> <span class="comment">// It is typically used like this:</span></div><div class="line"><a name="l00291"></a><span class="lineno"> 291</span> <span class="comment">//</span></div><div class="line"><a name="l00292"></a><span class="lineno"> 292</span> <span class="comment">// cast<Instruction>(myVal)->getParent()</span></div><div class="line"><a name="l00293"></a><span class="lineno"> 293</span> <span class="comment">//</span></div><div class="line"><a name="l00294"></a><span class="lineno"> 294</span> <span class="keyword">template</span> <<span class="keyword">class</span> X, <span class="keyword">class</span> Y></div><div class="line"><a name="l00295"></a><span class="lineno"> 295</span> <span class="keyword">inline</span> <span class="keyword">typename</span> std::enable_if<!is_simple_type<Y>::value,</div><div class="line"><a name="l00296"></a><span class="lineno"> 296</span>  <span class="keyword">typename</span> <a class="code" href="structSVF_1_1SVFUtil_1_1cast__retty.html#aea91708cabb8176b031f1c1fdb89a15b">cast_retty<X, const Y>::ret_type</a>>::type</div><div class="line"><a name="l00297"></a><span class="lineno"><a class="line" href="namespaceSVF_1_1SVFUtil.html#a0d100868bf63b968d387eb50e9603f7c"> 297</a></span>  <a class="code" href="namespaceSVF_1_1SVFUtil.html#a0d100868bf63b968d387eb50e9603f7c">cast</a>(<span class="keyword">const</span> Y &Val)</div><div class="line"><a name="l00298"></a><span class="lineno"> 298</span> {</div><div class="line"><a name="l00299"></a><span class="lineno"> 299</span>  <a class="code" href="util_8h.html#a07d17d6d5d1074c0969bc5d3c3d1d84a">assert</a>(llvm::isa<X>(Val) && <span class="stringliteral">"cast<Ty>() argument of incompatible type!"</span>);</div><div class="line"><a name="l00300"></a><span class="lineno"> 300</span>  <span class="keywordflow">return</span> <a class="code" href="structSVF_1_1SVFUtil_1_1cast__convert__val.html">cast_convert_val</a><</div><div class="line"><a name="l00301"></a><span class="lineno"> 301</span>  X, <span class="keyword">const</span> Y, <span class="keyword">typename</span> <a class="code" href="structSVF_1_1SVFUtil_1_1simplify__type.html#a40c0d9a74681d3eaa7172ba137d489e4">simplify_type<const Y>::SimpleType</a>>::doit(Val);</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> </div><div class="line"><a name="l00304"></a><span class="lineno"> 304</span> <span class="keyword">template</span> <<span class="keyword">class</span> X, <span class="keyword">class</span> Y></div><div class="line"><a name="l00305"></a><span class="lineno"><a class="line" href="namespaceSVF_1_1SVFUtil.html#a406dd9baf2ce66235d482fd6c6121b2c"> 305</a></span> <span class="keyword">inline</span> <span class="keyword">typename</span> <a class="code" href="structSVF_1_1SVFUtil_1_1cast__retty.html#aea91708cabb8176b031f1c1fdb89a15b">cast_retty<X, Y>::ret_type</a> <a class="code" href="namespaceSVF_1_1SVFUtil.html#a0d100868bf63b968d387eb50e9603f7c">cast</a>(Y &Val)</div><div class="line"><a name="l00306"></a><span class="lineno"> 306</span> {</div><div class="line"><a name="l00307"></a><span class="lineno"> 307</span>  <a class="code" href="util_8h.html#a07d17d6d5d1074c0969bc5d3c3d1d84a">assert</a>(llvm::isa<X>(Val) && <span class="stringliteral">"cast<Ty>() argument of incompatible type!"</span>);</div><div class="line"><a name="l00308"></a><span class="lineno"> 308</span>  <span class="keywordflow">return</span> <a class="code" href="structSVF_1_1SVFUtil_1_1cast__convert__val.html">cast_convert_val</a><X, Y,</div><div class="line"><a name="l00309"></a><span class="lineno"> 309</span>  <span class="keyword">typename</span> <a class="code" href="structSVF_1_1SVFUtil_1_1simplify__type.html#a40c0d9a74681d3eaa7172ba137d489e4">simplify_type<Y>::SimpleType</a>>::doit(Val);</div><div class="line"><a name="l00310"></a><span class="lineno"> 310</span> }</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> <span class="keyword">template</span> <<span class="keyword">class</span> X, <span class="keyword">class</span> Y></div><div class="line"><a name="l00313"></a><span class="lineno"><a class="line" href="namespaceSVF_1_1SVFUtil.html#acc2419a55c0427571f11ad14db2fe481"> 313</a></span> <span class="keyword">inline</span> <span class="keyword">typename</span> <a class="code" href="structSVF_1_1SVFUtil_1_1cast__retty.html#aea91708cabb8176b031f1c1fdb89a15b">cast_retty<X, Y *>::ret_type</a> <a class="code" href="namespaceSVF_1_1SVFUtil.html#a0d100868bf63b968d387eb50e9603f7c">cast</a>(Y *Val)</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>  <a class="code" href="util_8h.html#a07d17d6d5d1074c0969bc5d3c3d1d84a">assert</a>(llvm::isa<X>(Val) && <span class="stringliteral">"cast<Ty>() argument of incompatible type!"</span>);</div><div class="line"><a name="l00316"></a><span class="lineno"> 316</span>  <span class="keywordflow">return</span> <a class="code" href="structSVF_1_1SVFUtil_1_1cast__convert__val.html">cast_convert_val</a><X, Y*,</div><div class="line"><a name="l00317"></a><span class="lineno"> 317</span>  <span class="keyword">typename</span> <a class="code" href="structSVF_1_1SVFUtil_1_1simplify__type.html#a40c0d9a74681d3eaa7172ba137d489e4">simplify_type<Y*>::SimpleType</a>>::doit(Val);</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="keyword">template</span> <<span class="keyword">class</span> X, <span class="keyword">class</span> Y></div><div class="line"><a name="l00321"></a><span class="lineno"> 321</span> <span class="keyword">inline</span> <span class="keyword">typename</span> <a class="code" href="structSVF_1_1SVFUtil_1_1cast__retty.html">cast_retty<X, std::unique_ptr<Y></a>>::ret_type</div><div class="line"><a name="l00322"></a><span class="lineno"><a class="line" href="namespaceSVF_1_1SVFUtil.html#af3ca049b4ce83c874e231f5e13bf36a8"> 322</a></span>  <a class="code" href="namespaceSVF_1_1SVFUtil.html#a0d100868bf63b968d387eb50e9603f7c">cast</a>(std::unique_ptr<Y> &&Val)</div><div class="line"><a name="l00323"></a><span class="lineno"> 323</span> {</div><div class="line"><a name="l00324"></a><span class="lineno"> 324</span>  <a class="code" href="util_8h.html#a07d17d6d5d1074c0969bc5d3c3d1d84a">assert</a>(llvm::isa<X>(Val.get()) && <span class="stringliteral">"cast<Ty>() argument of incompatible type!"</span>);</div><div class="line"><a name="l00325"></a><span class="lineno"> 325</span>  <span class="keyword">using</span> ret_type = <span class="keyword">typename</span> <a class="code" href="structSVF_1_1SVFUtil_1_1cast__retty.html">cast_retty<X, std::unique_ptr<Y></a>>::ret_type;</div><div class="line"><a name="l00326"></a><span class="lineno"> 326</span>  <span class="keywordflow">return</span> ret_type(</div><div class="line"><a name="l00327"></a><span class="lineno"> 327</span>  <a class="code" href="structSVF_1_1SVFUtil_1_1cast__convert__val.html">cast_convert_val</a><X, Y *, <span class="keyword">typename</span> <a class="code" href="structSVF_1_1SVFUtil_1_1simplify__type.html#a40c0d9a74681d3eaa7172ba137d489e4">simplify_type<Y *>::SimpleType</a>>::doit(</div><div class="line"><a name="l00328"></a><span class="lineno"> 328</span>  Val.release()));</div><div class="line"><a name="l00329"></a><span class="lineno"> 329</span> }</div><div class="line"><a name="l00330"></a><span class="lineno"> 330</span> </div><div class="line"><a name="l00331"></a><span class="lineno"> 331</span> <span class="comment">// dyn_cast<X> - Return the argument parameter cast to the specified type. This</span></div><div class="line"><a name="l00332"></a><span class="lineno"> 332</span> <span class="comment">// casting operator returns null if the argument is of the wrong type, so it can</span></div><div class="line"><a name="l00333"></a><span class="lineno"> 333</span> <span class="comment">// be used to test for a type as well as cast if successful. This should be</span></div><div class="line"><a name="l00334"></a><span class="lineno"> 334</span> <span class="comment">// used in the context of an if statement like this:</span></div><div class="line"><a name="l00335"></a><span class="lineno"> 335</span> <span class="comment">//</span></div><div class="line"><a name="l00336"></a><span class="lineno"> 336</span> <span class="comment">// if (const Instruction *I = dyn_cast<Instruction>(myVal)) { ... }</span></div><div class="line"><a name="l00337"></a><span class="lineno"> 337</span> <span class="comment">//</span></div><div class="line"><a name="l00338"></a><span class="lineno"> 338</span> </div><div class="line"><a name="l00339"></a><span class="lineno"> 339</span> <span class="keyword">template</span> <<span class="keyword">class</span> X, <span class="keyword">class</span> Y></div><div class="line"><a name="l00340"></a><span class="lineno"> 340</span> LLVM_NODISCARD <span class="keyword">inline</span></div><div class="line"><a name="l00341"></a><span class="lineno"> 341</span> <span class="keyword">typename</span> std::enable_if<!is_simple_type<Y>::value,</div><div class="line"><a name="l00342"></a><span class="lineno"> 342</span>  <span class="keyword">typename</span> <a class="code" href="structSVF_1_1SVFUtil_1_1cast__retty.html#aea91708cabb8176b031f1c1fdb89a15b">cast_retty<X, const Y>::ret_type</a>>::type</div><div class="line"><a name="l00343"></a><span class="lineno"><a class="line" href="namespaceSVF_1_1SVFUtil.html#a8182be247907420db00837cef9bcfa70"> 343</a></span>  <a class="code" href="namespaceSVF_1_1SVFUtil.html#a8182be247907420db00837cef9bcfa70">dyn_cast</a>(<span class="keyword">const</span> Y &Val)</div><div class="line"><a name="l00344"></a><span class="lineno"> 344</span> {</div><div class="line"><a name="l00345"></a><span class="lineno"> 345</span>  <span class="keywordflow">return</span> llvm::isa<X>(Val) ? llvm::cast<X>(Val) : <span class="keyword">nullptr</span>;</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> </div><div class="line"><a name="l00348"></a><span class="lineno"> 348</span> <span class="keyword">template</span> <<span class="keyword">class</span> X, <span class="keyword">class</span> Y></div><div class="line"><a name="l00349"></a><span class="lineno"><a class="line" href="namespaceSVF_1_1SVFUtil.html#a52d852ba8fa569e858565b3bba403656"> 349</a></span> LLVM_NODISCARD <span class="keyword">inline</span> <span class="keyword">typename</span> <a class="code" href="structSVF_1_1SVFUtil_1_1cast__retty.html#aea91708cabb8176b031f1c1fdb89a15b">cast_retty<X, Y>::ret_type</a> <a class="code" href="namespaceSVF_1_1SVFUtil.html#a8182be247907420db00837cef9bcfa70">dyn_cast</a>(Y &Val)</div><div class="line"><a name="l00350"></a><span class="lineno"> 350</span> {</div><div class="line"><a name="l00351"></a><span class="lineno"> 351</span>  <span class="keywordflow">return</span> llvm::isa<X>(Val) ? llvm::cast<X>(Val) : <span class="keyword">nullptr</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"> 353</span> </div><div class="line"><a name="l00354"></a><span class="lineno"> 354</span> <span class="keyword">template</span> <<span class="keyword">class</span> X, <span class="keyword">class</span> Y></div><div class="line"><a name="l00355"></a><span class="lineno"><a class="line" href="namespaceSVF_1_1SVFUtil.html#a105c5c5e97d56533fb2b3ba7a0bc59f3"> 355</a></span> LLVM_NODISCARD <span class="keyword">inline</span> <span class="keyword">typename</span> <a class="code" href="structSVF_1_1SVFUtil_1_1cast__retty.html#aea91708cabb8176b031f1c1fdb89a15b">cast_retty<X, Y *>::ret_type</a> <a class="code" href="namespaceSVF_1_1SVFUtil.html#a8182be247907420db00837cef9bcfa70">dyn_cast</a>(Y *Val)</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> llvm::isa<X>(Val) ? llvm::cast<X>(Val) : <span class="keyword">nullptr</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">// End namespace SVFUtil</span></div><div class="line"><a name="l00361"></a><span class="lineno"> 361</span> </div><div class="line"><a name="l00362"></a><span class="lineno"> 362</span> } <span class="comment">// End namespace SVF</span></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="preprocessor">#endif </span><span class="comment">/* INCLUDE_UTIL_CASTING_H_ */</span><span class="preprocessor"></span></div><div class="ttc" id="structSVF_1_1SVFUtil_1_1isa__impl__cl_3_01To_00_01const_01From_01_4_html_af9a6a9c7660d5daedf8cd907788ac78d"><div class="ttname"><a href="structSVF_1_1SVFUtil_1_1isa__impl__cl_3_01To_00_01const_01From_01_4.html#af9a6a9c7660d5daedf8cd907788ac78d">SVF::SVFUtil::isa_impl_cl< To, const From >::doit</a></div><div class="ttdeci">static bool doit(const From &Val)</div><div class="ttdef"><b>Definition:</b> <a href="Casting_8h_source.html#l00104">Casting.h:104</a></div></div>
|
|
69
|
+
<a href="Casting_8h.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">/*</span></div><div class="line"><a name="l00002"></a><span class="lineno"> 2</span> <span class="comment"> * Casting.h</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"> * Created on: 19Sep.,2018</span></div><div class="line"><a name="l00005"></a><span class="lineno"> 5</span> <span class="comment"> * Author: yulei</span></div><div class="line"><a name="l00006"></a><span class="lineno"> 6</span> <span class="comment"> */</span></div><div class="line"><a name="l00007"></a><span class="lineno"> 7</span> </div><div class="line"><a name="l00008"></a><span class="lineno"> 8</span> <span class="preprocessor">#ifndef INCLUDE_UTIL_CASTING_H_</span></div><div class="line"><a name="l00009"></a><span class="lineno"> 9</span> <span class="preprocessor">#define INCLUDE_UTIL_CASTING_H_</span></div><div class="line"><a name="l00010"></a><span class="lineno"> 10</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="comment">//===- llvm/Support/Casting.h - Allow flexible, checked, casts --*- C++ -*-===//</span></div><div class="line"><a name="l00013"></a><span class="lineno"> 13</span> <span class="comment">//</span></div><div class="line"><a name="l00014"></a><span class="lineno"> 14</span> <span class="comment">// The LLVM Compiler Infrastructure</span></div><div class="line"><a name="l00015"></a><span class="lineno"> 15</span> <span class="comment">//</span></div><div class="line"><a name="l00016"></a><span class="lineno"> 16</span> <span class="comment">// This file is distributed under the University of Illinois Open Source</span></div><div class="line"><a name="l00017"></a><span class="lineno"> 17</span> <span class="comment">// License. See LICENSE.TXT for details.</span></div><div class="line"><a name="l00018"></a><span class="lineno"> 18</span> <span class="comment">//</span></div><div class="line"><a name="l00019"></a><span class="lineno"> 19</span> <span class="comment">//===----------------------------------------------------------------------===//</span></div><div class="line"><a name="l00020"></a><span class="lineno"> 20</span> <span class="comment">//</span></div><div class="line"><a name="l00021"></a><span class="lineno"> 21</span> <span class="comment">// This file defines the llvm::isa<X>(), cast<X>(), dyn_cast<X>(), cast_or_null<X>(),</span></div><div class="line"><a name="l00022"></a><span class="lineno"> 22</span> <span class="comment">// and dyn_cast_or_null<X>() templates.</span></div><div class="line"><a name="l00023"></a><span class="lineno"> 23</span> <span class="comment">//</span></div><div class="line"><a name="l00024"></a><span class="lineno"> 24</span> <span class="comment">//===----------------------------------------------------------------------===//</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"> 26</span> <span class="preprocessor">#include <llvm/Support/Compiler.h></span></div><div class="line"><a name="l00027"></a><span class="lineno"> 27</span> <span class="preprocessor">#include <llvm/Support/type_traits.h></span></div><div class="line"><a name="l00028"></a><span class="lineno"> 28</span> <span class="preprocessor">#include <cassert></span></div><div class="line"><a name="l00029"></a><span class="lineno"> 29</span> <span class="preprocessor">#include <memory></span></div><div class="line"><a name="l00030"></a><span class="lineno"> 30</span> <span class="preprocessor">#include <type_traits></span></div><div class="line"><a name="l00031"></a><span class="lineno"> 31</span> </div><div class="line"><a name="l00032"></a><span class="lineno"> 32</span> <span class="keyword">namespace </span><a class="code" href="namespaceSVF.html">SVF</a></div><div class="line"><a name="l00033"></a><span class="lineno"> 33</span> {</div><div class="line"><a name="l00034"></a><span class="lineno"> 34</span> </div><div class="line"><a name="l00035"></a><span class="lineno"><a class="line" href="namespaceSVF_1_1SVFUtil.html"> 35</a></span> <span class="keyword">namespace </span>SVFUtil</div><div class="line"><a name="l00036"></a><span class="lineno"> 36</span> {</div><div class="line"><a name="l00037"></a><span class="lineno"> 37</span> </div><div class="line"><a name="l00038"></a><span class="lineno"> 38</span> <span class="comment">//===----------------------------------------------------------------------===//</span></div><div class="line"><a name="l00039"></a><span class="lineno"> 39</span> <span class="comment">// llvm::isa<x> Support Templates</span></div><div class="line"><a name="l00040"></a><span class="lineno"> 40</span> <span class="comment">//===----------------------------------------------------------------------===//</span></div><div class="line"><a name="l00041"></a><span class="lineno"> 41</span> </div><div class="line"><a name="l00042"></a><span class="lineno"> 42</span> <span class="comment">// Define a template that can be specialized by smart pointers to reflect the</span></div><div class="line"><a name="l00043"></a><span class="lineno"> 43</span> <span class="comment">// fact that they are automatically dereferenced, and are not involved with the</span></div><div class="line"><a name="l00044"></a><span class="lineno"> 44</span> <span class="comment">// template selection process... the default implementation is a noop.</span></div><div class="line"><a name="l00045"></a><span class="lineno"> 45</span> <span class="comment">//</span></div><div class="line"><a name="l00046"></a><span class="lineno"><a class="line" href="structSVF_1_1SVFUtil_1_1simplify__type.html"> 46</a></span> <span class="keyword">template</span><<span class="keyword">typename</span> From> <span class="keyword">struct </span><a class="code" href="structSVF_1_1SVFUtil_1_1simplify__type.html">simplify_type</a></div><div class="line"><a name="l00047"></a><span class="lineno"> 47</span> {</div><div class="line"><a name="l00048"></a><span class="lineno"><a class="line" href="structSVF_1_1SVFUtil_1_1simplify__type.html#a40c0d9a74681d3eaa7172ba137d489e4"> 48</a></span>  <span class="keyword">using</span> <a class="code" href="structSVF_1_1SVFUtil_1_1simplify__type.html#a40c0d9a74681d3eaa7172ba137d489e4">SimpleType</a> = From; <span class="comment">// The real type this represents...</span></div><div class="line"><a name="l00049"></a><span class="lineno"> 49</span> </div><div class="line"><a name="l00050"></a><span class="lineno"> 50</span>  <span class="comment">// An accessor to get the real value...</span></div><div class="line"><a name="l00051"></a><span class="lineno"><a class="line" href="structSVF_1_1SVFUtil_1_1simplify__type.html#a8046f044d895a5c9aee85de9705161f9"> 51</a></span>  <span class="keyword">static</span> <a class="code" href="structSVF_1_1SVFUtil_1_1simplify__type.html#a40c0d9a74681d3eaa7172ba137d489e4">SimpleType</a> &<a class="code" href="structSVF_1_1SVFUtil_1_1simplify__type.html#a8046f044d895a5c9aee85de9705161f9">getSimplifiedValue</a>(From &Val)</div><div class="line"><a name="l00052"></a><span class="lineno"> 52</span>  {</div><div class="line"><a name="l00053"></a><span class="lineno"> 53</span>  <span class="keywordflow">return</span> Val;</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"><a class="line" href="structSVF_1_1SVFUtil_1_1simplify__type_3_01const_01From_01_4.html"> 57</a></span> <span class="keyword">template</span><<span class="keyword">typename</span> From> <span class="keyword">struct </span><a class="code" href="structSVF_1_1SVFUtil_1_1simplify__type.html">simplify_type</a><const From></div><div class="line"><a name="l00058"></a><span class="lineno"> 58</span> {</div><div class="line"><a name="l00059"></a><span class="lineno"><a class="line" href="structSVF_1_1SVFUtil_1_1simplify__type_3_01const_01From_01_4.html#aadddb18b44c9744dcc639a3de603151d"> 59</a></span>  <span class="keyword">using</span> <a class="code" href="structSVF_1_1SVFUtil_1_1simplify__type_3_01const_01From_01_4.html#aadddb18b44c9744dcc639a3de603151d">NonConstSimpleType</a> = <span class="keyword">typename</span> <a class="code" href="structSVF_1_1SVFUtil_1_1simplify__type.html#a40c0d9a74681d3eaa7172ba137d489e4">simplify_type<From>::SimpleType</a>;</div><div class="line"><a name="l00060"></a><span class="lineno"> 60</span>  <span class="keyword">using</span> <a class="code" href="structSVF_1_1SVFUtil_1_1simplify__type_3_01const_01From_01_4.html#afdc334dc0c584651f9ab538e38cf3aff">SimpleType</a> =</div><div class="line"><a name="l00061"></a><span class="lineno"><a class="line" href="structSVF_1_1SVFUtil_1_1simplify__type_3_01const_01From_01_4.html#afdc334dc0c584651f9ab538e38cf3aff"> 61</a></span>  <span class="keyword">typename</span> llvm::add_const_past_pointer<NonConstSimpleType>::type;</div><div class="line"><a name="l00062"></a><span class="lineno"> 62</span>  <span class="keyword">using</span> <a class="code" href="structSVF_1_1SVFUtil_1_1simplify__type_3_01const_01From_01_4.html#ae6f5437cb8355759aadc78fca716bc6a">RetType</a> =</div><div class="line"><a name="l00063"></a><span class="lineno"><a class="line" href="structSVF_1_1SVFUtil_1_1simplify__type_3_01const_01From_01_4.html#ae6f5437cb8355759aadc78fca716bc6a"> 63</a></span>  <span class="keyword">typename</span> llvm::add_lvalue_reference_if_not_pointer<SimpleType>::type;</div><div class="line"><a name="l00064"></a><span class="lineno"> 64</span> </div><div class="line"><a name="l00065"></a><span class="lineno"><a class="line" href="structSVF_1_1SVFUtil_1_1simplify__type_3_01const_01From_01_4.html#ac64f5d9a2ec97aebd7b377319d7f043b"> 65</a></span>  <span class="keyword">static</span> <a class="code" href="structSVF_1_1SVFUtil_1_1simplify__type_3_01const_01From_01_4.html#ae6f5437cb8355759aadc78fca716bc6a">RetType</a> <a class="code" href="structSVF_1_1SVFUtil_1_1simplify__type_3_01const_01From_01_4.html#ac64f5d9a2ec97aebd7b377319d7f043b">getSimplifiedValue</a>(<span class="keyword">const</span> From& Val)</div><div class="line"><a name="l00066"></a><span class="lineno"> 66</span>  {</div><div class="line"><a name="l00067"></a><span class="lineno"> 67</span>  <span class="keywordflow">return</span> <a class="code" href="structSVF_1_1SVFUtil_1_1simplify__type.html#a8046f044d895a5c9aee85de9705161f9">simplify_type<From>::getSimplifiedValue</a>(const_cast<From&>(Val));</div><div class="line"><a name="l00068"></a><span class="lineno"> 68</span>  }</div><div class="line"><a name="l00069"></a><span class="lineno"> 69</span> };</div><div class="line"><a name="l00070"></a><span class="lineno"> 70</span> </div><div class="line"><a name="l00071"></a><span class="lineno"> 71</span> <span class="comment">// The core of the implementation of llvm::isa<X> is here; To and From should be</span></div><div class="line"><a name="l00072"></a><span class="lineno"> 72</span> <span class="comment">// the names of classes. This template can be specialized to customize the</span></div><div class="line"><a name="l00073"></a><span class="lineno"> 73</span> <span class="comment">// implementation of llvm::isa<> without rewriting it from scratch.</span></div><div class="line"><a name="l00074"></a><span class="lineno"> 74</span> <span class="keyword">template</span> <<span class="keyword">typename</span> To, <span class="keyword">typename</span> From, <span class="keyword">typename</span> Enabler = <span class="keywordtype">void</span>></div><div class="line"><a name="l00075"></a><span class="lineno"><a class="line" href="structSVF_1_1SVFUtil_1_1isa__impl.html"> 75</a></span> <span class="keyword">struct </span><a class="code" href="structSVF_1_1SVFUtil_1_1isa__impl.html">isa_impl</a></div><div class="line"><a name="l00076"></a><span class="lineno"> 76</span> {</div><div class="line"><a name="l00077"></a><span class="lineno"><a class="line" href="structSVF_1_1SVFUtil_1_1isa__impl.html#a150c6a99c45befa44a4cd2bcc8d06eee"> 77</a></span>  <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">bool</span> <a class="code" href="structSVF_1_1SVFUtil_1_1isa__impl.html#a150c6a99c45befa44a4cd2bcc8d06eee">doit</a>(<span class="keyword">const</span> From &Val)</div><div class="line"><a name="l00078"></a><span class="lineno"> 78</span>  {</div><div class="line"><a name="l00079"></a><span class="lineno"> 79</span>  <span class="keywordflow">return</span> To::classof(&Val);</div><div class="line"><a name="l00080"></a><span class="lineno"> 80</span>  }</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="l00084"></a><span class="lineno"> 84</span> <span class="keyword">template</span> <<span class="keyword">typename</span> To, <span class="keyword">typename</span> From></div><div class="line"><a name="l00085"></a><span class="lineno"><a class="line" href="structSVF_1_1SVFUtil_1_1isa__impl_3_01To_00_01From_00_01typename_01std_1_1enable__if_3_01std_1_1101a002941fb8432b76e90258f1ec6b7.html"> 85</a></span> <span class="keyword">struct </span><a class="code" href="structSVF_1_1SVFUtil_1_1isa__impl.html">isa_impl</a><</div><div class="line"><a name="l00086"></a><span class="lineno"> 86</span>  To, From, typename <a class="code" href="namespacestd.html">std</a>::enable_if<std::is_base_of<To, From>::value>::type></div><div class="line"><a name="l00087"></a><span class="lineno"> 87</span> {</div><div class="line"><a name="l00088"></a><span class="lineno"><a class="line" href="structSVF_1_1SVFUtil_1_1isa__impl_3_01To_00_01From_00_01typename_01std_1_1enable__if_3_01std_1_1101a002941fb8432b76e90258f1ec6b7.html#a0da9525f6f39a3eb9ce9275731c2ad64"> 88</a></span>  <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">bool</span> <a class="code" href="structSVF_1_1SVFUtil_1_1isa__impl_3_01To_00_01From_00_01typename_01std_1_1enable__if_3_01std_1_1101a002941fb8432b76e90258f1ec6b7.html#a0da9525f6f39a3eb9ce9275731c2ad64">doit</a>(<span class="keyword">const</span> From &)</div><div class="line"><a name="l00089"></a><span class="lineno"> 89</span>  {</div><div class="line"><a name="l00090"></a><span class="lineno"> 90</span>  <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l00091"></a><span class="lineno"> 91</span>  }</div><div class="line"><a name="l00092"></a><span class="lineno"> 92</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"><a class="line" href="structSVF_1_1SVFUtil_1_1isa__impl__cl.html"> 94</a></span> <span class="keyword">template</span> <<span class="keyword">typename</span> To, <span class="keyword">typename</span> From> <span class="keyword">struct </span><a class="code" href="structSVF_1_1SVFUtil_1_1isa__impl__cl.html">isa_impl_cl</a></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="structSVF_1_1SVFUtil_1_1isa__impl__cl.html#afbe68352d888c0b15e9f46d4e378bacb"> 96</a></span>  <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">bool</span> <a class="code" href="structSVF_1_1SVFUtil_1_1isa__impl__cl.html#afbe68352d888c0b15e9f46d4e378bacb">doit</a>(<span class="keyword">const</span> From &Val)</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">return</span> <a class="code" href="structSVF_1_1SVFUtil_1_1isa__impl.html#a150c6a99c45befa44a4cd2bcc8d06eee">isa_impl<To, From>::doit</a>(Val);</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> };</div><div class="line"><a name="l00101"></a><span class="lineno"> 101</span> </div><div class="line"><a name="l00102"></a><span class="lineno"><a class="line" href="structSVF_1_1SVFUtil_1_1isa__impl__cl_3_01To_00_01const_01From_01_4.html"> 102</a></span> <span class="keyword">template</span> <<span class="keyword">typename</span> To, <span class="keyword">typename</span> From> <span class="keyword">struct </span><a class="code" href="structSVF_1_1SVFUtil_1_1isa__impl__cl.html">isa_impl_cl</a><To, const From></div><div class="line"><a name="l00103"></a><span class="lineno"> 103</span> {</div><div class="line"><a name="l00104"></a><span class="lineno"><a class="line" href="structSVF_1_1SVFUtil_1_1isa__impl__cl_3_01To_00_01const_01From_01_4.html#af9a6a9c7660d5daedf8cd907788ac78d"> 104</a></span>  <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">bool</span> <a class="code" href="structSVF_1_1SVFUtil_1_1isa__impl__cl_3_01To_00_01const_01From_01_4.html#af9a6a9c7660d5daedf8cd907788ac78d">doit</a>(<span class="keyword">const</span> From &Val)</div><div class="line"><a name="l00105"></a><span class="lineno"> 105</span>  {</div><div class="line"><a name="l00106"></a><span class="lineno"> 106</span>  <span class="keywordflow">return</span> <a class="code" href="structSVF_1_1SVFUtil_1_1isa__impl.html#a150c6a99c45befa44a4cd2bcc8d06eee">isa_impl<To, From>::doit</a>(Val);</div><div class="line"><a name="l00107"></a><span class="lineno"> 107</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> </div><div class="line"><a name="l00110"></a><span class="lineno"> 110</span> <span class="keyword">template</span> <<span class="keyword">typename</span> To, <span class="keyword">typename</span> From></div><div class="line"><a name="l00111"></a><span class="lineno"><a class="line" href="structSVF_1_1SVFUtil_1_1isa__impl__cl_3_01To_00_01const_01std_1_1unique__ptr_3_01From_01_4_01_4.html"> 111</a></span> <span class="keyword">struct </span><a class="code" href="structSVF_1_1SVFUtil_1_1isa__impl__cl.html">isa_impl_cl</a><To, const <a class="code" href="namespacestd.html">std</a>::unique_ptr<From>></div><div class="line"><a name="l00112"></a><span class="lineno"> 112</span> {</div><div class="line"><a name="l00113"></a><span class="lineno"><a class="line" href="structSVF_1_1SVFUtil_1_1isa__impl__cl_3_01To_00_01const_01std_1_1unique__ptr_3_01From_01_4_01_4.html#aff368847551a69d07b06237908594852"> 113</a></span>  <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">bool</span> <a class="code" href="structSVF_1_1SVFUtil_1_1isa__impl__cl_3_01To_00_01const_01std_1_1unique__ptr_3_01From_01_4_01_4.html#aff368847551a69d07b06237908594852">doit</a>(<span class="keyword">const</span> std::unique_ptr<From> &Val)</div><div class="line"><a name="l00114"></a><span class="lineno"> 114</span>  {</div><div class="line"><a name="l00115"></a><span class="lineno"> 115</span>  <a class="code" href="util_8h.html#a07d17d6d5d1074c0969bc5d3c3d1d84a">assert</a>(Val && <span class="stringliteral">"llvm::isa<> used on a null pointer"</span>);</div><div class="line"><a name="l00116"></a><span class="lineno"> 116</span>  <span class="keywordflow">return</span> <a class="code" href="structSVF_1_1SVFUtil_1_1isa__impl__cl.html#afbe68352d888c0b15e9f46d4e378bacb">isa_impl_cl<To, From>::doit</a>(*Val);</div><div class="line"><a name="l00117"></a><span class="lineno"> 117</span>  }</div><div class="line"><a name="l00118"></a><span class="lineno"> 118</span> };</div><div class="line"><a name="l00119"></a><span class="lineno"> 119</span> </div><div class="line"><a name="l00120"></a><span class="lineno"><a class="line" href="structSVF_1_1SVFUtil_1_1isa__impl__cl_3_01To_00_01From_01_5_01_4.html"> 120</a></span> <span class="keyword">template</span> <<span class="keyword">typename</span> To, <span class="keyword">typename</span> From> <span class="keyword">struct </span><a class="code" href="structSVF_1_1SVFUtil_1_1isa__impl__cl.html">isa_impl_cl</a><To, From*></div><div class="line"><a name="l00121"></a><span class="lineno"> 121</span> {</div><div class="line"><a name="l00122"></a><span class="lineno"><a class="line" href="structSVF_1_1SVFUtil_1_1isa__impl__cl_3_01To_00_01From_01_5_01_4.html#a8add67bd107583b7c34fce53a748bcb0"> 122</a></span>  <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">bool</span> <a class="code" href="structSVF_1_1SVFUtil_1_1isa__impl__cl_3_01To_00_01From_01_5_01_4.html#a8add67bd107583b7c34fce53a748bcb0">doit</a>(<span class="keyword">const</span> From *Val)</div><div class="line"><a name="l00123"></a><span class="lineno"> 123</span>  {</div><div class="line"><a name="l00124"></a><span class="lineno"> 124</span>  <a class="code" href="util_8h.html#a07d17d6d5d1074c0969bc5d3c3d1d84a">assert</a>(Val && <span class="stringliteral">"llvm::isa<> used on a null pointer"</span>);</div><div class="line"><a name="l00125"></a><span class="lineno"> 125</span>  <span class="keywordflow">return</span> <a class="code" href="structSVF_1_1SVFUtil_1_1isa__impl.html#a150c6a99c45befa44a4cd2bcc8d06eee">isa_impl<To, From>::doit</a>(*Val);</div><div class="line"><a name="l00126"></a><span class="lineno"> 126</span>  }</div><div class="line"><a name="l00127"></a><span class="lineno"> 127</span> };</div><div class="line"><a name="l00128"></a><span class="lineno"> 128</span> </div><div class="line"><a name="l00129"></a><span class="lineno"><a class="line" href="structSVF_1_1SVFUtil_1_1isa__impl__cl_3_01To_00_01From_01_5const_01_4.html"> 129</a></span> <span class="keyword">template</span> <<span class="keyword">typename</span> To, <span class="keyword">typename</span> From> <span class="keyword">struct </span><a class="code" href="structSVF_1_1SVFUtil_1_1isa__impl__cl.html">isa_impl_cl</a><To, From*<span class="keyword">const</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"><a class="line" href="structSVF_1_1SVFUtil_1_1isa__impl__cl_3_01To_00_01From_01_5const_01_4.html#ac95b00b5d96e6b8457ecade4dbda3de3"> 131</a></span>  <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">bool</span> <a class="code" href="structSVF_1_1SVFUtil_1_1isa__impl__cl_3_01To_00_01From_01_5const_01_4.html#ac95b00b5d96e6b8457ecade4dbda3de3">doit</a>(<span class="keyword">const</span> From *Val)</div><div class="line"><a name="l00132"></a><span class="lineno"> 132</span>  {</div><div class="line"><a name="l00133"></a><span class="lineno"> 133</span>  <a class="code" href="util_8h.html#a07d17d6d5d1074c0969bc5d3c3d1d84a">assert</a>(Val && <span class="stringliteral">"llvm::isa<> used on a null pointer"</span>);</div><div class="line"><a name="l00134"></a><span class="lineno"> 134</span>  <span class="keywordflow">return</span> <a class="code" href="structSVF_1_1SVFUtil_1_1isa__impl.html#a150c6a99c45befa44a4cd2bcc8d06eee">isa_impl<To, From>::doit</a>(*Val);</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"> 137</span> </div><div class="line"><a name="l00138"></a><span class="lineno"><a class="line" href="structSVF_1_1SVFUtil_1_1isa__impl__cl_3_01To_00_01const_01From_01_5_01_4.html"> 138</a></span> <span class="keyword">template</span> <<span class="keyword">typename</span> To, <span class="keyword">typename</span> From> <span class="keyword">struct </span><a class="code" href="structSVF_1_1SVFUtil_1_1isa__impl__cl.html">isa_impl_cl</a><To, const From*></div><div class="line"><a name="l00139"></a><span class="lineno"> 139</span> {</div><div class="line"><a name="l00140"></a><span class="lineno"><a class="line" href="structSVF_1_1SVFUtil_1_1isa__impl__cl_3_01To_00_01const_01From_01_5_01_4.html#a761b612c6ee476a28aabfbbc6b2da7ab"> 140</a></span>  <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">bool</span> <a class="code" href="structSVF_1_1SVFUtil_1_1isa__impl__cl_3_01To_00_01const_01From_01_5_01_4.html#a761b612c6ee476a28aabfbbc6b2da7ab">doit</a>(<span class="keyword">const</span> From *Val)</div><div class="line"><a name="l00141"></a><span class="lineno"> 141</span>  {</div><div class="line"><a name="l00142"></a><span class="lineno"> 142</span>  <a class="code" href="util_8h.html#a07d17d6d5d1074c0969bc5d3c3d1d84a">assert</a>(Val && <span class="stringliteral">"llvm::isa<> used on a null pointer"</span>);</div><div class="line"><a name="l00143"></a><span class="lineno"> 143</span>  <span class="keywordflow">return</span> <a class="code" href="structSVF_1_1SVFUtil_1_1isa__impl.html#a150c6a99c45befa44a4cd2bcc8d06eee">isa_impl<To, From>::doit</a>(*Val);</div><div class="line"><a name="l00144"></a><span class="lineno"> 144</span>  }</div><div class="line"><a name="l00145"></a><span class="lineno"> 145</span> };</div><div class="line"><a name="l00146"></a><span class="lineno"> 146</span> </div><div class="line"><a name="l00147"></a><span class="lineno"><a class="line" href="structSVF_1_1SVFUtil_1_1isa__impl__cl_3_01To_00_01const_01From_01_5const_01_4.html"> 147</a></span> <span class="keyword">template</span> <<span class="keyword">typename</span> To, <span class="keyword">typename</span> From> <span class="keyword">struct </span><a class="code" href="structSVF_1_1SVFUtil_1_1isa__impl__cl.html">isa_impl_cl</a><To, const From*<span class="keyword">const</span>></div><div class="line"><a name="l00148"></a><span class="lineno"> 148</span> {</div><div class="line"><a name="l00149"></a><span class="lineno"><a class="line" href="structSVF_1_1SVFUtil_1_1isa__impl__cl_3_01To_00_01const_01From_01_5const_01_4.html#af73d1d0d7eb6f51090b4df47b497483a"> 149</a></span>  <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">bool</span> <a class="code" href="structSVF_1_1SVFUtil_1_1isa__impl__cl_3_01To_00_01const_01From_01_5const_01_4.html#af73d1d0d7eb6f51090b4df47b497483a">doit</a>(<span class="keyword">const</span> From *Val)</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>  <a class="code" href="util_8h.html#a07d17d6d5d1074c0969bc5d3c3d1d84a">assert</a>(Val && <span class="stringliteral">"llvm::isa<> used on a null pointer"</span>);</div><div class="line"><a name="l00152"></a><span class="lineno"> 152</span>  <span class="keywordflow">return</span> <a class="code" href="structSVF_1_1SVFUtil_1_1isa__impl.html#a150c6a99c45befa44a4cd2bcc8d06eee">isa_impl<To, From>::doit</a>(*Val);</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> </div><div class="line"><a name="l00156"></a><span class="lineno"> 156</span> <span class="keyword">template</span><<span class="keyword">typename</span> To, <span class="keyword">typename</span> From, <span class="keyword">typename</span> SimpleFrom></div><div class="line"><a name="l00157"></a><span class="lineno"><a class="line" href="structSVF_1_1SVFUtil_1_1isa__impl__wrap.html"> 157</a></span> <span class="keyword">struct </span><a class="code" href="structSVF_1_1SVFUtil_1_1isa__impl__wrap.html">isa_impl_wrap</a></div><div class="line"><a name="l00158"></a><span class="lineno"> 158</span> {</div><div class="line"><a name="l00159"></a><span class="lineno"> 159</span>  <span class="comment">// When From != SimplifiedType, we can simplify the type some more by using</span></div><div class="line"><a name="l00160"></a><span class="lineno"> 160</span>  <span class="comment">// the simplify_type template.</span></div><div class="line"><a name="l00161"></a><span class="lineno"><a class="line" href="structSVF_1_1SVFUtil_1_1isa__impl__wrap.html#aa0f166d8bdcd1e7b954cc29c19a40b04"> 161</a></span>  <span class="keyword">static</span> <span class="keywordtype">bool</span> <a class="code" href="structSVF_1_1SVFUtil_1_1isa__impl__wrap.html#aa0f166d8bdcd1e7b954cc29c19a40b04">doit</a>(<span class="keyword">const</span> From &Val)</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>  <span class="keywordflow">return</span> <a class="code" href="structSVF_1_1SVFUtil_1_1isa__impl__wrap.html">isa_impl_wrap</a><To, SimpleFrom,</div><div class="line"><a name="l00164"></a><span class="lineno"> 164</span>  <span class="keyword">typename</span> <a class="code" href="structSVF_1_1SVFUtil_1_1simplify__type.html#a40c0d9a74681d3eaa7172ba137d489e4">simplify_type<SimpleFrom>::SimpleType</a>>::doit(</div><div class="line"><a name="l00165"></a><span class="lineno"> 165</span>  <a class="code" href="structSVF_1_1SVFUtil_1_1simplify__type.html">simplify_type<const From>::getSimplifiedValue</a>(Val));</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> };</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="keyword">template</span><<span class="keyword">typename</span> To, <span class="keyword">typename</span> FromTy></div><div class="line"><a name="l00170"></a><span class="lineno"><a class="line" href="structSVF_1_1SVFUtil_1_1isa__impl__wrap_3_01To_00_01FromTy_00_01FromTy_01_4.html"> 170</a></span> <span class="keyword">struct </span><a class="code" href="structSVF_1_1SVFUtil_1_1isa__impl__wrap.html">isa_impl_wrap</a><To, FromTy, FromTy></div><div class="line"><a name="l00171"></a><span class="lineno"> 171</span> {</div><div class="line"><a name="l00172"></a><span class="lineno"> 172</span>  <span class="comment">// When From == SimpleType, we are as simple as we are going to get.</span></div><div class="line"><a name="l00173"></a><span class="lineno"><a class="line" href="structSVF_1_1SVFUtil_1_1isa__impl__wrap_3_01To_00_01FromTy_00_01FromTy_01_4.html#a414dc089b04305b8580dede7a6337404"> 173</a></span>  <span class="keyword">static</span> <span class="keywordtype">bool</span> <a class="code" href="structSVF_1_1SVFUtil_1_1isa__impl__wrap_3_01To_00_01FromTy_00_01FromTy_01_4.html#a414dc089b04305b8580dede7a6337404">doit</a>(<span class="keyword">const</span> FromTy &Val)</div><div class="line"><a name="l00174"></a><span class="lineno"> 174</span>  {</div><div class="line"><a name="l00175"></a><span class="lineno"> 175</span>  <span class="keywordflow">return</span> <a class="code" href="structSVF_1_1SVFUtil_1_1isa__impl__cl.html#afbe68352d888c0b15e9f46d4e378bacb">isa_impl_cl<To,FromTy>::doit</a>(Val);</div><div class="line"><a name="l00176"></a><span class="lineno"> 176</span>  }</div><div class="line"><a name="l00177"></a><span class="lineno"> 177</span> };</div><div class="line"><a name="l00178"></a><span class="lineno"> 178</span> </div><div class="line"><a name="l00179"></a><span class="lineno"> 179</span> <span class="comment">// llvm::isa<X> - Return true if the parameter to the template is an instance of the</span></div><div class="line"><a name="l00180"></a><span class="lineno"> 180</span> <span class="comment">// template type argument. Used like this:</span></div><div class="line"><a name="l00181"></a><span class="lineno"> 181</span> <span class="comment">//</span></div><div class="line"><a name="l00182"></a><span class="lineno"> 182</span> <span class="comment">// if (llvm::isa<Type>(myVal)) { ... }</span></div><div class="line"><a name="l00183"></a><span class="lineno"> 183</span> <span class="comment">//</span></div><div class="line"><a name="l00184"></a><span class="lineno"><a class="line" href="namespaceSVF_1_1SVFUtil.html#a5c8cbc986cccb9d84f87aae162df3737"> 184</a></span> <span class="keyword">template</span> <<span class="keyword">class</span> X, <span class="keyword">class</span> Y> LLVM_NODISCARD <span class="keyword">inline</span> <span class="keywordtype">bool</span> <a class="code" href="namespaceSVF_1_1SVFUtil.html#a5c8cbc986cccb9d84f87aae162df3737">isa</a>(<span class="keyword">const</span> Y &Val)</div><div class="line"><a name="l00185"></a><span class="lineno"> 185</span> {</div><div class="line"><a name="l00186"></a><span class="lineno"> 186</span>  <span class="keywordflow">return</span> <a class="code" href="structSVF_1_1SVFUtil_1_1isa__impl__wrap.html">isa_impl_wrap</a><X, <span class="keyword">const</span> Y,</div><div class="line"><a name="l00187"></a><span class="lineno"> 187</span>  <span class="keyword">typename</span> <a class="code" href="structSVF_1_1SVFUtil_1_1simplify__type.html#a40c0d9a74681d3eaa7172ba137d489e4">simplify_type<const Y>::SimpleType</a>>::doit(Val);</div><div class="line"><a name="l00188"></a><span class="lineno"> 188</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> <span class="comment">//===----------------------------------------------------------------------===//</span></div><div class="line"><a name="l00191"></a><span class="lineno"> 191</span> <span class="comment">// cast<x> Support Templates</span></div><div class="line"><a name="l00192"></a><span class="lineno"> 192</span> <span class="comment">//===----------------------------------------------------------------------===//</span></div><div class="line"><a name="l00193"></a><span class="lineno"> 193</span> </div><div class="line"><a name="l00194"></a><span class="lineno"><a class="line" href="structSVF_1_1SVFUtil_1_1cast__retty.html"> 194</a></span> <span class="keyword">template</span><<span class="keyword">class</span> To, <span class="keyword">class</span> From> <span class="keyword">struct </span><a class="code" href="structSVF_1_1SVFUtil_1_1cast__retty.html">cast_retty</a>;</div><div class="line"><a name="l00195"></a><span class="lineno"> 195</span> </div><div class="line"><a name="l00196"></a><span class="lineno"> 196</span> <span class="comment">// Calculate what type the 'cast' function should return, based on a requested</span></div><div class="line"><a name="l00197"></a><span class="lineno"> 197</span> <span class="comment">// type of To and a source type of From.</span></div><div class="line"><a name="l00198"></a><span class="lineno"><a class="line" href="structSVF_1_1SVFUtil_1_1cast__retty__impl.html"> 198</a></span> <span class="keyword">template</span><<span class="keyword">class</span> To, <span class="keyword">class</span> From> <span class="keyword">struct </span><a class="code" href="structSVF_1_1SVFUtil_1_1cast__retty__impl.html">cast_retty_impl</a></div><div class="line"><a name="l00199"></a><span class="lineno"> 199</span> {</div><div class="line"><a name="l00200"></a><span class="lineno"><a class="line" href="structSVF_1_1SVFUtil_1_1cast__retty__impl.html#a5f8f6d651931eba7e0fa14c26a691a04"> 200</a></span>  <span class="keyword">using</span> <a class="code" href="structSVF_1_1SVFUtil_1_1cast__retty__impl.html#a5f8f6d651931eba7e0fa14c26a691a04">ret_type</a> = To &; <span class="comment">// Normal case, return Ty&</span></div><div class="line"><a name="l00201"></a><span class="lineno"> 201</span> };</div><div class="line"><a name="l00202"></a><span class="lineno"><a class="line" href="structSVF_1_1SVFUtil_1_1cast__retty__impl_3_01To_00_01const_01From_01_4.html"> 202</a></span> <span class="keyword">template</span><<span class="keyword">class</span> To, <span class="keyword">class</span> From> <span class="keyword">struct </span><a class="code" href="structSVF_1_1SVFUtil_1_1cast__retty__impl.html">cast_retty_impl</a><To, const From></div><div class="line"><a name="l00203"></a><span class="lineno"> 203</span> {</div><div class="line"><a name="l00204"></a><span class="lineno"><a class="line" href="structSVF_1_1SVFUtil_1_1cast__retty__impl_3_01To_00_01const_01From_01_4.html#ad0bc349135b60cc51fd040b615a979f7"> 204</a></span>  <span class="keyword">using</span> <a class="code" href="structSVF_1_1SVFUtil_1_1cast__retty__impl_3_01To_00_01const_01From_01_4.html#ad0bc349135b60cc51fd040b615a979f7">ret_type</a> = <span class="keyword">const</span> To &; <span class="comment">// Normal case, return Ty&</span></div><div class="line"><a name="l00205"></a><span class="lineno"> 205</span> };</div><div class="line"><a name="l00206"></a><span class="lineno"> 206</span> </div><div class="line"><a name="l00207"></a><span class="lineno"><a class="line" href="structSVF_1_1SVFUtil_1_1cast__retty__impl_3_01To_00_01From_01_5_01_4.html"> 207</a></span> <span class="keyword">template</span><<span class="keyword">class</span> To, <span class="keyword">class</span> From> <span class="keyword">struct </span><a class="code" href="structSVF_1_1SVFUtil_1_1cast__retty__impl.html">cast_retty_impl</a><To, From*></div><div class="line"><a name="l00208"></a><span class="lineno"> 208</span> {</div><div class="line"><a name="l00209"></a><span class="lineno"><a class="line" href="structSVF_1_1SVFUtil_1_1cast__retty__impl_3_01To_00_01From_01_5_01_4.html#a86c02dc15b65d0c052ea4447b3fb6333"> 209</a></span>  <span class="keyword">using</span> <a class="code" href="structSVF_1_1SVFUtil_1_1cast__retty__impl_3_01To_00_01From_01_5_01_4.html#a86c02dc15b65d0c052ea4447b3fb6333">ret_type</a> = To *; <span class="comment">// Pointer arg case, return Ty*</span></div><div class="line"><a name="l00210"></a><span class="lineno"> 210</span> };</div><div class="line"><a name="l00211"></a><span class="lineno"> 211</span> </div><div class="line"><a name="l00212"></a><span class="lineno"><a class="line" href="structSVF_1_1SVFUtil_1_1cast__retty__impl_3_01To_00_01const_01From_01_5_01_4.html"> 212</a></span> <span class="keyword">template</span><<span class="keyword">class</span> To, <span class="keyword">class</span> From> <span class="keyword">struct </span><a class="code" href="structSVF_1_1SVFUtil_1_1cast__retty__impl.html">cast_retty_impl</a><To, const From*></div><div class="line"><a name="l00213"></a><span class="lineno"> 213</span> {</div><div class="line"><a name="l00214"></a><span class="lineno"><a class="line" href="structSVF_1_1SVFUtil_1_1cast__retty__impl_3_01To_00_01const_01From_01_5_01_4.html#a98a60de95a331a34dcbad6da9961a9b7"> 214</a></span>  <span class="keyword">using</span> <a class="code" href="structSVF_1_1SVFUtil_1_1cast__retty__impl_3_01To_00_01const_01From_01_5_01_4.html#a98a60de95a331a34dcbad6da9961a9b7">ret_type</a> = <span class="keyword">const</span> To *; <span class="comment">// Constant pointer arg case, return const Ty*</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"><a class="line" href="structSVF_1_1SVFUtil_1_1cast__retty__impl_3_01To_00_01const_01From_01_5const_01_4.html"> 217</a></span> <span class="keyword">template</span><<span class="keyword">class</span> To, <span class="keyword">class</span> From> <span class="keyword">struct </span><a class="code" href="structSVF_1_1SVFUtil_1_1cast__retty__impl.html">cast_retty_impl</a><To, const From*<span class="keyword">const</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"><a class="line" href="structSVF_1_1SVFUtil_1_1cast__retty__impl_3_01To_00_01const_01From_01_5const_01_4.html#add8668ca96bbf0808c146cc81c62267c"> 219</a></span>  <span class="keyword">using</span> <a class="code" href="structSVF_1_1SVFUtil_1_1cast__retty__impl_3_01To_00_01const_01From_01_5const_01_4.html#add8668ca96bbf0808c146cc81c62267c">ret_type</a> = <span class="keyword">const</span> To *; <span class="comment">// Constant pointer arg case, return const Ty*</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> <span class="keyword">template</span> <<span class="keyword">class</span> To, <span class="keyword">class</span> From></div><div class="line"><a name="l00223"></a><span class="lineno"><a class="line" href="structSVF_1_1SVFUtil_1_1cast__retty__impl_3_01To_00_01std_1_1unique__ptr_3_01From_01_4_01_4.html"> 223</a></span> <span class="keyword">struct </span><a class="code" href="structSVF_1_1SVFUtil_1_1cast__retty__impl.html">cast_retty_impl</a><To, <a class="code" href="namespacestd.html">std</a>::unique_ptr<From>></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> <span class="keyword">private</span>:</div><div class="line"><a name="l00226"></a><span class="lineno"><a class="line" href="structSVF_1_1SVFUtil_1_1cast__retty__impl_3_01To_00_01std_1_1unique__ptr_3_01From_01_4_01_4.html#a9d08abc346f3b77c487eba144f3cbd8d"> 226</a></span>  <span class="keyword">using</span> <a class="code" href="structSVF_1_1SVFUtil_1_1cast__retty__impl_3_01To_00_01std_1_1unique__ptr_3_01From_01_4_01_4.html#a9d08abc346f3b77c487eba144f3cbd8d">PointerType</a> = <span class="keyword">typename</span> <a class="code" href="structSVF_1_1SVFUtil_1_1cast__retty__impl.html#a5f8f6d651931eba7e0fa14c26a691a04">cast_retty_impl<To, From *>::ret_type</a>;</div><div class="line"><a name="l00227"></a><span class="lineno"><a class="line" href="structSVF_1_1SVFUtil_1_1cast__retty__impl_3_01To_00_01std_1_1unique__ptr_3_01From_01_4_01_4.html#a052f7cd3a81e368060f132bf0268fa68"> 227</a></span>  <span class="keyword">using</span> <a class="code" href="structSVF_1_1SVFUtil_1_1cast__retty__impl_3_01To_00_01std_1_1unique__ptr_3_01From_01_4_01_4.html#a052f7cd3a81e368060f132bf0268fa68">ResultType</a> = <span class="keyword">typename</span> std::remove_pointer<PointerType>::type;</div><div class="line"><a name="l00228"></a><span class="lineno"> 228</span> </div><div class="line"><a name="l00229"></a><span class="lineno"> 229</span> <span class="keyword">public</span>:</div><div class="line"><a name="l00230"></a><span class="lineno"><a class="line" href="structSVF_1_1SVFUtil_1_1cast__retty__impl_3_01To_00_01std_1_1unique__ptr_3_01From_01_4_01_4.html#a3bf80190e39c339d4e3ec703789ae845"> 230</a></span>  <span class="keyword">using</span> <a class="code" href="structSVF_1_1SVFUtil_1_1cast__retty__impl_3_01To_00_01std_1_1unique__ptr_3_01From_01_4_01_4.html#a3bf80190e39c339d4e3ec703789ae845">ret_type</a> = std::unique_ptr<ResultType>;</div><div class="line"><a name="l00231"></a><span class="lineno"> 231</span> };</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> <span class="keyword">template</span><<span class="keyword">class</span> To, <span class="keyword">class</span> From, <span class="keyword">class</span> SimpleFrom></div><div class="line"><a name="l00234"></a><span class="lineno"><a class="line" href="structSVF_1_1SVFUtil_1_1cast__retty__wrap.html"> 234</a></span> <span class="keyword">struct </span><a class="code" href="structSVF_1_1SVFUtil_1_1cast__retty__wrap.html">cast_retty_wrap</a></div><div class="line"><a name="l00235"></a><span class="lineno"> 235</span> {</div><div class="line"><a name="l00236"></a><span class="lineno"> 236</span>  <span class="comment">// When the simplified type and the from type are not the same, use the type</span></div><div class="line"><a name="l00237"></a><span class="lineno"> 237</span>  <span class="comment">// simplifier to reduce the type, then reuse cast_retty_impl to get the</span></div><div class="line"><a name="l00238"></a><span class="lineno"> 238</span>  <span class="comment">// resultant type.</span></div><div class="line"><a name="l00239"></a><span class="lineno"><a class="line" href="structSVF_1_1SVFUtil_1_1cast__retty__wrap.html#af3d80ab43e47626f32c91a6c4454e82e"> 239</a></span>  <span class="keyword">using</span> <a class="code" href="structSVF_1_1SVFUtil_1_1cast__retty__wrap.html#af3d80ab43e47626f32c91a6c4454e82e">ret_type</a> = <span class="keyword">typename</span> <a class="code" href="structSVF_1_1SVFUtil_1_1cast__retty.html#aea91708cabb8176b031f1c1fdb89a15b">cast_retty<To, SimpleFrom>::ret_type</a>;</div><div class="line"><a name="l00240"></a><span class="lineno"> 240</span> };</div><div class="line"><a name="l00241"></a><span class="lineno"> 241</span> </div><div class="line"><a name="l00242"></a><span class="lineno"> 242</span> <span class="keyword">template</span><<span class="keyword">class</span> To, <span class="keyword">class</span> FromTy></div><div class="line"><a name="l00243"></a><span class="lineno"><a class="line" href="structSVF_1_1SVFUtil_1_1cast__retty__wrap_3_01To_00_01FromTy_00_01FromTy_01_4.html"> 243</a></span> <span class="keyword">struct </span><a class="code" href="structSVF_1_1SVFUtil_1_1cast__retty__wrap.html">cast_retty_wrap</a><To, FromTy, FromTy></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="comment">// When the simplified type is equal to the from type, use it directly.</span></div><div class="line"><a name="l00246"></a><span class="lineno"><a class="line" href="structSVF_1_1SVFUtil_1_1cast__retty__wrap_3_01To_00_01FromTy_00_01FromTy_01_4.html#ad989c130f2b6cd5a0f1ba0c7abd62b9a"> 246</a></span>  <span class="keyword">using</span> <a class="code" href="structSVF_1_1SVFUtil_1_1cast__retty__wrap_3_01To_00_01FromTy_00_01FromTy_01_4.html#ad989c130f2b6cd5a0f1ba0c7abd62b9a">ret_type</a> = <span class="keyword">typename</span> <a class="code" href="structSVF_1_1SVFUtil_1_1cast__retty__impl.html#a5f8f6d651931eba7e0fa14c26a691a04">cast_retty_impl<To,FromTy>::ret_type</a>;</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> </div><div class="line"><a name="l00249"></a><span class="lineno"> 249</span> <span class="keyword">template</span><<span class="keyword">class</span> To, <span class="keyword">class</span> From></div><div class="line"><a name="l00250"></a><span class="lineno"> 250</span> <span class="keyword">struct </span><a class="code" href="structSVF_1_1SVFUtil_1_1cast__retty.html">cast_retty</a></div><div class="line"><a name="l00251"></a><span class="lineno"> 251</span> {</div><div class="line"><a name="l00252"></a><span class="lineno"> 252</span>  <span class="keyword">using</span> <a class="code" href="structSVF_1_1SVFUtil_1_1cast__retty__wrap_3_01To_00_01FromTy_00_01FromTy_01_4.html#ad989c130f2b6cd5a0f1ba0c7abd62b9a">ret_type</a> = <span class="keyword">typename</span> <a class="code" href="structSVF_1_1SVFUtil_1_1cast__retty__wrap.html">cast_retty_wrap</a><</div><div class="line"><a name="l00253"></a><span class="lineno"><a class="line" href="structSVF_1_1SVFUtil_1_1cast__retty.html#aea91708cabb8176b031f1c1fdb89a15b"> 253</a></span>  To, From, <span class="keyword">typename</span> <a class="code" href="structSVF_1_1SVFUtil_1_1simplify__type.html#a40c0d9a74681d3eaa7172ba137d489e4">simplify_type<From>::SimpleType</a>><a class="code" href="structSVF_1_1SVFUtil_1_1cast__retty.html#aea91708cabb8176b031f1c1fdb89a15b">::ret_type</a>;</div><div class="line"><a name="l00254"></a><span class="lineno"> 254</span> };</div><div class="line"><a name="l00255"></a><span class="lineno"> 255</span> </div><div class="line"><a name="l00256"></a><span class="lineno"> 256</span> <span class="comment">// Ensure the non-simple values are converted using the simplify_type template</span></div><div class="line"><a name="l00257"></a><span class="lineno"> 257</span> <span class="comment">// that may be specialized by smart pointers...</span></div><div class="line"><a name="l00258"></a><span class="lineno"> 258</span> <span class="comment">//</span></div><div class="line"><a name="l00259"></a><span class="lineno"><a class="line" href="structSVF_1_1SVFUtil_1_1cast__convert__val.html"> 259</a></span> <span class="keyword">template</span><<span class="keyword">class</span> To, <span class="keyword">class</span> From, <span class="keyword">class</span> SimpleFrom> <span class="keyword">struct </span><a class="code" href="structSVF_1_1SVFUtil_1_1cast__convert__val.html">cast_convert_val</a></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>  <span class="comment">// This is not a simple type, use the template to simplify it...</span></div><div class="line"><a name="l00262"></a><span class="lineno"><a class="line" href="structSVF_1_1SVFUtil_1_1cast__convert__val.html#a42987ff69d76fef88044fe0b19743239"> 262</a></span>  <span class="keyword">static</span> <span class="keyword">typename</span> <a class="code" href="structSVF_1_1SVFUtil_1_1cast__retty.html#aea91708cabb8176b031f1c1fdb89a15b">cast_retty<To, From>::ret_type</a> <a class="code" href="structSVF_1_1SVFUtil_1_1cast__convert__val.html#a42987ff69d76fef88044fe0b19743239">doit</a>(From &Val)</div><div class="line"><a name="l00263"></a><span class="lineno"> 263</span>  {</div><div class="line"><a name="l00264"></a><span class="lineno"> 264</span>  <span class="keywordflow">return</span> <a class="code" href="structSVF_1_1SVFUtil_1_1cast__convert__val.html">cast_convert_val</a><To, SimpleFrom,</div><div class="line"><a name="l00265"></a><span class="lineno"> 265</span>  <span class="keyword">typename</span> <a class="code" href="structSVF_1_1SVFUtil_1_1simplify__type.html#a40c0d9a74681d3eaa7172ba137d489e4">simplify_type<SimpleFrom>::SimpleType</a>>::doit(</div><div class="line"><a name="l00266"></a><span class="lineno"> 266</span>  <a class="code" href="structSVF_1_1SVFUtil_1_1simplify__type.html">simplify_type<From>::getSimplifiedValue</a>(Val));</div><div class="line"><a name="l00267"></a><span class="lineno"> 267</span>  }</div><div class="line"><a name="l00268"></a><span class="lineno"> 268</span> };</div><div class="line"><a name="l00269"></a><span class="lineno"> 269</span> </div><div class="line"><a name="l00270"></a><span class="lineno"><a class="line" href="structSVF_1_1SVFUtil_1_1cast__convert__val_3_01To_00_01FromTy_00_01FromTy_01_4.html"> 270</a></span> <span class="keyword">template</span><<span class="keyword">class</span> To, <span class="keyword">class</span> FromTy> <span class="keyword">struct </span><a class="code" href="structSVF_1_1SVFUtil_1_1cast__convert__val.html">cast_convert_val</a><To,FromTy,FromTy></div><div class="line"><a name="l00271"></a><span class="lineno"> 271</span> {</div><div class="line"><a name="l00272"></a><span class="lineno"> 272</span>  <span class="comment">// This _is_ a simple type, just cast it.</span></div><div class="line"><a name="l00273"></a><span class="lineno"><a class="line" href="structSVF_1_1SVFUtil_1_1cast__convert__val_3_01To_00_01FromTy_00_01FromTy_01_4.html#a2dd56ef15d86f61c7fef34dc15173e4a"> 273</a></span>  <span class="keyword">static</span> <span class="keyword">typename</span> <a class="code" href="structSVF_1_1SVFUtil_1_1cast__retty.html#aea91708cabb8176b031f1c1fdb89a15b">cast_retty<To, FromTy>::ret_type</a> <a class="code" href="structSVF_1_1SVFUtil_1_1cast__convert__val_3_01To_00_01FromTy_00_01FromTy_01_4.html#a2dd56ef15d86f61c7fef34dc15173e4a">doit</a>(<span class="keyword">const</span> FromTy &Val)</div><div class="line"><a name="l00274"></a><span class="lineno"> 274</span>  {</div><div class="line"><a name="l00275"></a><span class="lineno"> 275</span>  <span class="keyword">typename</span> <a class="code" href="structSVF_1_1SVFUtil_1_1cast__retty.html#aea91708cabb8176b031f1c1fdb89a15b">cast_retty<To, FromTy>::ret_type</a> Res2</div><div class="line"><a name="l00276"></a><span class="lineno"> 276</span>  = (<span class="keyword">typename</span> <a class="code" href="structSVF_1_1SVFUtil_1_1cast__retty.html#aea91708cabb8176b031f1c1fdb89a15b">cast_retty<To, FromTy>::ret_type</a>)const_cast<FromTy&>(Val);</div><div class="line"><a name="l00277"></a><span class="lineno"> 277</span>  <span class="keywordflow">return</span> Res2;</div><div class="line"><a name="l00278"></a><span class="lineno"> 278</span>  }</div><div class="line"><a name="l00279"></a><span class="lineno"> 279</span> };</div><div class="line"><a name="l00280"></a><span class="lineno"> 280</span> </div><div class="line"><a name="l00281"></a><span class="lineno"><a class="line" href="structSVF_1_1SVFUtil_1_1is__simple__type.html"> 281</a></span> <span class="keyword">template</span> <<span class="keyword">class</span> X> <span class="keyword">struct </span><a class="code" href="structSVF_1_1SVFUtil_1_1is__simple__type.html">is_simple_type</a></div><div class="line"><a name="l00282"></a><span class="lineno"> 282</span> {</div><div class="line"><a name="l00283"></a><span class="lineno"><a class="line" href="structSVF_1_1SVFUtil_1_1is__simple__type.html#a700d43a1b318fb30fa9472da323cb34f"> 283</a></span>  <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">bool</span> value =</div><div class="line"><a name="l00284"></a><span class="lineno"> 284</span>  std::is_same<X, typename simplify_type<X>::SimpleType>::value;</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> </div><div class="line"><a name="l00287"></a><span class="lineno"> 287</span> <span class="comment">// cast<X> - Return the argument parameter cast to the specified type. This</span></div><div class="line"><a name="l00288"></a><span class="lineno"> 288</span> <span class="comment">// casting operator asserts that the type is correct, so it does not return null</span></div><div class="line"><a name="l00289"></a><span class="lineno"> 289</span> <span class="comment">// on failure. It does not allow a null argument (use cast_or_null for that).</span></div><div class="line"><a name="l00290"></a><span class="lineno"> 290</span> <span class="comment">// It is typically used like this:</span></div><div class="line"><a name="l00291"></a><span class="lineno"> 291</span> <span class="comment">//</span></div><div class="line"><a name="l00292"></a><span class="lineno"> 292</span> <span class="comment">// cast<Instruction>(myVal)->getParent()</span></div><div class="line"><a name="l00293"></a><span class="lineno"> 293</span> <span class="comment">//</span></div><div class="line"><a name="l00294"></a><span class="lineno"> 294</span> <span class="keyword">template</span> <<span class="keyword">class</span> X, <span class="keyword">class</span> Y></div><div class="line"><a name="l00295"></a><span class="lineno"> 295</span> <span class="keyword">inline</span> <span class="keyword">typename</span> std::enable_if<!is_simple_type<Y>::value,</div><div class="line"><a name="l00296"></a><span class="lineno"> 296</span>  <span class="keyword">typename</span> <a class="code" href="structSVF_1_1SVFUtil_1_1cast__retty.html#aea91708cabb8176b031f1c1fdb89a15b">cast_retty<X, const Y>::ret_type</a>>::type</div><div class="line"><a name="l00297"></a><span class="lineno"><a class="line" href="namespaceSVF_1_1SVFUtil.html#a0d100868bf63b968d387eb50e9603f7c"> 297</a></span>  <a class="code" href="namespaceSVF_1_1SVFUtil.html#a0d100868bf63b968d387eb50e9603f7c">cast</a>(<span class="keyword">const</span> Y &Val)</div><div class="line"><a name="l00298"></a><span class="lineno"> 298</span> {</div><div class="line"><a name="l00299"></a><span class="lineno"> 299</span>  <a class="code" href="util_8h.html#a07d17d6d5d1074c0969bc5d3c3d1d84a">assert</a>(llvm::isa<X>(Val) && <span class="stringliteral">"cast<Ty>() argument of incompatible type!"</span>);</div><div class="line"><a name="l00300"></a><span class="lineno"> 300</span>  <span class="keywordflow">return</span> <a class="code" href="structSVF_1_1SVFUtil_1_1cast__convert__val.html">cast_convert_val</a><</div><div class="line"><a name="l00301"></a><span class="lineno"> 301</span>  X, <span class="keyword">const</span> Y, <span class="keyword">typename</span> <a class="code" href="structSVF_1_1SVFUtil_1_1simplify__type.html#a40c0d9a74681d3eaa7172ba137d489e4">simplify_type<const Y>::SimpleType</a>>::doit(Val);</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> </div><div class="line"><a name="l00304"></a><span class="lineno"> 304</span> <span class="keyword">template</span> <<span class="keyword">class</span> X, <span class="keyword">class</span> Y></div><div class="line"><a name="l00305"></a><span class="lineno"><a class="line" href="namespaceSVF_1_1SVFUtil.html#a406dd9baf2ce66235d482fd6c6121b2c"> 305</a></span> <span class="keyword">inline</span> <span class="keyword">typename</span> <a class="code" href="structSVF_1_1SVFUtil_1_1cast__retty.html#aea91708cabb8176b031f1c1fdb89a15b">cast_retty<X, Y>::ret_type</a> <a class="code" href="namespaceSVF_1_1SVFUtil.html#a0d100868bf63b968d387eb50e9603f7c">cast</a>(Y &Val)</div><div class="line"><a name="l00306"></a><span class="lineno"> 306</span> {</div><div class="line"><a name="l00307"></a><span class="lineno"> 307</span>  <a class="code" href="util_8h.html#a07d17d6d5d1074c0969bc5d3c3d1d84a">assert</a>(llvm::isa<X>(Val) && <span class="stringliteral">"cast<Ty>() argument of incompatible type!"</span>);</div><div class="line"><a name="l00308"></a><span class="lineno"> 308</span>  <span class="keywordflow">return</span> <a class="code" href="structSVF_1_1SVFUtil_1_1cast__convert__val.html">cast_convert_val</a><X, Y,</div><div class="line"><a name="l00309"></a><span class="lineno"> 309</span>  <span class="keyword">typename</span> <a class="code" href="structSVF_1_1SVFUtil_1_1simplify__type.html#a40c0d9a74681d3eaa7172ba137d489e4">simplify_type<Y>::SimpleType</a>>::doit(Val);</div><div class="line"><a name="l00310"></a><span class="lineno"> 310</span> }</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> <span class="keyword">template</span> <<span class="keyword">class</span> X, <span class="keyword">class</span> Y></div><div class="line"><a name="l00313"></a><span class="lineno"><a class="line" href="namespaceSVF_1_1SVFUtil.html#acc2419a55c0427571f11ad14db2fe481"> 313</a></span> <span class="keyword">inline</span> <span class="keyword">typename</span> <a class="code" href="structSVF_1_1SVFUtil_1_1cast__retty.html#aea91708cabb8176b031f1c1fdb89a15b">cast_retty<X, Y *>::ret_type</a> <a class="code" href="namespaceSVF_1_1SVFUtil.html#a0d100868bf63b968d387eb50e9603f7c">cast</a>(Y *Val)</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>  <a class="code" href="util_8h.html#a07d17d6d5d1074c0969bc5d3c3d1d84a">assert</a>(llvm::isa<X>(Val) && <span class="stringliteral">"cast<Ty>() argument of incompatible type!"</span>);</div><div class="line"><a name="l00316"></a><span class="lineno"> 316</span>  <span class="keywordflow">return</span> <a class="code" href="structSVF_1_1SVFUtil_1_1cast__convert__val.html">cast_convert_val</a><X, Y*,</div><div class="line"><a name="l00317"></a><span class="lineno"> 317</span>  <span class="keyword">typename</span> <a class="code" href="structSVF_1_1SVFUtil_1_1simplify__type.html#a40c0d9a74681d3eaa7172ba137d489e4">simplify_type<Y*>::SimpleType</a>>::doit(Val);</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="keyword">template</span> <<span class="keyword">class</span> X, <span class="keyword">class</span> Y></div><div class="line"><a name="l00321"></a><span class="lineno"> 321</span> <span class="keyword">inline</span> <span class="keyword">typename</span> <a class="code" href="structSVF_1_1SVFUtil_1_1cast__retty.html">cast_retty<X, std::unique_ptr<Y></a>>::ret_type</div><div class="line"><a name="l00322"></a><span class="lineno"><a class="line" href="namespaceSVF_1_1SVFUtil.html#af3ca049b4ce83c874e231f5e13bf36a8"> 322</a></span>  <a class="code" href="namespaceSVF_1_1SVFUtil.html#a0d100868bf63b968d387eb50e9603f7c">cast</a>(std::unique_ptr<Y> &&Val)</div><div class="line"><a name="l00323"></a><span class="lineno"> 323</span> {</div><div class="line"><a name="l00324"></a><span class="lineno"> 324</span>  <a class="code" href="util_8h.html#a07d17d6d5d1074c0969bc5d3c3d1d84a">assert</a>(llvm::isa<X>(Val.get()) && <span class="stringliteral">"cast<Ty>() argument of incompatible type!"</span>);</div><div class="line"><a name="l00325"></a><span class="lineno"> 325</span>  <span class="keyword">using</span> ret_type = <span class="keyword">typename</span> <a class="code" href="structSVF_1_1SVFUtil_1_1cast__retty.html">cast_retty<X, std::unique_ptr<Y></a>>::ret_type;</div><div class="line"><a name="l00326"></a><span class="lineno"> 326</span>  <span class="keywordflow">return</span> ret_type(</div><div class="line"><a name="l00327"></a><span class="lineno"> 327</span>  <a class="code" href="structSVF_1_1SVFUtil_1_1cast__convert__val.html">cast_convert_val</a><X, Y *, <span class="keyword">typename</span> <a class="code" href="structSVF_1_1SVFUtil_1_1simplify__type.html#a40c0d9a74681d3eaa7172ba137d489e4">simplify_type<Y *>::SimpleType</a>>::doit(</div><div class="line"><a name="l00328"></a><span class="lineno"> 328</span>  Val.release()));</div><div class="line"><a name="l00329"></a><span class="lineno"> 329</span> }</div><div class="line"><a name="l00330"></a><span class="lineno"> 330</span> </div><div class="line"><a name="l00331"></a><span class="lineno"> 331</span> <span class="comment">// dyn_cast<X> - Return the argument parameter cast to the specified type. This</span></div><div class="line"><a name="l00332"></a><span class="lineno"> 332</span> <span class="comment">// casting operator returns null if the argument is of the wrong type, so it can</span></div><div class="line"><a name="l00333"></a><span class="lineno"> 333</span> <span class="comment">// be used to test for a type as well as cast if successful. This should be</span></div><div class="line"><a name="l00334"></a><span class="lineno"> 334</span> <span class="comment">// used in the context of an if statement like this:</span></div><div class="line"><a name="l00335"></a><span class="lineno"> 335</span> <span class="comment">//</span></div><div class="line"><a name="l00336"></a><span class="lineno"> 336</span> <span class="comment">// if (const Instruction *I = dyn_cast<Instruction>(myVal)) { ... }</span></div><div class="line"><a name="l00337"></a><span class="lineno"> 337</span> <span class="comment">//</span></div><div class="line"><a name="l00338"></a><span class="lineno"> 338</span> </div><div class="line"><a name="l00339"></a><span class="lineno"> 339</span> <span class="keyword">template</span> <<span class="keyword">class</span> X, <span class="keyword">class</span> Y></div><div class="line"><a name="l00340"></a><span class="lineno"> 340</span> LLVM_NODISCARD <span class="keyword">inline</span></div><div class="line"><a name="l00341"></a><span class="lineno"> 341</span> <span class="keyword">typename</span> std::enable_if<!is_simple_type<Y>::value,</div><div class="line"><a name="l00342"></a><span class="lineno"> 342</span>  <span class="keyword">typename</span> <a class="code" href="structSVF_1_1SVFUtil_1_1cast__retty.html#aea91708cabb8176b031f1c1fdb89a15b">cast_retty<X, const Y>::ret_type</a>>::type</div><div class="line"><a name="l00343"></a><span class="lineno"><a class="line" href="namespaceSVF_1_1SVFUtil.html#a8182be247907420db00837cef9bcfa70"> 343</a></span>  <a class="code" href="namespaceSVF_1_1SVFUtil.html#a8182be247907420db00837cef9bcfa70">dyn_cast</a>(<span class="keyword">const</span> Y &Val)</div><div class="line"><a name="l00344"></a><span class="lineno"> 344</span> {</div><div class="line"><a name="l00345"></a><span class="lineno"> 345</span>  <span class="keywordflow">return</span> llvm::isa<X>(Val) ? llvm::cast<X>(Val) : <span class="keyword">nullptr</span>;</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> </div><div class="line"><a name="l00348"></a><span class="lineno"> 348</span> <span class="keyword">template</span> <<span class="keyword">class</span> X, <span class="keyword">class</span> Y></div><div class="line"><a name="l00349"></a><span class="lineno"><a class="line" href="namespaceSVF_1_1SVFUtil.html#a52d852ba8fa569e858565b3bba403656"> 349</a></span> LLVM_NODISCARD <span class="keyword">inline</span> <span class="keyword">typename</span> <a class="code" href="structSVF_1_1SVFUtil_1_1cast__retty.html#aea91708cabb8176b031f1c1fdb89a15b">cast_retty<X, Y>::ret_type</a> <a class="code" href="namespaceSVF_1_1SVFUtil.html#a8182be247907420db00837cef9bcfa70">dyn_cast</a>(Y &Val)</div><div class="line"><a name="l00350"></a><span class="lineno"> 350</span> {</div><div class="line"><a name="l00351"></a><span class="lineno"> 351</span>  <span class="keywordflow">return</span> llvm::isa<X>(Val) ? llvm::cast<X>(Val) : <span class="keyword">nullptr</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"> 353</span> </div><div class="line"><a name="l00354"></a><span class="lineno"> 354</span> <span class="keyword">template</span> <<span class="keyword">class</span> X, <span class="keyword">class</span> Y></div><div class="line"><a name="l00355"></a><span class="lineno"><a class="line" href="namespaceSVF_1_1SVFUtil.html#a105c5c5e97d56533fb2b3ba7a0bc59f3"> 355</a></span> LLVM_NODISCARD <span class="keyword">inline</span> <span class="keyword">typename</span> <a class="code" href="structSVF_1_1SVFUtil_1_1cast__retty.html#aea91708cabb8176b031f1c1fdb89a15b">cast_retty<X, Y *>::ret_type</a> <a class="code" href="namespaceSVF_1_1SVFUtil.html#a8182be247907420db00837cef9bcfa70">dyn_cast</a>(Y *Val)</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> llvm::isa<X>(Val) ? llvm::cast<X>(Val) : <span class="keyword">nullptr</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">// End namespace SVFUtil</span></div><div class="line"><a name="l00361"></a><span class="lineno"> 361</span> </div><div class="line"><a name="l00362"></a><span class="lineno"> 362</span> } <span class="comment">// End namespace SVF</span></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="preprocessor">#endif </span><span class="comment">/* INCLUDE_UTIL_CASTING_H_ */</span><span class="preprocessor"></span></div><div class="ttc" id="structSVF_1_1SVFUtil_1_1isa__impl__cl_3_01To_00_01const_01From_01_4_html_af9a6a9c7660d5daedf8cd907788ac78d"><div class="ttname"><a href="structSVF_1_1SVFUtil_1_1isa__impl__cl_3_01To_00_01const_01From_01_4.html#af9a6a9c7660d5daedf8cd907788ac78d">SVF::SVFUtil::isa_impl_cl< To, const From >::doit</a></div><div class="ttdeci">static bool doit(const From &Val)</div><div class="ttdef"><b>Definition:</b> <a href="Casting_8h_source.html#l00104">Casting.h:104</a></div></div>
|
|
70
70
|
<div class="ttc" id="structSVF_1_1SVFUtil_1_1isa__impl_html"><div class="ttname"><a href="structSVF_1_1SVFUtil_1_1isa__impl.html">SVF::SVFUtil::isa_impl</a></div><div class="ttdef"><b>Definition:</b> <a href="Casting_8h_source.html#l00075">Casting.h:75</a></div></div>
|
|
71
71
|
<div class="ttc" id="structSVF_1_1SVFUtil_1_1cast__retty__wrap_html_af3d80ab43e47626f32c91a6c4454e82e"><div class="ttname"><a href="structSVF_1_1SVFUtil_1_1cast__retty__wrap.html#af3d80ab43e47626f32c91a6c4454e82e">SVF::SVFUtil::cast_retty_wrap::ret_type</a></div><div class="ttdeci">typename cast_retty< To, SimpleFrom >::ret_type ret_type</div><div class="ttdef"><b>Definition:</b> <a href="Casting_8h_source.html#l00239">Casting.h:239</a></div></div>
|
|
72
72
|
<div class="ttc" id="structSVF_1_1SVFUtil_1_1isa__impl__wrap_3_01To_00_01FromTy_00_01FromTy_01_4_html_a414dc089b04305b8580dede7a6337404"><div class="ttname"><a href="structSVF_1_1SVFUtil_1_1isa__impl__wrap_3_01To_00_01FromTy_00_01FromTy_01_4.html#a414dc089b04305b8580dede7a6337404">SVF::SVFUtil::isa_impl_wrap< To, FromTy, FromTy >::doit</a></div><div class="ttdeci">static bool doit(const FromTy &Val)</div><div class="ttdef"><b>Definition:</b> <a href="Casting_8h_source.html#l00173">Casting.h:173</a></div></div>
|