[PATCH] D142880: [RISCV][LLD] Support R_RISCV_SET_ULEB128 and R_RISCV_SUB_ULEB128
Jessica Clarke via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Mon Jul 31 12:02:32 PDT 2023
jrtc27 requested changes to this revision.
jrtc27 added a comment.
This revision now requires changes to proceed.
- What about relocations in non-SHF_ALLOC sections? Surely that can happen for debug info?
- Test has no coverage of errors
================
Comment at: lld/ELF/Arch/RISCV.cpp:111-113
+ error(errPlace.loc + " ULEB128 value has extended the length by " +
+ toString(type) + "relocation from " + Twine(oldLength) + " byte to " +
+ Twine(newLength) + " byte");
----------------
This doesn't make grammatical sense. Please rewrite this to be in the style of elf::reportRangeError; I'd like to see it print something like:
```
error: foo.o+0x1234: ULEB128 difference relocation pair overflow: 5 bytes needed but only 4 bytes allocated; references 'foo' - 'bar'
>>> 'foo' defined in foo.o
>>> 'bar' defined in bar.o
>>> referenced by bar.c:12
>>> bar.o:(.baz+0x4)
```
and I guess also with the -fdebug-types-section message. reportRangeError does a lot of useful things, it would be a shame to deviate from that and lose the information.
================
Comment at: lld/ELF/Arch/RISCV.cpp:331
+void RISCV::relocateAlloc(InputSectionBase &sec, uint8_t *buf) const {
+ const unsigned bits = config->is64 ? 64 : 32;
+ uint64_t secAddr = sec.getOutputSection()->addr;
----------------
`config->wordsize * 8;`
================
Comment at: lld/ELF/Arch/RISCV.cpp:337
+ uint8_t *lastULEB128SetLoc = nullptr;
+ uint64_t lastULEB128SetVal = 0;
+ for (const Relocation &rel : sec.relocs()) {
----------------
Why not just keep a pointer to the relocation around instead?
================
Comment at: lld/ELF/Arch/RISCV.cpp:353
+ error(errPlace.loc +
+ " More than one R_RISCV_SET_ULEB128 in same location");
+ }
----------------
Why do you actually need to enforce this? So long as the SET/SUB pairs are adjacent it's fine
================
Comment at: lld/ELF/Arch/RISCV.cpp:363
+ error(errPlace.loc +
+ " R_RISCV_SUB_ULEB128 must come after R_RISCV_SET_ULEB128");
+ break;
----------------
There are two cases this handles:
1. a SUB with no preceding SET
2. a SUB with a different preceding SET
This error isn't really correct. What you want to say is that you've found a SUB which is not, when looking at solely ULEB128 relocations, directly preceded by its corresponding SET.
================
Comment at: lld/ELF/Arch/RISCV.cpp:369
+ uint64_t newVal = lastULEB128SetVal - val;
+ unsigned newLength = encodeULEB128(newVal, loc, /*PadTo*/ oldLength);
+ checkULEB128LengthNoExtend(loc, rel.type, oldLength, newLength);
----------------
What if this walks off the end of the buffer? It's an obscure edge case but could happen if you have a too-small buffer at the end of the file. Then we'll crash rather than catch the error early. Check getULEB128Size first.
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D142880/new/
https://reviews.llvm.org/D142880
More information about the llvm-commits
mailing list