8000 BOLT/bolt at main · upenn-acg/BOLT · GitHub
[go: up one dir, main page]
More Web Proxy on the site http://driver.im/
Skip to content
{"payload":{"allShortcutsEnabled":false,"path":"bolt","repo":{"id":458410041,"defaultBranch":"main","name":"BOLT","ownerLogin":"upenn-acg","currentUserCanPush":false,"isFork":true,"isEmpty":false,"createdAt":"2022-02-12T03:31:34.000Z","ownerAvatar":"https://avatars.githubusercontent.com/u/6921634?v=4","public":true,"private":false,"isOrgOwned":true},"currentUser":null,"refInfo":{"name":"main","listCacheKey":"v0:1709044510.0","canEdit":false,"refType":"branch","currentOid":"339c043e5938c8f6b08af8d2c0c86f1e6842d787"},"tree":{"items":[{"name":"docs","path":"bolt/docs","contentType":"directory"},{"name":"include/bolt","path":"bolt/include/bolt","contentType":"directory","hasSimplifiedPath":true},{"name":"lib","path":"bolt/lib","contentType":"directory"},{"name":"runtime","path":"bolt/runtime","contentType":"directory"},{"name":"test","path":"bolt/test","contentType":"directory"},{"name":"tools","path":"bolt/tools","contentType":"directory"},{"name":"utils","path":"bolt/utils","contentType":"directory"},{"name":"CMakeLists.txt","path":"bolt/CMakeLists.txt","contentType":"file"},{"name":"CODE_OWNERS.TXT","path":"bolt/CODE_OWNERS.TXT","contentType":"file"},{"name":"LICENSE.TXT","path":"bolt/LICENSE.TXT","contentType":"file"},{"name":"README.md","path":"bolt/README.md","contentType":"file"}],"templateDirectorySuggestionUrl":null,"readme":{"displayName":"README.md","richText":"\u003carticle class=\"markdown-body entry-content container-lg\" itemprop=\"text\"\u003e\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch1 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eBOLT\u003c/h1\u003e\u003ca id=\"user-content-bolt\" class=\"anchor\" aria-label=\"Permalink: BOLT\" href=\"#bolt\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eBOLT is a post-link optimizer developed to speed up large applications.\nIt achieves the improvements by optimizing application's code layout based on\nexecution profile gathered by sampling profiler, such as Linux \u003ccode\u003eperf\u003c/code\u003e tool.\nAn overview of the ideas implemented in BOLT along with a discussion of its\npotential and current results is available in\n\u003ca href=\"https://research.fb.com/publications/bolt-a-practical-binary-optimizer-for-data-centers-and-beyond/\" rel=\"nofollow\"\u003eCGO'19 paper\u003c/a\u003e.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eInput Binary Requirements\u003c/h2\u003e\u003ca id=\"user-content-input-binary-requirements\" class=\"anchor\" aria-label=\"Permalink: Input Binary Requirements\" href=\"#input-binary-requirements\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eBOLT operates on X86-64 and AArch64 ELF binaries. At the minimum, the binaries\nshould have an unstripped symbol table, and, to get maximum performance gains,\nthey should be linked with relocations (\u003ccode\u003e--emit-relocs\u003c/code\u003e or \u003ccode\u003e-q\u003c/code\u003e linker flag).\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eBOLT disassembles functions and reconstructs the control flow graph (CFG)\nbefore it runs optimizations. Since this is a nontrivial task,\nespecially when indirect branches are present, we rely on certain heuristics\nto accomplish it. These heuristics have been tested on a code generated with\nClang and GCC compilers. The main requirement for C/C++ code is not to rely\non code layout properties, such as function pointer deltas.\nAssembly code can be processed too. Requirements for it include a clear\nseparation of code and data, with data objects being placed into data\nsections/segments. If indirect jumps are used for intra-function control\ntransfer (e.g., jump tables), the code patterns should be matching those\ngenerated by Clang/GCC.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eNOTE: BOLT is currently incompatible with the \u003ccode\u003e-freorder-blocks-and-partition\u003c/code\u003e\ncompiler option. Since GCC8 enables this option by default, you have to\nexplicitly disable it by adding \u003ccode\u003e-fno-reorder-blocks-and-partition\u003c/code\u003e flag if\nyou are compiling with GCC8.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003ePIE and .so support has been added recently. Please report bugs if you\nencounter any issues.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eInstallation\u003c/h2\u003e\u003ca id=\"user-content-installation\" class=\"anchor\" aria-label=\"Permalink: Installation\" href=\"#installation\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eDocker Image\u003c/h3\u003e\u003ca id=\"user-content-docker-image\" class=\"anchor\" aria-label=\"Permalink: Docker Image\" href=\"#docker-image\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eYou can build and use the docker image containing BOLT using our \u003ca href=\"/upenn-acg/BOLT/blob/main/bolt/bolt/utils/docker/Dockerfile\"\u003edocker file\u003c/a\u003e.\nAlternatively, you can build BOLT manually using the steps below.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eManual Build\u003c/h3\u003e\u003ca id=\"user-content-manual-build\" class=\"anchor\" aria-label=\"Permalink: Manual Build\" href=\"#manual-build\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eBOLT heavily uses LLVM libraries, and by design, it is built as one of LLVM\ntools. The build process is not much different from a regular LLVM build.\nThe following instructions are assuming that you are running under Linux.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eStart with cloning LLVM and BOLT repos:\u003c/p\u003e\n\u003cdiv class=\"snippet-clipboard-content notranslate position-relative overflow-auto\" data-snippet-clipboard-copy-content=\"\u0026gt; git clone git@github.com:upenn-acg/BOLT.git llvm-bolt\n\u0026gt; mkdir build\n\u0026gt; cd build\n\u0026gt; cmake -G \u0026quot;Unix Makefiles\u0026quot; ../llvm-bolt/llvm -DLLVM_TARGETS_TO_BUILD=\u0026quot;X86;AArch64\u0026quot; -DCMAKE_BUILD_TYPE=Release -DLLVM_ENABLE_ASSERTIONS=ON -DLLVM_ENABLE_PROJECTS=\u0026quot;clang;lld;bolt\u0026quot;\n\u0026gt; make -j\"\u003e\u003cpre class=\"notranslate\"\u003e\u003ccode\u003e\u0026gt; git clone git@github.com:upenn-acg/BOLT.git llvm-bolt\n\u0026gt; mkdir build\n\u0026gt; cd build\n\u0026gt; cmake -G \"Unix Makefiles\" ../llvm-bolt/llvm -DLLVM_TARGETS_TO_BUILD=\"X86;AArch64\" -DCMAKE_BUILD_TYPE=Release -DLLVM_ENABLE_ASSERTIONS=ON -DLLVM_ENABLE_PROJECTS=\"clang;lld;bolt\"\n\u0026gt; make -j\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003e\u003ccode\u003ellvm-bolt\u003c/code\u003e will be available under \u003ccode\u003ebin/\u003c/code\u003e. Add this directory to your path to\nensure the rest of the commands in this tutorial work.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eNote that we use a specific snapshot of LLVM monorepo as we currently\nrely on a set of patches that are not yet upstreamed.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eOptimizing BOLT's Performance\u003c/h2\u003e\u003ca id=\"user-content-optimizing-bolts-performance\" class=\"anchor\" aria-label=\"Permalink: Optimizing BOLT's Performance\" href=\"#optimizing-bolts-performance\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eBOLT runs many internal passes in parallel. If you foresee heavy usage of\nBOLT, you can improve the processing time by linking against one of memory\nallocation libraries with good support for concurrency. E.g. to use jemalloc:\u003c/p\u003e\n\u003cdiv class=\"snippet-clipboard-content notranslate position-relative overflow-auto\" data-snippet-clipboard-copy-content=\"\u0026gt; sudo yum install jemalloc-devel\n\u0026gt; LD_PRELOAD=/usr/lib64/libjemalloc.so llvm-bolt ....\"\u003e\u003cpre class=\"notranslate\"\u003e\u003ccode\u003e\u0026gt; sudo yum install jemalloc-devel\n\u0026gt; LD_PRELOAD=/usr/lib64/libjemalloc.so llvm-bolt ....\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eOr if you rather use tcmalloc:\u003c/p\u003e\n\u003cdiv class=\"snippet-clipboard-content notranslate position-relative overflow-auto\" data-snippet-clipboard-copy-content=\"\u0026gt; sudo yum install gperftools-devel\n\u0026gt; LD_PRELOAD=/usr/lib64/libtcmalloc_minimal.so llvm-bolt ....\"\u003e\u003cpre class=\"notranslate\"\u003e\u003ccode\u003e\u0026gt; sudo yum install gperftools-devel\n\u0026gt; LD_PRELOAD=/usr/lib64/libtcmalloc_minimal.so llvm-bolt ....\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eUsage\u003c/h2\u003e\u003ca id=\"user-content-usage\" class=\"anchor\" aria-label=\"Permalink: Usage\" href=\"#usage\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eFor a complete practical guide of using BOLT see \u003ca href=\"/upenn-acg/BOLT/blob/main/bolt/bolt/docs/OptimizingClang.md\"\u003eOptimizing Clang with BOLT\u003c/a\u003e.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eStep 0\u003c/h3\u003e\u003ca id=\"user-content-step-0\" class=\"anchor\" aria-label=\"Permalink: Step 0\" href=\"#step-0\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eIn order to allow BOLT to re-arrange functions (in addition to re-arranging\ncode within functions) in your program, it needs a little help from the linker.\nAdd \u003ccode\u003e--emit-relocs\u003c/code\u003e to the final link step of your application. You can verify\nthe presence of relocations by checking for \u003ccode\u003e.rela.text\u003c/code\u003e section in the binary.\nBOLT will also report if it detects relocations while processing the binary.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eStep 1: Collect Profile\u003c/h3\u003e\u003ca id=\"user-content-step-1-collect-profile\" class=\"anchor\" aria-label=\"Permalink: Step 1: Collect Profile\" href=\"#step-1-collect-profile\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eThis step is different for different kinds of executables. If you can invoke\nyour program to run on a representative input from a command line, then check\n\u003cstrong\u003eFor Applications\u003c/strong\u003e section below. If your program typically runs as a\nserver/service, then skip to \u003cstrong\u003eFor Services\u003c/strong\u003e section.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eThe version of \u003ccode\u003eperf\u003c/code\u003e command used for the following steps has to support\n\u003ccode\u003e-F brstack\u003c/code\u003e option. We recommend using \u003ccode\u003eperf\u003c/code\u003e version 4.5 or later.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch4 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eFor Applications\u003c/h4\u003e\u003ca id=\"user-content-for-applications\" class=\"anchor\" aria-label=\"Permalink: For Applications\" href=\"#for-applications\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eThis assumes you can run your program from a command line with a typical input.\nIn this case, simply prepend the command line invocation with \u003ccode\u003eperf\u003c/code\u003e:\u003c/p\u003e\n\u003cdiv class=\"snippet-clipboard-content notranslate position-relative overflow-auto\" data-snippet-clipboard-copy-content=\"$ perf record -e cycles:u -j any,u -o perf.data -- \u0026lt;executable\u0026gt; \u0026lt;args\u0026gt; ...\"\u003e\u003cpre class=\"notranslate\"\u003e\u003ccode\u003e$ perf record -e cycles:u -j any,u -o perf.data -- \u0026lt;executable\u0026gt; \u0026lt;args\u0026gt; ...\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch4 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eFor Services\u003c/h4\u003e\u003ca id=\"user-content-for-services\" class=\"anchor\" aria-label=\"Permalink: For Services\" href=\"#for-services\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eOnce you get the service deployed and warmed-up, it is time to collect perf\ndata with LBR (branch information). The exact perf command to use will depend\non the service. E.g., to collect the data for all processes running on the\nserver for the next 3 minutes use:\u003c/p\u003e\n\u003cdiv class=\"snippet-clipboard-content notranslate position-relative overflow-auto\" data-snippet-clipboard-copy-content=\"$ perf record -e cycles:u -j any,u -a -o perf.data -- sleep 180\"\u003e\u003cpre class=\"notranslate\"\u003e\u003ccode\u003e$ perf record -e cycles:u -j any,u -a -o perf.data -- sleep 180\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eDepending on the application, you may need more samples to be included with\nyour profile. It's hard to tell upfront what would be a sweet spot for your\napplication. We recommend the profile to cover 1B instructions as reported\nby BOLT \u003ccode\u003e-dyno-stats\u003c/code\u003e option. If you need to increase the number of samples\nin the profile, you can either run the \u003ccode\u003esleep\u003c/code\u003e command for longer and use\n\u003ccode\u003e-F\u0026lt;N\u0026gt;\u003c/code\u003e option with \u003ccode\u003eperf\u003c/code\u003e to increase sampling frequency.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eNote that for profile collection we recommend using cycle events and not\n\u003ccode\u003eBR_INST_RETIRED.*\u003c/code\u003e. Empirically we found it to produce better results.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eIf the collection of a profile with branches is not available, e.g., when you run on\na VM or on hardware that does not support it, then you can use only sample\nevents, such as cycles. In this case, the quality of the profile information\nwould not be as good, and performance gains with BOLT are expected to be lower.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch4 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eWith instrumentation\u003c/h4\u003e\u003ca id=\"user-content-with-instrumentation\" class=\"anchor\" aria-label=\"Permalink: With instrumentation\" href=\"#with-instrumentation\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eIf perf record is not available to you, you may collect profile by first\ninstrumenting the binary with BOLT and then running it.\u003c/p\u003e\n\u003cdiv class=\"snippet-clipboard-content notranslate position-relative overflow-auto\" data-snippet-clipboard-copy-content=\"llvm-bolt \u0026lt;executable\u0026gt; -instrument -o \u0026lt;instrumented-executable\u0026gt;\"\u003e\u003cpre class=\"notranslate\"\u003e\u003ccode\u003ellvm-bolt \u0026lt;executable\u0026gt; -instrument -o \u0026lt;instrumented-executable\u0026gt;\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eAfter you run instrumented-executable with the desired workload, its BOLT\nprofile should be ready for you in \u003ccode\u003e/tmp/prof.fdata\u003c/code\u003e and you can skip\n\u003cstrong\u003eStep 2\u003c/strong\u003e.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eRun BOLT with the \u003ccode\u003e-help\u003c/code\u003e option and check the category \"BOLT instrumentation\noptions\" for a quick reference on instrumentation knobs.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eStep 2: Convert Profile to BOLT Format\u003c/h3\u003e\u003ca id=\"user-content-step-2-convert-profile-to-bolt-format\" class=\"anchor\" aria-label=\"Permalink: Step 2: Convert Profile to BOLT Format\" href=\"#step-2-convert-profile-to-bolt-format\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eNOTE: you can skip this step and feed \u003ccode\u003eperf.data\u003c/code\u003e directly to BOLT using\nexperimental \u003ccode\u003e-p perf.data\u003c/code\u003e option.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eFor this step, you will need \u003ccode\u003eperf.data\u003c/code\u003e file collected from the previous step and\na copy of the binary that was running. The binary has to be either\nunstripped, or should have a symbol table intact (i.e., running \u003ccode\u003estrip -g\u003c/code\u003e is\nokay).\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eMake sure \u003ccode\u003eperf\u003c/code\u003e is in your \u003ccode\u003ePATH\u003c/code\u003e, and execute \u003ccode\u003eperf2bolt\u003c/code\u003e:\u003c/p\u003e\n\u003cdiv class=\"snippet-clipboard-content notranslate position-relative overflow-auto\" data-snippet-clipboard-copy-content=\"$ perf2bolt -p perf.data -o perf.fdata \u0026lt;executable\u0026gt;\"\u003e\u003cpre class=\"notranslate\"\u003e\u003ccode\u003e$ perf2bolt -p perf.data -o perf.fdata \u0026lt;executable\u0026gt;\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eThis command will aggregate branch data from \u003ccode\u003eperf.data\u003c/code\u003e and store it in a\nformat that is both more compact and more resilient to binary modifications.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eIf the profile was collected without LBRs, you will need to add \u003ccode\u003e-nl\u003c/code\u003e flag to\nthe command line above.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eStep 3: Optimize with BOLT\u003c/h3\u003e\u003ca id=\"user-content-step-3-optimize-with-bolt\" class=\"anchor\" aria-label=\"Permalink: Step 3: Optimize with BOLT\" href=\"#step-3-optimize-with-bolt\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eOnce you have \u003ccode\u003eperf.fdata\u003c/code\u003e ready, you can use it for optimizations with\nBOLT. Assuming your environment is setup to include the right path, execute\n\u003ccode\u003ellvm-bolt\u003c/code\u003e:\u003c/p\u003e\n\u003cdiv class=\"snippet-clipboard-content notranslate position-relative overflow-auto\" data-snippet-clipboard-copy-content=\"$ llvm-bolt \u0026lt;executable\u0026gt; -o \u0026lt;executable\u0026gt;.bolt -data=perf.fdata -reorder-blocks=cache+ -reorder-functions=hfsort -split-functions=2 -split-all-cold -split-eh -dyno-stats\"\u003e\u003cpre class=\"notranslate\"\u003e\u003ccode\u003e$ llvm-bolt \u0026lt;executable\u0026gt; -o \u0026lt;executable\u0026gt;.bolt -data=perf.fdata -reorder-blocks=cache+ -reorder-functions=hfsort -split-functions=2 -split-all-cold -split-eh -dyno-stats\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eIf you do need an updated debug info, then add \u003ccode\u003e-update-debug-sections\u003c/code\u003e option\nto the command above. The processing time will be slightly longer.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eFor a full list of options see \u003ccode\u003e-help\u003c/code\u003e/\u003ccode\u003e-help-hidden\u003c/code\u003e output.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eThe input binary for this step does not have to 100% match the binary used for\nprofile collection in \u003cstrong\u003eStep 1\u003c/strong\u003e. This could happen when you are doing active\ndevelopment, and the source code constantly changes, yet you want to benefit\nfrom profile-guided optimizations. However, since the binary is not precisely the\nsame, the profile information could become invalid or stale, and BOLT will\nreport the number of functions with a stale profile. The higher the\nnumber, the less performance improvement should be expected. Thus, it is\ncrucial to update \u003ccode\u003e.fdata\u003c/code\u003e for release branches.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eMultiple Profiles\u003c/h2\u003e\u003ca id=\"user-content-multiple-profiles\" class=\"anchor\" aria-label=\"Permalink: Multiple Profiles\" href=\"#multiple-profiles\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eSuppose your application can run in different modes, and you can generate\nmultiple profiles for each one of them. To generate a single binary that can\nbenefit all modes (assuming the profiles don't contradict each other) you can\nuse \u003ccode\u003emerge-fdata\u003c/code\u003e tool:\u003c/p\u003e\n\u003cdiv class=\"snippet-clipboard-content notranslate position-relative overflow-auto\" data-snippet-clipboard-copy-content=\"$ merge-fdata *.fdata \u0026gt; combined.fdata\"\u003e\u003cpre class=\"notranslate\"\u003e\u003ccode\u003e$ merge-fdata *.fdata \u0026gt; combined.fdata\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eUse \u003ccode\u003ecombined.fdata\u003c/code\u003e for \u003cstrong\u003eStep 3\u003c/strong\u003e above to generate a universally optimized\nbinary.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eLicense\u003c/h2\u003e\u003ca id=\"user-content-license\" class=\"anchor\" aria-label=\"Permalink: License\" href=\"#license\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042 3DC1 .751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eBOLT is licensed under the \u003ca href=\"/upenn-acg/BOLT/blob/main/bolt/LICENSE.TXT\"\u003eApache License v2.0 with LLVM Exceptions\u003c/a\u003e.\u003c/p\u003e\n\u003c/article\u003e","errorMessage":null,"headerInfo":{"toc":[{"level":1,"text":"BOLT","anchor":"bolt","htmlText":"BOLT"},{"level":2,"text":"Input Binary Requirements","anchor":"input-binary-requirements","htmlText":"Input Binary Requirements"},{"level":2,"text":"Installation","anchor":"installation","htmlText":"Installation"},{"level":3,"text":"Docker Image","anchor":"docker-image","htmlText":"Docker Image"},{"level":3,"text":"Manual Build","anchor":"manual-build","htmlText":"Manual Build"},{"level":2,"text":"Optimizing BOLT's Performance","anchor":"optimizing-bolts-performance","htmlText":"Optimizing BOLT's Performance"},{"level":2,"text":"Usage","anchor":"usage","htmlText":"Usage"},{"level":3,"text":"Step 0","anchor":"step-0","htmlText":"Step 0"},{"level":3,"text":"Step 1: Collect Profile","anchor":"step-1-collect-profile","htmlText":"Step 1: Collect Profile"},{"level":4,"text":"For Applications","anchor":"for-applications","htmlText":"For Applications"},{"level":4,"text":"For Services","anchor":"for-services","htmlText":"For Services"},{"level":4,"text":"With instrumentation","anchor":"with-instrumentation","htmlText":"With instrumentation"},{"level":3,"text":"Step 2: Convert Profile to BOLT Format","anchor":"step-2-convert-profile-to-bolt-format","htmlText":"Step 2: Convert Profile to BOLT Format"},{"level":3,"text":"Step 3: Optimize with BOLT","anchor":"step-3-optimize-with-bolt","htmlText":"Step 3: Optimize with BOLT"},{"level":2,"text":"Multiple Profiles","anchor":"multiple-profiles","htmlText":"Multiple Profiles"},{"level":2,"text":"License","anchor":"license","htmlText":"License"}],"siteNavLoginPath":"/login?return_to=https%3A%2F%2Fgithub.com%2Fupenn-acg%2FBOLT%2Ftree%2Fmain%2Fbolt"}},"totalCount":11,"showBranchInfobar":true},"fileTree":{"":{"items":[{"name":".github","path":".github","contentType":"directory"},{"name":"bolt","path":"bolt","contentType":"directory"},{"name":"clang-tools-extra","path":"clang-tools-extra","contentType":"directory"},{"name":"clang","path":"clang","contentType":"directory"},{"name":"cmake","path":"cmake","contentType":"directory"},{"name":"compiler-rt","path":"compiler-rt","contentType":"directory"},{"name":"cross-project-tests","path":"cross-project-tests","contentType":"directory"},{"name":"flang","path":"flang","contentType":"directory"},{"name":"libc","path":"libc","contentType":"directory"},{"name":"libclc","path":"libclc","contentType":"directory"},{"name":"libcxx","path":"libcxx","contentType":"directory"},{"name":"libcxxabi","path":"libcxxabi","contentType":"directory"},{"name":"libunwind","path":"libunwind","contentType":"directory"},{"name":"lld","path":"lld","contentType":"directory"},{"name":"lldb","path":"lldb","contentType":"directory"},{"name":"llvm","path":"llvm","contentType":"directory"},{"name":"mlir","path":"mlir","contentType":"directory"},{"name":"openmp","path":"openmp","contentType":"directory"},{"name":"polly","path":"polly","contentType":"directory"},{"name":"pstl","path":"pstl","contentType":"directory"},{"name":"runtimes","path":"runtimes","contentType":"directory"},{"name":"third-party","path":"third-party","contentType":"directory"},{"name":"utils","path":"utils","contentType":"directory"},{"name":".arcconfig","path":".arcconfig","contentType":"file"},{"name":".arclint","path":".arclint","contentType":"file"},{"name":".clang-format","path":".clang-format","contentType":"file"},{"name":".clang-tidy","path":".clang-tidy","contentType":"file"},{"name":".git-blame-ignore-revs","path":".git-blame-ignore-revs","contentType":"file"},{"name":".gitignore","path":".gitignore","contentType":"file"},{"name":".mailmap","path":".mailmap","contentType":"file"},{"name":"CONTRIBUTING.md","path":"CONTRIBUTING.md","contentType":"file"},{"name":"README.md","path":"README.md","contentType":"file"},{"name":"SECURITY.md","path":"SECURITY.md","contentType":"file"}],"totalCount":33}},"fileTreeProcessingTime":7.787881,"foldersToFetch":[],"treeExpanded":true,"symbolsExpanded":false,"csrf_tokens":{"/upenn-acg/BOLT/branches":{"post":"Ca3k8aXRcp1Qmn6S7qcusNiUaCJaRqsxD8pVVC92s789cVUearJb70yoA9dsXAxX3MIKg3B3MDD0OTHmrqggww"},"/upenn-acg/BOLT/branches/fetch_and_merge/main":{"post":"xQ2ytZhsd-coguG0d9gCDHpZdh1iUFgLT2XSFG8XST1IGyOSU9VlwBjzvLLR21G8qloi-ApCDybihNQtIrJi0A"},"/upenn-acg/BOLT/branches/fetch_and_merge/main?discard_changes=true":{"post":"Il7xF233cULpDp3_CxfRaMeYnKferg3nv6yS01i8kQqvSGAwpk5jZdl_wPmtFILYF5vIQra8WsoSTZTqFRm65w"}}},"title":"BOLT/bolt at main · upenn-acg/BOLT","appPayload":{"helpUrl":"https://docs.github.com","findFileWorkerPath":"/assets-cdn/worker/find-file-worker-263cab1760dd.js","findInFileWorkerPath":"/assets-cdn/worker/find-in-file-worker-d30550df4878.js","githubDevUrl":null,"enabled_features":{"code_nav_ui_events":false,"react_blob_overlay":false,"accessible_code_button":true}}}
0