Issue |
138264
|
Summary |
[BOLT][AArch64] 0-bit relocation offset expected
|
Labels |
BOLT
|
Assignees |
|
Reporter |
paschalis-mpeis
|
## Assertion Crash:
When compiling chromium with the options below using BOLT trunk, the following assertion is triggered:
```txt
AArch64MCPlusBuilder::createRelocation(const MCFixup &, const MCAsmBackend &) const: Assertion `FKI.TargetOffset == 0 && "0-bit relocation offset expected"' failed.
```
#### Details:
The crash occurs in `scanExternalRefs`, when it attempts to `createRelocation` for a `fixup_aarch64_pcrel_branch19`, which has a [non-zero TargetOffset](https://github.com/llvm/llvm-project/blob/c239acb5b6b80ddb3c6407ffc9e051f636ae41c1/llvm/lib/Target/AArch64/MCTargetDesc/AArch64AsmBackend.cpp#L66).
This fixup sets the high 19 bits of a 21-bit PC-relative immediate.
## Reproducer:
- [ ] TODO: attach compressed binary and checksum instructions
Alternatively, you can compile a binary from source (see last section).
Note: debug symbols were kept in the binary as without those bolt hits different errors.
Skip functions via `skipfuncs.txt`:
```bash
.*tap.*
Builtins_.*
```
#### Optimize with BOLT:
- BOLT revision `e046f2050578b8cda394143fafbfb476767b836a`
- Optimized build with assertions enabled
```bash
llvm-bolt --skip-funcs-file=skipfuncs.txt chrome -o chrome.bolt
```
#### Error log:
```txt
BOLT-INFO: shared object or position-independent executable detected
BOLT-INFO: Target architecture: aarch64
BOLT-INFO: BOLT version: e046f2050578b8cda394143fafbfb476767b836a
BOLT-INFO: first alloc address is 0x0
BOLT-INFO: creating new program header table at address 0xee00000, offset 0xee00000
BOLT-WARNING: debug info will be stripped from the binary. Use -update-debug-sections to keep it.
BOLT-INFO: enabling relocation mode
BOLT-WARNING: ignoring symbol __ehdr_start at 0x0, which lies outside .interp
llvm-bolt: /home/user/llvm-project/bolt/lib/Target/AArch64/AArch64MCPlusBuilder.cpp:2341: virtual std::optional<Relocation> (anonymous namespace)::AArch64MCPlusBuilder::createRelocation(const MCFixup &, const MCAsmBackend &) const: Assertion `FKI.TargetOffset == 0 && "0-bit relocation offset expected"' failed.
#0 0x0000ecb0cce31578 llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) /home/user/llvm-project/llvm/lib/Support/Unix/Signals.inc:804:13
#1 0x0000ecb0cce2f3c4 store /usr/bin/../lib/gcc/aarch64-linux-gnu/13/../../../../include/c++/13/atomic:279:2
#2 0x0000ecb0cce2f3c4 llvm::sys::RunSignalHandlers() /home/user/llvm-project/llvm/lib/Support/Signals.cpp:107:16
#3 0x0000ecb0cce31ca0 SignalHandler(int, siginfo_t*, void*) /home/user/llvm-project/llvm/lib/Support/Unix/Signals.inc:418:13
#4 0x0000ecb0cf0ae8f8 (linux-vdso.so.1+0x8f8)
#5 0x0000ecb0cc747608 __pthread_kill_implementation ./nptl/pthread_kill.c:44:76
#6 0x0000ecb0cc6fcb3c raise ./signal/../sysdeps/posix/raise.c:27:6
#7 0x0000ecb0cc6e7e00 abort ./stdlib/abort.c:81:7
#8 0x0000ecb0cc6f5cc0 __assert_fail_base ./assert/assert.c:93:7
#9 0x0000ecb0cc6f5d30 __assert_perror_fail ./assert/assert-perr.c:31:1
#10 0x0000ecb0c9562928 getOpcode /home/user/llvm-project/llvm/include/llvm/MC/MCInst.h:199:39
#11 0x0000ecb0c9562928 llvm::bolt::MCPlusBuilder::isCFI(llvm::MCInst const&) const /home/user/llvm-project/bolt/include/bolt/Core/MCPlusBuilder.h:1815:17
#12 0x0000ecb0c9089314 _M_is_engaged /usr/bin/../lib/gcc/aarch64-linux-gnu/13/../../../../include/c++/13/optional:473:58
#13 0x0000ecb0c9089314 _M_get /usr/bin/../lib/gcc/aarch64-linux-gnu/13/../../../../include/c++/13/optional:479:2
#14 0x0000ecb0c9089314 operator-> /usr/bin/../lib/gcc/aarch64-linux-gnu/13/../../../../include/c++/13/optional:968:39
#15 0x0000ecb0c9089314 llvm::bolt::BinaryFunction::scanExternalRefs() /home/user/llvm-project/bolt/lib/Core/BinaryFunction.cpp:1799:7
#16 0x0000ecb0cdda6400 ~TimeRegion /home/user/llvm-project/llvm/include/llvm/Support/Timer.h:160:9
#17 0x0000ecb0cdda6400 llvm::bolt::RewriteInstance::disassembleFunctions() /home/user/llvm-project/bolt/lib/Rewrite/RewriteInstance.cpp:3415:5
#18 0x0000ecb0cdd9efe0 processMetadataPreCFG /home/user/llvm-project/bolt/lib/Rewrite/RewriteInstance.cpp:3319:20
#19 0x0000ecb0cdd9efe0 llvm::bolt::RewriteInstance::run() /home/user/llvm-project/bolt/lib/Rewrite/RewriteInstance.cpp:730:3
#20 0x0000c97e55096014 getPtr /home/user/llvm-project/llvm/include/llvm/Support/Error.h:278:42
#21 0x0000c97e55096014 operator bool /home/user/llvm-project/llvm/include/llvm/Support/Error.h:241:16
#22 0x0000c97e55096014 main /home/user/llvm-project/bolt/tools/driver/llvm-bolt.cpp:260:17
#23 0x0000ecb0cc6e84c4 __libc_start_call_main ./csu/../sysdeps/nptl/libc_start_call_main.h:74:3
#24 0x0000ecb0cc6e8598 call_init ./csu/../csu/libc-start.c:128:20
#25 0x0000ecb0cc6e8598 __libc_start_main ./csu/../csu/libc-start.c:347:5
#26 0x0000c97e55094030 _start (/home/user/llvm-project/build/bin/llvm-bolt+0x14030)
PLEASE submit a bug report to https://github.com/llvm/llvm-project/issues/ and include the crash backtrace.
Stack dump:
0. Program arguments: llvm-bolt -o chrome.bolt --skip-funcs-file=skipfuncs.txt chrome
[1] 1905728 abort (core dumped) llvm-bolt -o chrome.bolt --skip-funcs-file=skipfuncs.txt chrome
```
# Build Chromium from Source:
Based on the [official Chromium Guide](https://chromium.googlesource.com/chromium/src/+/main/docs/linux/build_instructions.md).
Tested on:
- Host Machine: Ubuntu 22.04.4 LTS (6.8.0-1015-aws, c7i, x86)
- Chromium version: a3e414899de9028990fbd7022e4184469932e890
```bash
cd $HOME
git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git
export PATH="$PATH:$HOME/depot_tools"
mkdir chromium && cd chromium
fetch --nohooks chromium
```
Edit `.gclient` to set target and pull PGO profiles:
```bash
vim .gclient # and adjust like below:
```
```python
solutions = [
{
"name": "src",
"url": "https://chromium.googlesource.com/chromium/src.git",
"managed": False,
"custom_deps": {},
"custom_vars": {
"checkout_pgo_profiles": True,
},
},
]
target_cpu = ["arm64"]
```
Then pull components and install dependencies:
```bash
gclient sync
gclient runhooks
# verify that pgo profile was downloaded:
ls -l chrome/build/pgo_profiles/
cd src
./build/install-build-deps.sh # assumes Ubuntu
```
Set GN arguments:
```bash
gn args out/Default # Your EDITOR will open. Paste the below args:
```
```python
is_debug=false
target_cpu="arm64"
symbol_level=1
target_os="linux"
chrome_pgo_phase=2
dcheck_always_on=false
is_official_build=true
disable_fieldtrial_testing_config=true
arm_control_flow_integrity="none"
```
Build chromium (you'll need [bolt-chromium-0bitreloc.patch](https://gist.githubusercontent.com/paschalis-mpeis/5071aca6960bcc9e54a954c2fb2030b4/raw/c16f0277522d6bf22cfdac438de1019a83672d18/bolt-chromium-0bitreloc.patch)):
```bash
gn gen out/Default
git am ~/bolt-chromium-0bitreloc.patch
autoninja -C out/Default chrome
```
The binary will be at `out/Default/chrome`.
_______________________________________________
llvm-bugs mailing list
llvm-bugs@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-bugs