æšç§ã®è©³çŽ°ãªã³ã³ãã€ã©ã³ãŒã¹ã§ã¯ãLLVMãœãŒã¹ããªãŒã®èª¿æ»ã«æéãè²»ãããŸããã 100äžè¡ã®C ++ã³ãŒãã¯æãããããã«èŠããŸãããããã¯èå³æ·±ãæŒç¿ã§ãããå°ãªããšãäžéšã®åŠçã¯ããã«åæããç§ã¯ãã®ãããªãã®ãæžããããšæããŸããã LLVM 3.9ã䜿çšããŸããã以åã®ïŒããããå°æ¥ã®ïŒãªãªãŒã¹ãããã»ã©å€ãããŸããã

LLVMã®çè«çåºç€ã«ããŸãæéããããããããŸããããç¥ã£ãŠããã¹ãããšãããã€ããããŸãã
LLVMã«ãŒãã«ã«ã¯ãããã³ããšã³ãã¯å«ãŸããããããã©ã³ããªããã£ãã€ã¶ãŒãããã€ãã®ããã¯ãšã³ããããã¥ã¡ã³ããããã³å€æ°ã®ãµããŒãã³ãŒãã®ã¿ãå«ãŸããŸãã Clangãªã©ã®ããã³ããšã³ãã¯ãåå¥ã®ãããžã§ã¯ãã«äœãã§ããŸãã
LLVMã«ãŒãã«å
ã®ã³ãŒãã®äžéè¡šçŸã¯RAMã«ããã倧èŠæš¡ãªC ++ APIã䜿çšããŠæäœã§ããŸãã ãã®è¡šçŸã¯ãèªã¿åãå¯èœãªããã¹ããšããŠä¿åããã¡ã¢ãªã«è§£æããŠæ»ãããšãã§ããŸããããããã°ã®éœåäžã®ã¿ã§ããLLVMã䜿çšããéåžžã®ã³ã³ãã€ã«ã§ã¯ãããã¹ãIRã¯çæãããŸããã éåžžãããã³ããšã³ãã¯LLVM APIåŒã³åºãã䜿çšããŠIRãæ§ç¯ããããã€ãã®æé©åãã¹ãéå§ããŠãããã¢ã»ã³ãã©ãŒãŸãã¯ãã·ã³ã³ãŒããçæããããã¯ãšã³ããåŒã³åºããŸãã LLVMã³ãŒãããã£ã¹ã¯ã«æžã蟌ããšïŒClangã䜿çšããCããã³C ++ãããžã§ã¯ãã®éåžžã®ã³ã³ãã€ã«äžã«ã¯çºçããŸããïŒãã³ã³ãã¯ããªãã€ããªè¡šçŸã§ããããããã³ãŒãããšããŠä¿åãããŸãã
LLVM APIã®äž»èŠãªããã¥ã¡ã³ãã¯doxygenã§çæããã
ãã¡ãã«ãããŸã ã ãã®æ
å ±ã¯ãäœãããå¿
èŠããããäœãæ¢ãå¿
èŠãããããæ£ç¢ºã«ããããªããªã£ãå Žåã䜿çšããã®ãå°é£ã§ãã 以äžã§åç
§ãããã¬ã€ãã¯ãLLVM APIãåŠç¿ããããã®åºçºç¹ã§ãã
ã³ãŒããèŠãŠã¿ãŸãããã
ã«ãŒããã£ã¬ã¯ããªã«ã¯ä»¥äžãå«ãŸããŸãã
ãã€ã³ãã£ã³ã° -ããã€ã³ãã£ã³ã°ããC++以å€ã®èšèªããLLVM APIã䜿çšã§ããŸãã CèšèªïŒããã«ã€ããŠã¯ä»¥äžã§èª¬æããŸãïŒãšHaskellïŒãã®ããªãŒã«ã¯ãããŸããïŒã䜿çšããä»ã®æ¥ç¶è©ããããŸãã
cmake -LLVMã¯autoconfã§ã¯ãªãCMakeã䜿çšããŸãã ããªãã®ããã«ãããããŠããã人ã
ã«æè¬ããŸãã
docs -ReStructuredText圢åŒã®ããã¥ã¡ã³ãã åLLVMåœä»€ã®æå³ãå®çŸ©ãã
èšèªã¬ã€ãã®äŸãåç
§ããŠãã ããïŒGitHubã¯.rstãã¡ã€ã«ãããã©ã«ãã®HTMLãšããŠè¡šç€ºããŸãããçã®ããã¡ã€ã«ã¯
ãã¡ãã§ç¢ºèªã§ã
ãŸã ïŒã
ããã¥ã¢ã«ã®ãããµããã£ã¬ã¯ããªã®è³æ
ã¯ç¹ã«èå³æ·±ãã§ããããããèŠãŠã¯ãããŸããã
ãã¡ãã«è¡ãæ¹ãè¯ãã§ãããã ããã¯LLVMãåŠã¶æè¯ã®æ¹æ³ã§ãïŒ
äŸ ïŒãããã¯ãããã¥ã¢ã«ã«æ·»ä»ãããŠãããœãŒã¹ã³ãŒãã§ãã LLVMããã«ãŒã¯ãCMakeLists.txtãªã©ããã³ãŒããå
¥æããå¿
èŠããããŸãã ããããã¯å¯èœã§ãã
include ïŒæåã®ãµããã£ã¬ã¯ããª
llvm-cã«ã¯ãCèšèªã®ãã³ãã«ãå«ãŸããŠããŸãããããã¯äœ¿çšããŸããã§ããããããªãåççã«èŠããŸãã éèŠãªããšã¯ãLLVMéçºè
ããããã®ãã³ãã«ãå®å®ãããããšããäžæ¹ã§ãC ++ APIã¯ãªãªãŒã¹ããšã«å€æŽãããããšã§ãããå€æŽã®é床ã¯éå»æ°å¹Žã§äœäžããŠããããã§ãã
2çªç®ã®ãµããã£ã¬ã¯ããª
llvmã¯å€§ãããLLVM APIãå®çŸ©ãã878åã®ããããŒãã¡ã€ã«ãå«ãŸããŠããŸãã äžè¬ã«ããããã®ãã¡ã€ã«ã®doxygenããŒãžã§ã³ã¯ãçŽæ¥èªã¿åããããç°¡åã«äœ¿çšã§ããŸãããé¢æ°ãæ¢ãããã«ãããã®ãã¡ã€ã«ãååŸããå¿
èŠãããããšããããããŸãã
libã«ã¯æ¬åœã«äŸ¿å©ãªãã®ãå«ãŸããŠããŸãã以äžã§ããããåå¥ã«æ€èšããŸãã
ãããžã§ã¯ãã«ã¯ããã©ã«ãã§ã¯äœãå«ãŸããŠããŸããããã³ã³ãã€ã©ãŒrtïŒãµãã¿ã€ã¶ãŒãªã©ã®ã©ã³ã¿ã€ã ã©ã€ãã©ãªïŒãOpenMPãµããŒããä»ã®ãªããžããªã«ããLLVM C ++ã©ã€ãã©ãªãªã©ã®LLVMã³ã³ããŒãã³ããããã«ã³ããŒãããŸãã
ãªãœãŒã¹ ïŒããªããç§ãå¿
èŠãšããªãVisual C ++çšã®äœãïŒè©³çŽ°ã¯
ãã¡ã ïŒ
ã©ã³ã¿ã€ã ïŒå»å¹Žã®å€ïŒ
2016.çŽtranslã ïŒã«ã®ã¿è¿œå ãããå€éšãããžã§ã¯ãçšã®å¥ã®ãã¬ãŒã¹ãã«ããŒã§ããããããäœã®ããã«ããã®ãæ¬åœã«ããããŸããã
test ::æ°åã®LLVMãŠããããã¹ããå«ã倧ããªãã£ã¬ã¯ããªããã§ãã¯å¯Ÿè±¡ãåéãããšå®è¡ãããŸãïŒ
make check-allãçŽtranslã ïŒã ãããã®ã»ãšãã©ã¯ãããã¹ã圢åŒã®LLVM IRãå«ã.llãã¡ã€ã«ã§ãã ããšãã°ãæé©åãã¹ãæåŸ
ãããçµæã«ã€ãªãããªã©ãããŸããŸãªããšããã¹ãããŸãã LLVMãã¹ãã«ã€ããŠã¯ãä»åŸã®èšäºã§è©³ãã説æããŸãã
ããŒã«ïŒ LLVMèªäœãã©ã€ãã©ãªã®åãªãã³ã¬ã¯ã·ã§ã³ã§ãããå°çšã®ã¡ã€ã³æ©èœã¯ãããŸããã toolsãã£ã¬ã¯ããªã®ã»ãšãã©ã®ãµããã£ã¬ã¯ããªã«ã¯ãLLVMã©ã€ãã©ãªã«ãªã³ã¯ããå®è¡å¯èœããŒã«ãå«ãŸããŠããŸãã ããšãã°ãllvm-disã¯ããããã³ãŒããããã¹ãã¢ã»ã³ãã©ãŒåœ¢åŒã«å€æããéã¢ã»ã³ãã©ãŒã§ãã
unittestsïŒãã§ãã¯ã¿ãŒã²ãããæ§ç¯ãããšãã«ãããã«å€ãã®ãŠããããã¹ããå®è¡ãããŸãã ãããã¯ã
Google Testãã¬ãŒã ã¯ãŒã¯ã䜿çšããŠAPIãçŽæ¥åŒã³åºãC ++ãã¡ã€ã«ã§ããããã¯ãLLVMæ©èœãçŽæ¥ã§ã¯ãªããã¢ã»ã³ãã©ãŒãéã¢ã»ã³ãã©ãŒããŸãã¯ãªããã£ãã€ã¶ãŒãå®è¡ãããtestsããã£ã¬ã¯ããªã®ãã¹ããšã¯å¯Ÿç
§çã§ãã
utilsïŒ LLVMã³ãŒãã£ã³ã°ã¹ã¿ã€ã«ã«æºæ ããemacsããã³vim modã誀æ€ç¥ãæå¶ããValgrindãã¡ã€ã«ããŠããããã¹ãããµããŒãããlitããã³FileCheckããŒã«ãªã©ã ãããããããã®ã»ãšãã©ã¯å¿
èŠãããŸããã
OKããããŸã§ã¯ãã¹ãŠãéåžžã«ç°¡åã§ããã ã»ãŒãã¹ãŠã®éèŠãªæ
å ±ãå«ãŸãã
libãã£ã¬ã¯ããªãã¹ãããããŸããã ãµããã£ã¬ã¯ããªãèŠãŠã¿ãŸãããã
åæãã£ã¬ã¯ããªã«ã¯ããšã€ãªã¢ã¹ãã°ããŒãã«å€ã®åæãªã©ãå€ãã®éçã¢ãã©ã€ã¶ãŒãå«ãŸããŠããŸãã äžéšã®ã¢ãã©ã€ã¶ãŒã¯LLVMãã¹æ§é ãæã¡ããã¹ãããŒãžã£ãŒã§å®è¡ããå¿
èŠããããŸããä»ã®ã¢ãã©ã€ã¶ãŒã¯ã©ã€ãã©ãªãŒã§ãããçŽæ¥åŒã³åºãããšãã§ããŸãã ã¢ãã©ã€ã¶ãŒãã¡ããªãŒã®å¥åŠãªã¡ã³ããŒã¯InstructionSimplify.cppã§ããããã¯å®éã«ã¯å€æã§ãããåæã§ã¯ãããŸããã å€ãã®äººã¯ããã®æç« ãããã§äœãããã®ãã説æããã³ã¡ã³ãã«æ°ä»ããªãã§ãããã
ãã¡ãããã®ã³ã¡ã³ãã§ããã®æç« ã¯IRèªäœãå€æŽããŸããã ã«ãŒã«ã¯ãllvm :: SimplifyInstructionãè¿ãããšãã§ããã®ã¯å®æ°ãšæ¢åã®Valueãªããžã§ã¯ãã®ã¿ã§ãããã¢ãã©ã€ã¶ãŒã®èŠä»¶ãæºãããŸãã ååœä»€ã®SimplifyInstructionãåŒã³åºããã¹ã¯ãå€æãã¹ïŒlib / Transforms / Utils / SimplifyInstructions.cppãïŒã§ãã
AsmParser ïŒããã¹ãIRãã¡ã¢ãªã«è§£æããŸãã
ãããã³ãŒã ïŒIRãã³ã³ãã¯ã圢åŒã«ã·ãªã¢ã«åããã³ã³ãã¯ã圢åŒããRAMã«èªã¿åããŸãã
CodeGenïŒ LLVMããã€ã¹ã«äŸåããªãã³ãŒããžã§ãã¬ãŒã¿ãŒãLLVMããã¯ãšã³ããèšè¿°ããããã®ãã¬ãŒã ã¯ãŒã¯ãããã³ãããã®ããã¯ãšã³ãã䜿çšã§ããã©ã€ãã©ãªã®ã»ããã å€ãã®ã³ãŒãïŒ> 100 KLOCïŒããããŸãããæ®å¿µãªãããç§ã¯ããã«ã€ããŠã»ãšãã©ç¥ããŸããã
DebugInfoã¯ãLLVMåœä»€ãšãœãŒã¹ã³ãŒãã®å Žæéã®ãããã³ã°ããµããŒãããããã®ã©ã€ãã©ãªã§ãã 2014 LLVM Developers 'Meetingã®
ãããã®ã¹ã©ã€ãã«é¢ããå€ãã®è¯ãæ
å ±ã
ExecutionEngineïŒ LLVMã¯éåžžãã·ã³ã³ãŒããŸãã¯ã¢ã»ã³ãã©ãŒã«å€æãããŸãããã€ã³ã¿ãŒããªã¿ãŒã«ãã£ãŠå®è¡ã§ããŸãã éJITã€ã³ã¿ãŒããªã¿ãŒã¯ãæåŸã«äœ¿çšããããšãããšãã«æ£åžžã«æ©èœããŸããã§ãããããããã«ããŠããJITãããå®è¡é床ãé
ããªããŸãã ææ°ã®
JIT API Orcã¯ãã¡ãã§ãã
FuzzerïŒããã¯ã
AFL ïŒ
fuzzing ïŒã«äŒŒã
libFuzzerã§ãã LLVMæ©èœã䜿çšããŠãLLVMã§ã³ã³ãã€ã«ãããããã°ã©ã ããã¡ãžã³ã°ããŸãã
IR ïŒ
IRã«é¢é£ããããŸããŸãªã³ãŒãã ããã¹ã圢åŒã§IRã³ãŒããåºåããããã®ã³ãŒãã以åã®ããŒãžã§ã³ã®LLVMã§äœæããããããã³ãŒããã¡ã€ã«ãã¢ããã°ã¬ãŒããããããIRããŒããäœæããããã»ã¹ã§å®æ°ãæãç³ããããªã©
IRReader ã
LibDriver ã
LineEditor ïŒããã«ãããã®ã«ã¯ã»ãšãã©èª°ãé¢å¿ããªããæçšãªã³ãŒãããŸã£ããååšããªãå¯èœæ§ããããŸãã
ãªã³ã«ãŒïŒ LLVMã¢ãžã¥ãŒã«ã«ã¯ãCããã³C ++ã³ã³ãã€ã«ãŠããããšåæ§ã«ãé¢æ°ãšå€æ°ãå«ãŸããŠããŸãã ãªã³ã«ãŒã¯ãè€æ°ã®ã¢ãžã¥ãŒã«ã1ã€ã®å€§ããªã¢ãžã¥ãŒã«ã«çµåããŸãã
LTOïŒå€ãã®æçš¿ãç§åŠèšäºã®äž»é¡ã§ããã¬ã€ã¢ãŠãæéã®æé©åã«ããããªããã£ãã€ã¶ãŒã¯åã
ã®ã³ã³ãã€ã«æžã¿ã¢ãžã¥ãŒã«ã®å€åŽãèŠãããšãã§ããŸãã LLVMã¯ãç¡æãã§ã¬ã€ã¢ãŠãã®æé©åãè¡ããŸãããªã³ã«ãŒã䜿çšããŠå€§ããªã¢ãžã¥ãŒã«ãäœæããéåžžã®æé©åãã¹ã§æé©åããŸãã ããã¯è¯ãã¢ãããŒãã§ãããéåžžã«å€§èŠæš¡ãªãããžã§ã¯ãã«ã¯å¯Ÿå¿ã§ããŸããã ææ°ã®ã¢ãããŒãã¯
ThinLTOã§ã ãããã«ãããããããªäŸ¡æ Œã§ã»ãšãã©ã®ã¡ãªãããåŸãããšãã§ããŸãã
MCïŒéåžž
ãã³ã³ãã€ã©ã¯ã¢ã»ã³ãã©ã³ãŒããçæããã¢ã»ã³ãã©ããã·ã³ã³ãŒããäœæã§ããããã«ããŸãã LLVM MCãµãã·ã¹ãã ã¯äžéãªã³ã¯ãæé€ãããã·ã³ã³ãŒããçŽæ¥çæã§ããããã«ããŸãã ããã«ããã³ã³ãã€ã«ãé«éåãããLLVMãJITã³ã³ãã€ã©ãšããŠäœ¿çšããå Žåã«ç¹ã«åœ¹ç«ã¡ãŸãã
ãªããžã§ã¯ã ïŒELFãªã©ã®ãªããžã§ã¯ããã¡ã€ã«åœ¢åŒã®è©³çŽ°ã®å®è£
ã
ObjectYAML -
YAMLã®ãªããžã§ã¯ããã¡ã€ã«ã®ãšã³ã³ãŒãããµããŒãããŸãã ãªããããå¿
èŠãªã®ãããããŸããã
ãªãã·ã§ã³ïŒ -ã³ãã³ãã©ã€ã³ã®è§£æã
ãã¹ïŒäŸåé¢ä¿ãèæ
®ããŠãLLVMãã¹ã®éå§ãå¶åŸ¡ããããã»ãŒãžãããŒãžã£ãŒ
ã®äžéšã
ProfileDataïŒ -ãããã¡ã€ãªã³ã°ããŒã¹ã®æé©åããµããŒãããããã«ããããã¡ã€ãªã³ã°ããŒã¿ãèªã¿æžãããŸãã
ãµããŒãïŒ APIntïŒLLVMã§åºã䜿çšãããŠããä»»æã®ç²ŸåºŠã®æŽæ°ïŒãªã©ãå«ãããŸããŸãªã³ãŒãã®ãµããŒãã
TableGenïŒ ã¹ã€ã¹ãã€ãã®äžçš®ãå
¥åã«æ§é åããŒã¿ãå«ã.tdãã¡ã€ã«ïŒLLVMã«ã¯200ãè¶
ãããã¡ã€ã«ïŒãåãåããLLVMã«ã³ã³ãã€ã«ããC ++ã³ãŒããçæããããŒã«ã TableGenã¯ãããšãã°ãã¢ã»ã³ãã©ãŒãšéã¢ã»ã³ãã©ãŒã®å®è£
ã«äœ¿çšãããŸãã
ã¿ãŒã²ããïŒããŸããŸãªããã»ããµã®ããã¯ãšã³ããããã«ãããŸãã å€ãã®TableGenãã¡ã€ã«ããããŸãã æ°ããããã¯ãšã³ããäœæããã«ã¯ããã®ãã¡ã®1ã€ã®ã¯ããŒã³ãäœæããŸãããã®ã¯ããŒã³ã®ã¢ãŒããã¯ãã£ã¯ããªãã®ã¢ãŒããã¯ãã£ã«æãè¿ããã®ã§ããããã®éçºã«æ°å¹Žãè²»ãããŸãã
å€æïŒããã¯ç§ã®ãæ°ã«å
¥ãã®ãã£ã¬ã¯ããªã§ããããã©ã³ããªããã£ãã€ã¶ãŒãããã«ãããŸãã IPOã«ã¯ãé¢æ°ã®å¢çéã§æ©èœããããã·ãŒãžã£ãŒéã®æé©åãå«ãŸããŠãããéåžžã¯ããã»ã©ç©æ¥µçã§ã¯ãããŸããããäžåºŠã«å€ãã®ã³ãŒãã衚瀺ãããŸãã InstCombineã¯ããŒãããŒã«ãªããã£ãã€ã¶ãŒã§ãã èšè£
-æ¶æ¯å€ã®ãµããŒãã ObjCARCã¯
ããããµããŒã
ããŸãã Scalarã«ã¯ãã³ã³ãã€ã©ã«é¢ããããã¥ãŒããªã¢ã«ãããã®æé©åãå«ãŸããŠããŸãããã®ãã£ã¬ã¯ããªã®å
容ã«é¢ãããã詳现ãªæçš¿ãæžããŸãã Utils-ãã«ããŒã³ãŒãã Vectorizeã¯LLVMèªåãã¯ãã«åããŒã«ã§ãããè¿å¹Žå€ãã®äœæ¥ã®å¯Ÿè±¡ãšãªã£ãŠããŸãã
ããã§ã¬ãã¥ãŒãã¢ãŒãçµäºããŸããããã圹ã«ç«ãŠã°å¹žãã§ãããã€ãã®ããã«ãã©ããã§ééããç¯ãããäœããèŠéããããæããŠãã ããã