<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/67966>67966</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
BOLT crashes with `--update-debug-sections` on DWARF v5 when optimizing libpython.so
</td>
</tr>
<tr>
<th>Labels</th>
<td>
BOLT
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
indygreg
</td>
</tr>
</table>
<pre>
I can reliably elicit a crash out of BOLT when optimizing an x86-64 ELF binary with DWARF v5. The crash appears identical to #56277:
```
cpython-3.12> BOLT-INFO: FRAME ANALYSIS: 36855 function(s) were not optimized.
cpython-3.12> BOLT-INFO: FRAME ANALYSIS: 651 function(s) (51.5% dyn cov) could not have its frame indices restored.
cpython-3.12> BOLT-INFO: Shrink wrapping moved 45 spills inserting load/stores and 5 spills inserting push/pops
cpython-3.12> BOLT-INFO: Shrink wrapping reduced 5692310 store executions (0.1% total instructions executed, 1.3% store instructions)
cpython-3.12> BOLT-INFO: Shrink wrapping failed at reducing 0 store executions (0.0% total instructions executed, 0.0% store instructions)
cpython-3.12> BOLT-INFO: Allocation combiner: 38 empty spaces coalesced (dyn count: 3197588).
cpython-3.12> #0 0x0000556536b4d188 llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/tools/llvm/bin/llvm-bolt+0x16b7188)
cpython-3.12> #1 0x0000556536b4b23c llvm::sys::RunSignalHandlers() (/tools/llvm/bin/llvm-bolt+0x16b523c)
cpython-3.12> #2 0x0000556536b4d91d SignalHandler(int) Signals.cpp:0:0
cpython-3.12> #3 0x00007f0a984dc890 __restore_rt (/lib/x86_64-linux-gnu/libpthread.so.0+0xf890)
cpython-3.12> #4 0x000055653712a0fb llvm::bolt::BinaryContext::addDebugFilenameToUnit(unsigned int, unsigned int, unsigned int) (/tools/llvm/bin/llvm-bolt+0x1c940fb)
cpython-3.12> #5 0x0000556537139d3e (anonymous namespace)::BinaryEmitter::emitFunctionBody(llvm::bolt::BinaryFunction&, llvm::bolt::FunctionFragment&, bool) BinaryEmitter.cpp:0:0
cpython-3.12> #6 0x000055653713ac9b (anonymous namespace)::BinaryEmitter::emitFunction(llvm::bolt::BinaryFunction&, llvm::bolt::FunctionFragment&) BinaryEmitter.cpp:0:0
cpython-3.12> #7 0x000055653713a677 (anonymous namespace)::BinaryEmitter::emitFunctions()::$_0::operator()(std::vector<llvm::bolt::BinaryFunction*, std::allocator<llvm::bolt::BinaryFunction*>> const&) const BinaryEmitter.cpp:0:0
cpython-3.12> #8 0x0000556537138d41 llvm::bolt::emitBinaryContext(llvm::MCStreamer&, llvm::bolt::BinaryContext&, llvm::StringRef) (/tools/llvm/bin/llvm-bolt+0x1ca2d41)
cpython-3.12> #9 0x0000556536b9ce82 llvm::bolt::RewriteInstance::emitAndLink() (/tools/llvm/bin/llvm-bolt+0x1706e82)
cpython-3.12> #10 0x0000556536b94af3 llvm::bolt::RewriteInstance::run() (/tools/llvm/bin/llvm-bolt+0x16feaf3)
cpython-3.12> #11 0x0000556535797032 main (/tools/llvm/bin/llvm-bolt+0x301032)
cpython-3.12> #12 0x00007f0a971a7b45 __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x21b45)
cpython-3.12> #13 0x00005565357952db _start (/tools/llvm/bin/llvm-bolt+0x2ff2db)
cpython-3.12> PLEASE submit a bug report to https://github.com/llvm/llvm-project/issues/ and include the crash backtrace.
cpython-3.12> Stack dump:
cpython-3.12> 0. Program arguments: /tools/llvm/bin/llvm-bolt libpython3.12.so.1.0.prebolt -o libpython3.12.so.1.0.bolt -data=libpython3.12.so.1.0.fdata -update-debug-sections -reorder-blocks=ext-tsp -reorder-functions=hfsort+ -split-functions -icf=1 -inline-all -split-eh -reorder-functions-use-hot-size -peepholes=none -jump-tables=aggressive -inline-ap -indirect-call-promotion=all -dyno-stats -use-gnu-stack -frame-opt=hot
cpython-3.12> Segmentation fault (core dumped)
cpython-3.12> make[1]: *** [profile-bolt-stamp] Error 139
cpython-3.12> Makefile:789: recipe for target 'profile-bolt-stamp' failed
cpython-3.12> make[1]: Leaving directory '/build/Python-3.12.0rc3'
```
I can crash at least 16.0.3 and 17.0.1.
The crash goes away if I compile all inputs with `-fdebug-default-version=4`. So it appears it has something to do with updating DWARF v5 debug symbols.
Steps to reproduce (sorry for not being minimal):
1. `git clone https://github.com/indygreg/python-build-standalone`
2. `git checkout fa5d1fcebdde07aa04b6c661a55c77c85f414508` (https://github.com/indygreg/python-build-standalone/commit/fa5d1fcebdde07aa04b6c661a55c77c85f414508 from the `bolt-crash` branch)
3. `./build-linux.py --optimizations pgo --python cpython-3.12 --break-on-failure`
This builds CPython and its dependencies from source inside highly deterministic Docker containers. After a few minutes it should eventually get to BOLT optimizations and crash. That `--break-on-failure` keeps the container from exiting on failure, giving you the opportunity to `docker exec` into it to debug.
CI logs showing the crash should appear at https://github.com/indygreg/python-build-standalone/actions/runs/6379047670 within a few hours.
If you tell me how to figure out which object file / symbol it is crashing on, I can dump DWARF of the offending file / symbol if you aren't able to reproduce.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJy0WFtv5KqT_zTkpWQL4_alH_LQubQ20pxzRpNZrfYpwlBuc4LBApykz6dfgTu33iQnmdFfyvTYBqp-v6KqKIp7r3YG8ZRUZ6S6OOFzGKw7VUbudw53J52V-9MrENyAQ614p_eAWgkVgINw3A9g5wC2h7O_vv2E-wEN2CmoUf2jzA64gYe2zuoVXH7bQqcMd3u4V2GAi__Z_NjCXZXDzwEPkvg0IXcelEQTlOAaggXCyqpmTUPKDaEXhD7-1vTwl17FtA-DNVmZF4yUlwlNdvXn9i9SbmD7Y_PHJWz-3Hz73-ur6_ilrNuqgn42IihrCGs9YWu4R4dgbHhkgDL_Jel1Vfw_2YS1VZFXhFUg9waEvYtfhZ21TCoHfoeggofe8RFBGakEenDog3WfA3I9OGVu4d7xaYrGH-0dSlhV4CeltQdlPLoQR7TlkrBtEu2BGwlvTJpmPxC2nezkf0G5QzkLlFDVa1YWFJIuwAcUczSLjwaheRHtEWzgOioObhbL4DIPJWHnUORlnLUIeDmLsPUvAOu50iiBhwVi_PQeOvoJdIdZv4puo7UVPC4AYcdOGXTJP1vAcQp78BOPbiAs1-ijPQlrF_-ZTUgzi3VTtS1h63dchLCSAn2glNKqqquy7layaFvQ-m6MMVVu_N4vD9-dMuE6cHH703GBhLXPkxy_v7E-OOQjYXVkrkw4ODZh22Ct9oRt0wK27ZQ5vGSd1YGwM_pQ1F1TJKRvA41IiyOkHSvFW0h_zOZa7QzX_8WN1Oh8QvE1MBUrxYdg2LHZ1oWEV2oJaw9WWD77XEwTKTc0_XtXcHkQ3PSUr9uVFO2aws3NIdZvXDjw0KojbPvQ1jf1KtPKzA_ZzszLwBQGh1zm3kYHPKMPfbum79IhrFy9ZNMUjNO-e2HaZJn0dJay9Lk1AR8On7iUF9jNu63SaPiIP-1_GxUIa2eTjg-5OMM5fPz-lf0R6xXtuw_3p3rNqFzLEqMGbqzZj3b2ELGmCIpyXpC7HFUIKdJIucFRhe0hW59ZuX_l9sdm2T6l9RQDb018nLJ1fDdi5J2mdtbqaIJXCP7dXwgr6yOeXKy73-T5H-H4ZW6RXHNMrm6a3yR3SAbLAGGrG7o82gkdD9Ydhlnrg1xG7lDE7-X5Z4yyiUZ5WsqXBP6F1eVl5C6s8Y9mS8-_Yrz2yHitXBVv7lc0z-u4fukAf5xfp8QeE9q7W360_GjedXDK7H5g_8Uo50yuig-jfP06C68FtuxNgD_w3qmAV8YHbgQ-E98Y-U2Z2y8fEQ2tsWUf5dTi6GRdr3hffh6cm83Xz60eeV9-COrVIVo164aWDEauzOfVlLSg5cfU2ctDrCl4060quLnRqhM3PnAXbl6o_OgkE_EMq5NaVnSr6kOt5RG3iskOFn2fZ8f6nsn3z5bv3y4315fg525M15xujuXsZF2I95EhhClVIWxL2HanwjB3ubDjs8qkbHL2bxSBsK3yfsaIKBXaygg9S4TwdOvpuLgNsd56p4BLBRnIeZyerkDHU2hO6Pq7szvHR-BuN8ecHEHCvxoEYi2RpEVhcSuKnOaTwzSY2bfHl0HJAyflxZsz-jgI2TxJHjCTsXrIPB4K6MyhdRJd1mkrbj0pL_AhZMFPzyP9UzIvL4beWxe3DjI_aRWeByFToiflRQGZMloZzLjWj7NweENcNnvMBhsyr_5ByCbEabAaoxpjDUL29zxOWeDd8o3vdg69V3f4rGGKj1I5FCETXOu416NN6b28SPrl3tjMBx48JH07M8dXcQtZut5ldgqRlw3vbDmmU3W5F_R81sm5RbxiRD-IN493fHfkt0iqs4JUF8v2b5Y_INXZ5GyvNKZtj3DGiVQXcOmcdVCU7wj8g99iXEXKTdPGMxUcCjUh9NZB4G6HEVvzhmzWHO5an0L6DfldvIstdrVuH6VGd52VjnfV78-rc-pEGUffagQsv0vH4tBVCKCR-wBFndO8TFFYNDnNi_zlkuc2xM7GS_E934Pq4SreyyalEeLOKjPNwS8dDFLTrF8cW2LapOwOnV_cYEVqmsO1hZhBHtsa8ZbvwdsRwxC5BgvSLsJSnMRvj30RSJLB78fOav8K6XXAycfFDidn4zU7eoe3zu3TrhgboMPUAVBGjVwfiqEXIoo8wt-pAEJHr_8gqT22ggjbHnYwbUncZCN5XP1ke_YsdUBxa-cAPa9k0QvspETacE5XXS3quuBVJZpGtFW_KlYVbUlNI4nfw8G2wo5jvJhsP6sXemfHlIxJTZPzJh-IcDrHjRieIq1M5PJHl1xOsXzaQ5Yd2kV8SUnTzkKWLRjhpddDlnUO-W1mTRYjY3Z45LY_B-Uhifdwvnj8cmgEDxInNBKNUOgX1N7OTqSmg5IIg9oNeg8SA7q47z4oARdW3KKLBWbgyqDzOWz6gA449Hgf_WMOmDzTD6kVhXdowsy13kOM7GCXvt5rhhFSMlMOPwceUiS8RQ1uMXlqjKxHBAt0fFDJ21N6W6azc9iplAL2dk5r7BTP3NmosE-NwJrKhQ4-oIjilQkpwGIcxWh5FSXnV6Dtzkdi9ynYnuL7QHUJy5geftfr-OO1Y-vm9F9dNmu6auqGpuhW5mDvwc7udSxf9Qtd1BpGhMHeRza92s0OU2f1flBiANvFYgJiio1H-iEtRO7KL6wWa0YrLrkvnhOHZGL7xZx9j0amFtixmAUEd2gIawLEw-9VfslP5Gkp1-Wan-BpUa9rtirboj4ZTquy7YuyWxUlE7RvGlxxKVFU66opVj0tT9Qpo7FQpqygFS3qXIqaUr4WDKu2K8uSrCiOXOk8liS5dbuTVDCd1s26rk8071D71J1mLLoiYYxUFyfudKlg5p0nK6qVD_5ZQFBB42ly3GQbfJGx365IojdZ85x8j_vYTyVO7u3J7PTpr1eBidf_BQAA___aOGJH">