LLVMã«ã¤ãã¦ãããã¯ã¨ã³ãã®é¨åã¯ããç¨åº¦åå¼·ãããã©ãããããã°Passã®ä½ãæ¹ãã¾ããã«åå¼·ãããã¨ãç¡ãã£ãã
LLVMã¨è¨ãã°Passã ããï¼ã¨ãããã¨ã§Passã®ä½ãæ¹ã«ã¤ãã¦åå¼·ãããã¨ã«ãããããã¯ãã®ãã¡LLVMã®æ¡å¼µãæé©åããããã¨ãã«å½¹ã«ç«ã¤ã¯ãã ã
ããã¤ãã®Passã«ã¤ãã¦ãCallGraphSCCPass
ã¯ã©ã¹ãFunctionPass
ã¯ã©ã¹ãLoopPass
ã¯ã©ã¹ã
LLVMã®Passãæ¸ã
CallGraphSCCPass
ã¯ã©ã¹
CallGraphSCCPass
ã¯passãããã°ã©ã ã®å¼ã³åºãã°ã©ããä¸ããä¸ã«ããå¿
è¦ãããã¨ãã«ä½¿ç¨ãã(å¼ã³åºãå
ããå¼ã³åºãå
ã¸)ã
CallGraphSCCPass
ã¯CallGraph
ãä½æããã¡ã«ããºã ãæä¾ããããã·ã¹ãã ãCallGraphSCCPass
ã®æé©åå®è¡ã許ãã
ããªãã®passã以ä¸ã®ã¢ã¦ãã©ã¤ã³ã«ç¤ºãè¦ä»¶ã«åè´ããFunctionPass
ã®è¦ä»¶ã«åè´ããªããªãã°ãCallGraphSCCPass
ããæ´¾çãããã¹ãã§ãã
TODO: SCCã¨ã¯ä½ããTarjanã®ã¢ã«ã´ãªãºã ãB-U meanã«ã¤ãã¦èª¬æããã
CallGraphSCCPass
ãµãã¯ã©ã¹ã«ã¤ãã¦ãã®å½¹å²ãæ確ã«ããã¨:
- ç¾å¨ã®SCCããã³SCCã®ç´æ¥å¼ã³åºãå ã¨ç´æ¥å¼ã³åºãå 以å¤ã®é¢æ°ãæ¤æ»ãããå¤æ´ããããããã¨ã¯ã§ãã¾ããã
- ç¾å¨ã®
CallGraph
ãªãã¸ã§ã¯ããä¿åããããã°ã©ã ã«å ããããå¤æ´ãåæ ãã¦æ´æ°ãããã¨ãæ±ããããã - SCC ã®å 容ãå¤æ´ãããã¨ã¯ã§ãã¦ããç¾å¨ã®ã¢ã¸ã¥ã¼ã«ã« SCC ã追å ãããåé¤ããããããã¨ã¯ã§ããªãã
- ç¾å¨ã®ã¢ã¸ã¥ã¼ã«ã«ã°ãã¼ãã«å¤æ°ã追å ã»åé¤ãããã¨ãã§ããã
runOnSCC
ã®èµ·åã«é¢ããããç¶æ ãç¶æãããã¨ãã§ãã(ã°ãã¼ãã«ãã¼ã¿ãå«ã)ã
Note: SCCã£ã¦ä½? --> "Strongly Connected Component"
SCCã1ã¤ä»¥ä¸ã®ãã¼ãã§ç®¡çããªããã°ãªããªããããCallGraphSCCPass
ãå®è£
ããã®ã¯ãããã¤ãã®å ´åã«ããã¦é常ã«ããªããã¼ã§ãã
以ä¸ã§èª¬æãããã¹ã¦ã®ãã¼ãã£ã«ã¡ã½ããã§ã¯ãããã°ã©ã ãå¤æ´ããå ´åã«ã¯true
ããããã§ãªãå ´åã¯false
ãè¿ãå¿
è¦ãããã¾ãã
doInitialization(CallGraph &)
ã¡ã½ãã
virtual bool doInitialization(CallGraph &CG);
doInitiazilation
ã¡ã½ããã¯CallGraphSCCPass
ã許å¯ãã¦ããªããã¨ã®ã»ã¨ãã©ã許å¯ããã¡ã½ããã§ãããé¢æ°ã®è¿½å ãåé¤ãé¢æ°ã®ãã¤ã³ã¿ã®åå¾ãªã©ãè¡ãã¾ããdoInitializatoin
ã¡ã½ããã¯å¦çãããSCCã«ä¾åããªãåç´ãªåæåãªã©ã«ä½¿ç¨ããã¾ããdoInitilization
ã¡ã½ããã¯ä»ã®passã®å®è¡ã¨ãªã¼ãã©ããããªãããã«ã¹ã±ã¸ã¥ã¼ã«ããã¾ã(å¾ã£ã¦ãã®ã¡ã½ããã¯é常ã«é«éã§ããã¹ãã§ã)ã
runOnSCC
ã¡ã½ãã
virtual bool runOnSCC(CallGraphSCC &SCC) = 0;
runOnSCC
ã¡ã½ããã¯passã®æãèå³ã®ããåä½ãè¡ãå ´æã§ããã¢ã¸ã¥ã¼ã«ãå¤æã«ããå¤æãããå ´åã¯true
ãè¿ããããã§ãªãå ´åã¯false
ãè¿ãã¹ãã§ãã
doFinalization(CallGraph &)
ã¡ã½ãã
virtual bool doFinalization(CallGraph &CG);
doFinalization
ã¡ã½ããã¯ãpassã®ãã¬ã¼ã ã¯ã¼ã¯ãã³ã³ãã¤ã«ãããããã°ã©ã ã®ãã¹ã¦ã®SCCã«å¯¾ãã¦runOnSCC
ãå¼ã³çµãã£ãå¾ã«å¼ã³åºããã¾ãã
FunctionPass
ã¯ã©ã¹
ModulePass
ãµãã¯ã©ã¹ã¨å¯¾æ¯ãã¦ãFunctionPass
ãµãã¯ã©ã¹ã¯äºæ¸¬å¯è½ãªãã·ã¹ãã ã«ãã£ã¦äºæ¸¬å¯è½ãªåä½ãæã£ã¦ããããã¹ã¦ã®FunctionPass
ã¯ããã°ã©ã ä¸ã®é¢æ°ãç¬ç«ã«å®è¡ãããFunctionPass
ã¯ç¹å®ã®é åºã§åä½ããå¿
è¦ã¯ãªããFunctionPass
ã¯å¤é¨ã®é¢æ°ãå¤æ´ããªãã
æ確åããããã«ãFunctionPass
ãµãã¯ã©ã¹ã¯ä»¥ä¸ã許å¯ããªãï¼
- ç¾å¨å¦çããã¦ãã
Function
以å¤ã®é¢æ°ãæ¤æ»ãå¤æ´ããã㨠- ç¾å¨ã®
Module
ããé¢æ°ã追å ãããã¯åé¤ããã㨠- ç¾å¨ã®
Module
ããã°ãã¼ãã«å¤æ°ã追å ã¾ãã¯åé¤ããã㨠runOnFunction
ã®èµ·åã®ç¶æ ãæä½ãããã¨(ã°ãã¼ãã«ãã¼ã¿ãå«ã)
FunctionPass
ã®å®è£
ã¯é常ã¯åç´ã§ã("Hello World"passã®ä¾ãåç
§ã®ãã¨)ãFunctionPass
ã¯3ã¤ã®ãã¼ãã£ã«ã¡ã½ããããªã¼ããã¼ãããããã¹ã¦ã®ã¡ã½ããã¯ãããã°ã©ã ãå¤æ´ããå ´åã«ã¯true
ãè¿ãå¿
è¦ããããããã§ãªãå ´åã¯false
ãè¿ãã
doInitialization(Module &)
ã¡ã½ãã
virtual bool doInitialization(Module &M);
ãã®doInitialization
ã¡ã½ããã¯FunctionPass
ã許å¯ããªãæ®ã©ã®æä½ãè¡ããã¨ãã§ãã¾ããé¢æ°ã®è¿½å åé¤ããé¢æ°ã®ãã¤ã³ã¿ã®åå¾ãªã©ãè¡ãã¾ãããã®doInitialization
ã¡ã½ããã¯å¦çããé¢æ°ã«ä¾åããªãã¿ã¤ãã®æ§ã
ãªãã¨ãç°¡åã«åæåããããã«è¨è¨ããã¦ãã¾ãã
doInitialization
ã¡ã½ããã¯ä»ã®passã¨ãªã¼ãã©ãããã¦å¼ã³åºãããããã«ã¯ã¹ã±ã¸ã¥ã¼ã«ããã¦ãã¾ãã(å¾ã£ã¦é常ã«é«éã§ããã¹ãã§ã)ã
ãã®ã¡ã½ããã®ä½¿ãæ¹ã®è¯ãä¾ã¨ãã¦LowerAllocation
passãããã¾ãã
ãã®passã¯malloc
ã¨free
å½ä»¤ããã©ãããã©ã¼ã ã«ä¾åããmalloc()
ã¨free()
é¢æ°å¼ã³åºãã«ç½®ãæãã¾ãã
doInitialization
ã¡ã½ããã§ã¯malloc
ã¨free
é¢æ°ã¸ã®åç
§ãåå¾ããå¿
è¦ãªãã°ã¢ã¸ã¥ã¼ã«ã«ãããã¿ã¤ãã追å ãã¾ãã
runOnFunction
ã¡ã½ãã
virtual bool runOnFunction(Function &F) = 0;
runOnFunction
ã¡ã½ããã¯passã«ããå¤æã解æå¦çãè¡ãããã«å®è£
ããå¿
è¦ãããã¾ãã
é常ã¯ãé¢æ°ãå¤æ´ããããtrue
ãè¿ãã¾ãã
doFinalization(Module &)
ã¡ã½ãã
virtual bool doFinalization(Module &M);
doFinalization
ã¡ã½ããã¯ãã¾ã使ããã¾ããããpassã®ãã¬ã¼ã ã¯ã¼ã¯ããã³ã³ãã¤ã«ãããããã°ã©ã ã«å¯¾ãã¦ãã¹ã¦ã®runOnFunction
ã®å¼ã³çµããå¾ã«å¼ã³åºããã¾ãã
LoopPass
ã¯ã©ã¹
LoopPass
ã¯ã©ã¹ã¯é¢æ°å
ã®ç¬ç«ããã«ã¼ãã«å¯¾ãã¦é©ç¨ããã¾ããLoopPass
ã¯ãã¹ããããé çªã«å®è¡ãããã¤ã¾ãæãä¸ä½ã®ã«ã¼ããæå¾ã«å®è¡ããã¾ãã
LoopPass
ãµãã¯ã©ã¹ã¯LPPassManager
ã¤ã³ã¿ãã§ã¼ã¹ãéãã¦ã«ã¼ããã¹ããã¢ãããã¼ããããã¨ã許å¯ããã¦ãã¾ããloop passãå®è£
ãããã¨ã¯é常ã¯åç´ã§ããLoopPass
ã¯3ã¤ãã¼ãã£ã«ã¡ã½ããããªã¼ããã¼ãããå¿
è¦ãããã¾ãããã¹ã¦ã®ãããã®ã¡ã½ããã¯ãããã°ã©ã ãå¤æ´ããå ´åã¯true
ãè¿ããããã§ãªãå ´åã¯false
ãè¿ãã¹ãã§ãã
LoopPass
ãµãã¯ã©ã¹ã¯ãåãé¢æ°ã®è§£æãå®è¡ããã¡ã¤ã³ã®ã«ã¼ããã¹ãã¤ãã©ã¤ã³ã®ä¸é¨ã¨ãã¦å®è¡ããããã«æå³ããã¦ãã¾ãããããç°¡åã«ããããã«ãLoopUtils.h
ã«ã¯geTLoopAnalysisUsage
é¢æ°ãæä¾ããã¦ãã¾ããããã¯ãµãã¯ã©ã¹ã®geTAnalysisUsage
ã®ãªã¼ãã©ã¤ãã®ä¸ã§å¼ã³åºããã¨ãåºæ¥ãä¸è²«æ§ã¨æ£ããåä½ãè¡ãããã«å¿
è¦ã§ããåæ§ã«ãINITIALIZE_PASS_DEPENDENCY(LoopPass)
ã¯ããã¤ãã®é¢æ°ã®è§£æãåæåãã¾ãã
doInitialization(Loop *, LPPassManager &)
ã¡ã½ãã
virtual bool doInitialization(Loop *, LPPassManager &LPM);
doInitialization
ã¡ã½ããã¯å¦çããé¢æ°ã«ä¾åããªãç°¡åãªåæåãå®è¡ãã¾ããdoInitialization
ã¡ã½ããã¯ä»ã®passã¨å®è¡ããªã¼ãã©ããããªãããã«ã¹ã±ã¸ã¥ã¼ã«ããã¾ã(å¾ã£ã¦ããã®é¢æ°ã¯ç´ æ©ãå¦çãçµããå¿
è¦ãããã¾ã)ãLPPassManager
ã¤ã³ã¿ãã§ã¼ã¹ã¯Funciton
ã¨Module
ã¬ãã«ã®è§£ææ
å ±ã«ã¢ã¯ã»ã¹ããããã«ä½¿ç¨ãã¾ãã
runOnLoop
ã¡ã½ãã
virtual bool runOnLoop(Loop *, LPPassManager &LPM) = 0;
runOnLoop
ã¡ã½ããã¯ããµãã¯ã©ã¹å
ãå¤æåã³è§£æãè¡ãããã«å®è£
ããªããã°ãªããªãã¡ã½ããã§ããé常ãé¢æ°ãå¤æ´ãããå ´åã«ã¯true
ãè¿ãå¿
è¦ãããã¾ããLPPassManager
ã¤ã³ã¿ãã§ã¼ã¹ã¯ã«ã¼ããã¹ããã¢ãããã¼ãããããã«å¿
è¦ã§ãã
doFinalization
ã¡ã½ãã
virtual bool doFinalization();
doFinalization
ã¡ã½ããã¯ãã¾ã使ããããã¨ã®ãªãã¡ã½ããã§ãããpassãã¬ã¼ã ã¯ã¼ã¯ããã³ã³ãã¤ã«ãããããã°ã©ã å
ã®ãã¹ã¦ã®ã«ã¼ãã«å¯¾ãã¦runOnLoop
ã®å¼ã³åºããçµäºããã¨å¼ã³åºããã¾ãã
RegionPass
ã¯ã©ã¹
RegionPass
ã¯LoopPass
ã¨ä¼¼ã¦ãã¾ãããé¢æ°å
ã®ã¨ã³ããªããçµäºã¾ã§ãå®è¡ãã¾ããRegionPass
ã¯ãã®é åããã¹ãé ã«å®è¡ãããã£ã¨ãå¤å´ã®é åãæå¾ã«å¦çããã¾ãã
RegionPass
ãµãã¯ã©ã¹ã¯RGPassManager
ã¤ã³ã¿ãã§ã¼ã¹ã使ã£ã¦é åããªã¼ãæ´æ°ãããã¨ã許ããã¦ãã¾ããRegionPass
å
ã®3ã¤ã®ãã¼ãã£ã«ã¡ã½ããããªã¼ããã¼ããã¦ç¬èªã®ãªã¼ã¸ã§ã³passãå®è£
ãããã¨ãã§ãã¾ãããããã®ã¡ã½ããã¯ãããã°ã©ã ãå¤æ´ããå ´åã«ã¯true
ãè¿ãå¿
è¦ãããã¾ãã
doInitialization(Region *, RGPassManager &)
ã¡ã½ãã
virtual bool doInitialization(Region *, RGPassManager &RGM);
doInitialization
ã¡ã½ããã¯å¦çãããé¢æ°ã«ä¾åããªãç°¡åãªåæåãªã©ãè¡ãããã®ãã®ã§ããdoInitialization
ã¡ã½ããã¯ä»ã®passã®å®è¡ã¨ãªã¼ãã©ããããªãããã«ã¹ã±ã¸ã¥ã¼ã«ããã¾ã(ãããã£ã¦é«éã«åä½ããå¿
è¦ãããã¾ã)ãRPPassManager
ã¤ã³ã¿ãã§ã¼ã¹ã¯Function
ãããã¯Module
ã¬ãã«ã®è§£ææ
å ±ã«ã¢ã¯ã»ã¹ããããã«å¿
è¦ã¨ãªãã¾ãã
runOnRegion
ã¡ã½ãã
virtual bool runOnRegion(Region *, RGPassManager &RGM) = 0;
runOnRegion
ã¡ã½ããã¯ãå¤æã解æãªã©ã®å®è¡ããããã«å¿
è¦ãªé¢æ°ã§ããé常ããã®é åãå¤æ´ããå ´åã«ã¯true
ãè¿ãã¾ããRGPassManager
ã¯é åããªã¼ãã¢ãããã¼ãããããã«å¿
è¦ã§ãã
doFinalization()
ã¡ã½ãã
virtual bool doFinalization();
doFinalization
ã¡ã½ããã¯ãã¾ã使ããããã¨ã®ãªãã¡ã½ããã§ãã³ã³ãã¤ã«ãããããã°ã©ã ã®ãã¹ã¦ã®é åã«å¯¾ãã¦runOnRegion
ãå®è¡ãããå¾ã«å¼ã³åºããã¾ãã
MachineFunctionPass
ã¯ã©ã¹
MachineFunctionPass
ã¯LLVMã³ã¼ãã¸ã§ãã¬ã¼ã¿ã®ä¸é¨ã§ãããã°ã©ã ä¸ã®ãã·ã³ã«ä¾åãã表ç¾ã«å¯¾ãã¦å®è¡ããããã®ã§ãã
ã³ã¼ãã¸ã§ãã¬ã¼ã¿passã¯TargetMachine::addPassToEmitFile
ã«ããç¹å¥ã«ç»é²ããåæåããã¾ããå¾ã£ã¦ãããã¯ä¸è¬çã«optãbugpointã³ãã³ãã«ãã£ã¦å®è¡ãããã¨ã¯ã§ãã¾ããã
MachineFunctionPass
ã¯FunctionPass
ã§ãããã¾ãããããã£ã¦FunctionPass
ã®ãã¹ã¦ã®å¶ç´ã¯MachineFunctionPass
ã«ãå½ã¦ã¯ã¾ãã¾ããMachineFunctionPass
ã¯ä»¥ä¸ã®ãã¨ã許å¯ããã¦ãã¾ãã:
LLVM IR
ã®Instruction
,BasciBlock
,Argument
,Function
,GlobalVariables
,GlobalAlias
,Module
ã®ä½æã¾ãã¯å¤æ´- ç¾å¨å¦çãã¦ãã
MachineFunction
以å¤ã®MachineFunction
ã®å¤æ´ runOnMachineFunction
ã®èµ·åãä¿ãã¹ãã¼ãã®èª¿æ´ (ã°ãã¼ãã«ãã¼ã¿ãå«ã)
runOnMachineFunction(MachineFunction &MF)
ã¡ã½ãã
virtual bool runOnMachineFunction(MachineFunction &MF) = 0;
runOnMachineFunction
ã¯MachineFunctionPass
ã®ã¡ã¤ã³ã®ã¨ã³ããªãã¤ã³ãã¨èãããã¨ãã§ãã¾ã; ã¤ã¾ãããã®ã¡ã½ããããªã¼ãã©ã¤ããã¦MachineFunctionPass
ãå®è£
ãããã¨ãã§ãã¾ãã