[lld][LoongArch] Fix handleUleb128

(cherry picked from commit a41bcb3930534ef1525b4fc30e53e818b39e2b60)
This commit is contained in:
Weining Lu 2024-03-05 23:19:16 +08:00 committed by llvmbot
parent b95ea2e51b
commit edbe7fa5fe

View File

@ -159,8 +159,9 @@ static bool isJirl(uint32_t insn) {
static void handleUleb128(uint8_t *loc, uint64_t val) { static void handleUleb128(uint8_t *loc, uint64_t val) {
const uint32_t maxcount = 1 + 64 / 7; const uint32_t maxcount = 1 + 64 / 7;
uint32_t count; uint32_t count;
uint64_t orig = decodeULEB128(loc, &count); const char *error = nullptr;
if (count > maxcount) uint64_t orig = decodeULEB128(loc, &count, nullptr, &error);
if (count > maxcount || (count == maxcount && error))
errorOrWarn(getErrorLocation(loc) + "extra space for uleb128"); errorOrWarn(getErrorLocation(loc) + "extra space for uleb128");
uint64_t mask = count < maxcount ? (1ULL << 7 * count) - 1 : -1ULL; uint64_t mask = count < maxcount ? (1ULL << 7 * count) - 1 : -1ULL;
encodeULEB128((orig + val) & mask, loc, count); encodeULEB128((orig + val) & mask, loc, count);