diff options
author | Fangrui Song <i@maskray.me> | 2023-08-16 23:11:59 -0700 |
---|---|---|
committer | Fangrui Song <i@maskray.me> | 2023-08-16 23:11:59 -0700 |
commit | 4c89277095ee7cda3d20e0f5f18b384212069778 (patch) | |
tree | 1151563ef72b5615ce28eaacd6fc5daacc7cef1b /clang/lib/CodeGen/CodeGenModule.h | |
parent | 235dad33284a6c7514e4eadff21cb5e8157d4edc (diff) | |
download | llvm-4c89277095ee7cda3d20e0f5f18b384212069778.zip llvm-4c89277095ee7cda3d20e0f5f18b384212069778.tar.gz llvm-4c89277095ee7cda3d20e0f5f18b384212069778.tar.bz2 |
[Mips][MC] AttemptToFoldSymbolOffsetDifference: revert isMicroMips special case
D52985/D57677 added a .gcc_except_table workaround, but the new behavior
doesn't match GNU assembler.
```
void foo();
int bar() {
foo();
try { throw 1; }
catch (int) { return 1; }
return 0;
}
clang --target=mipsel-linux-gnu -mmicromips -S a.cc
mipsel-linux-gnu-gcc -mmicromips -c a.s -o gnu.o
.uleb128 ($cst_end0)-($cst_begin0) // bit 0 is not forced to 1
.uleb128 ($func_begin0)-($func_begin0) // bit 0 is not forced to 1
```
I have inspected `.gcc_except_table` output by `mipsel-linux-gnu-gcc -mmicromips -c a.cc`.
The `.uleb128` values are not forced to set the least significant bit.
In addition, D57677's adjustment (even->odd) to CodeGen/Mips/micromips-b-range.ll is wrong.
PC-relative `.long func - .` values will differ from GNU assembler as well.
The original intention of D52985 seems unclear to me. I think whatever
goal it wants to achieve should be moved to an upper layer.
This isMicroMips special case has caused problems to fix MCAssembler::relaxLEB to use evaluateAsAbsolute instead of evaluateKnownAbsolute,
which is needed to proper support R_RISCV_SET_ULEB128/R_RISCV_SUB_ULEB128.
Differential Revision: https://reviews.llvm.org/D157655
Diffstat (limited to 'clang/lib/CodeGen/CodeGenModule.h')
0 files changed, 0 insertions, 0 deletions