diff options
author | Alex Bradbury <asb@lowrisc.org> | 2018-05-23 10:53:56 +0000 |
---|---|---|
committer | Alex Bradbury <asb@lowrisc.org> | 2018-05-23 10:53:56 +0000 |
commit | 1c010d0fa4be73441bfd0adc07243f76739b1323 (patch) | |
tree | cd4c639a0cad71631c0a44d06cc1653892335d76 /llvm/lib/Target | |
parent | 5b1b594f649b154d30cd74bc81429f87e85b1a14 (diff) | |
download | bcm5719-llvm-1c010d0fa4be73441bfd0adc07243f76739b1323.tar.gz bcm5719-llvm-1c010d0fa4be73441bfd0adc07243f76739b1323.zip |
[RISCV] Correctly report sizes for builtin fixups
This is a different approach to fixing the problem described in D46746.
RISCVAsmBackend currently depends on the getSize helper function returning the
number of bytes a fixup may change (note: some other backends have a similar
helper named getFixupNumKindBytes). As noted in that review, this doesn't
return the correct size for FK_Data_1, FK_Data_2, or FK_Data_8 meaning that
too few bytes will be written in the case of FK_Data_8, and there's the
potential of writing outside the Data array for the smaller fixups.
D46746 extends getSize to recognise some of the builtin fixup types. Rather
than having a function that needs to be kept up to date as new builtin or
target-specific fixups are added, We can calculate an appropriate bound on the
number of bytes that might be touched using Info.TargetSize and
Info.TargetOffset.
Differential Revision: https://reviews.llvm.org/D46965
llvm-svn: 333076
Diffstat (limited to 'llvm/lib/Target')
-rw-r--r-- | llvm/lib/Target/RISCV/MCTargetDesc/RISCVAsmBackend.cpp | 17 |
1 files changed, 2 insertions, 15 deletions
diff --git a/llvm/lib/Target/RISCV/MCTargetDesc/RISCVAsmBackend.cpp b/llvm/lib/Target/RISCV/MCTargetDesc/RISCVAsmBackend.cpp index d61d57e3159..91fe3f774ca 100644 --- a/llvm/lib/Target/RISCV/MCTargetDesc/RISCVAsmBackend.cpp +++ b/llvm/lib/Target/RISCV/MCTargetDesc/RISCVAsmBackend.cpp @@ -296,16 +296,6 @@ static uint64_t adjustFixupValue(const MCFixup &Fixup, uint64_t Value, } } -static unsigned getSize(unsigned Kind) { - switch (Kind) { - default: - return 4; - case RISCV::fixup_riscv_rvc_jump: - case RISCV::fixup_riscv_rvc_branch: - return 2; - } -} - void RISCVAsmBackend::applyFixup(const MCAssembler &Asm, const MCFixup &Fixup, const MCValue &Target, MutableArrayRef<char> Data, uint64_t Value, @@ -321,16 +311,13 @@ void RISCVAsmBackend::applyFixup(const MCAssembler &Asm, const MCFixup &Fixup, Value <<= Info.TargetOffset; unsigned Offset = Fixup.getOffset(); - unsigned FullSize = getSize(Fixup.getKind()); + unsigned NumBytes = alignTo(Info.TargetSize + Info.TargetOffset, 8) / 8; -#ifndef NDEBUG - unsigned NumBytes = (Info.TargetSize + 7) / 8; assert(Offset + NumBytes <= Data.size() && "Invalid fixup offset!"); -#endif // For each byte of the fragment that the fixup touches, mask in the // bits from the fixup value. - for (unsigned i = 0; i != FullSize; ++i) { + for (unsigned i = 0; i != NumBytes; ++i) { Data[Offset + i] |= uint8_t((Value >> (i * 8)) & 0xff); } } |