From b127771f7d2972acad81550e03cc4e1e3c1fcd1c Mon Sep 17 00:00:00 2001 From: Fangrui Song Date: Mon, 19 Aug 2019 07:59:35 +0000 Subject: [PATCH] [MC] Delete unnecessary diagnostic: "No relocation available to represent this relative expression" Replace - error: No relocation available to represent this relative expression with + error: symbol 'undef' can not be undefined in a subtraction expression or + error: Cannot represent a difference across sections Keep !IsPcRel as an assertion after the two diagnostic checks are done. llvm-svn: 369239 --- llvm/lib/MC/ELFObjectWriter.cpp | 16 +--------------- llvm/test/MC/AArch64/adr-diagnostics.s | 4 ++-- llvm/test/MC/AArch64/error-location.s | 2 +- llvm/test/MC/ARM/error-location.s | 2 +- llvm/test/MC/ELF/bad-expr2.s | 2 +- 5 files changed, 6 insertions(+), 20 deletions(-) diff --git a/llvm/lib/MC/ELFObjectWriter.cpp b/llvm/lib/MC/ELFObjectWriter.cpp index 111ba3f..97607b4 100644 --- a/llvm/lib/MC/ELFObjectWriter.cpp +++ b/llvm/lib/MC/ELFObjectWriter.cpp @@ -1441,22 +1441,7 @@ void ELFObjectWriter::recordRelocation(MCAssembler &Asm, MCContext &Ctx = Asm.getContext(); if (const MCSymbolRefExpr *RefB = Target.getSymB()) { - // Let A, B and C being the components of Target and R be the location of - // the fixup. If the fixup is not pcrel, we want to compute (A - B + C). - // If it is pcrel, we want to compute (A - B + C - R). - - // In general, ELF has no relocations for -B. It can only represent (A + C) - // or (A + C - R). If B = R + K and the relocation is not pcrel, we can - // replace B to implement it: (A - R - K + C) - if (IsPCRel) { - Ctx.reportError( - Fixup.getLoc(), - "No relocation available to represent this relative expression"); - return; - } - const auto &SymB = cast(RefB->getSymbol()); - if (SymB.isUndefined()) { Ctx.reportError(Fixup.getLoc(), Twine("symbol '") + SymB.getName() + @@ -1474,6 +1459,7 @@ void ELFObjectWriter::recordRelocation(MCAssembler &Asm, uint64_t SymBOffset = Layout.getSymbolOffset(SymB); uint64_t K = SymBOffset - FixupOffset; + assert(!IsPCRel && "should have been folded"); IsPCRel = true; C -= K; } diff --git a/llvm/test/MC/AArch64/adr-diagnostics.s b/llvm/test/MC/AArch64/adr-diagnostics.s index 3ca1681..ef9b07a 100644 --- a/llvm/test/MC/AArch64/adr-diagnostics.s +++ b/llvm/test/MC/AArch64/adr-diagnostics.s @@ -17,7 +17,7 @@ // CHECK-NEXT: adr x3, (end + start) // CHECK-NEXT: ^ adr x4, #(end - start) -// CHECK: error: No relocation available to represent this relative expression +// CHECK: error: symbol 'start' can not be undefined in a subtraction expression // CHECK-NEXT: adr x4, #(end - start) // CHECK-NEXT: ^ @@ -38,6 +38,6 @@ // CHECK-NEXT: adrp x3, (end + start) // CHECK-NEXT: ^ adrp x4, #(end - start) -// CHECK: error: No relocation available to represent this relative expression +// CHECK: error: symbol 'start' can not be undefined in a subtraction expression // CHECK-NEXT: adrp x4, #(end - start) // CHECK-NEXT: ^ diff --git a/llvm/test/MC/AArch64/error-location.s b/llvm/test/MC/AArch64/error-location.s index a8f9a7df..f870b04 100644 --- a/llvm/test/MC/AArch64/error-location.s +++ b/llvm/test/MC/AArch64/error-location.s @@ -10,7 +10,7 @@ // CHECK: :[[@LINE+1]]:{{[0-9]+}}: error: expected relocatable expression .word -undef -// CHECK: :[[@LINE+1]]:{{[0-9]+}}: error: No relocation available to represent this relative expression +// CHECK: :[[@LINE+1]]:{{[0-9]+}}: error: symbol 'undef' can not be undefined in a subtraction expression adr x0, #a-undef // CHECK: :[[@LINE+1]]:{{[0-9]+}}: error: Cannot represent a difference across sections diff --git a/llvm/test/MC/ARM/error-location.s b/llvm/test/MC/ARM/error-location.s index 652de29..29bb5fe 100644 --- a/llvm/test/MC/ARM/error-location.s +++ b/llvm/test/MC/ARM/error-location.s @@ -10,7 +10,7 @@ @ CHECK: :[[@LINE+1]]:{{[0-9]+}}: error: expected relocatable expression .word -undef -@ CHECK: :[[@LINE+1]]:{{[0-9]+}}: error: No relocation available to represent this relative expression +@ CHECK: :[[@LINE+1]]:{{[0-9]+}}: error: symbol 'undef' can not be undefined in a subtraction expression adr r0, #a-undef @ CHECK: :[[@LINE+1]]:{{[0-9]+}}: error: Cannot represent a difference across sections diff --git a/llvm/test/MC/ELF/bad-expr2.s b/llvm/test/MC/ELF/bad-expr2.s index dad7431..1ca8e90 100644 --- a/llvm/test/MC/ELF/bad-expr2.s +++ b/llvm/test/MC/ELF/bad-expr2.s @@ -1,7 +1,7 @@ // RUN: not llvm-mc -filetype=obj -triple x86_64-pc-linux-gnu %s -o /dev/null \ // RUN: 2>&1 | FileCheck %s -// CHECK: [[@LINE+2]]:{{[0-9]+}}: error: No relocation available to represent this relative expression +// CHECK: [[@LINE+2]]:{{[0-9]+}}: error: Cannot represent a difference across sections // CHECK-NEXT: call foo - bar call foo - bar -- 2.7.4