Commit 9c8b896a authored by Hans Wennborg's avatar Hans Wennborg
Browse files

Merging r368964:

------------------------------------------------------------------------
r368964 | maskray | 2019-08-15 07:22:23 +0200 (Thu, 15 Aug 2019) | 11 lines

[ELF][PPC] Improve error message for unknown relocations

Like rLLD354040.

Previously, for unrecognized relocation types, in -no-pie mode:

  foo.o: unrecognized reloc 256

In -pie/-shared mode:

  error: can't create dynamic relocation R_PPC_xxx against symbol: yyy in readonly segment
------------------------------------------------------------------------

llvm-svn: 370312
parent 44b3f672
Loading
Loading
Loading
Loading
+11 −2
Original line number Diff line number Diff line
@@ -190,6 +190,13 @@ bool PPC::inBranchRange(RelType type, uint64_t src, uint64_t dst) const {
RelExpr PPC::getRelExpr(RelType type, const Symbol &s,
                        const uint8_t *loc) const {
  switch (type) {
  case R_PPC_NONE:
    return R_NONE;
  case R_PPC_ADDR16_HA:
  case R_PPC_ADDR16_HI:
  case R_PPC_ADDR16_LO:
  case R_PPC_ADDR32:
    return R_ABS;
  case R_PPC_DTPREL16:
  case R_PPC_DTPREL16_HA:
  case R_PPC_DTPREL16_HI:
@@ -227,7 +234,9 @@ RelExpr PPC::getRelExpr(RelType type, const Symbol &s,
  case R_PPC_TPREL16_HI:
    return R_TLS;
  default:
    return R_ABS;
    error(getErrorLocation(loc) + "unknown relocation (" + Twine(type) +
          ") against symbol " + toString(s));
    return R_NONE;
  }
}

@@ -319,7 +328,7 @@ void PPC::relocateOne(uint8_t *loc, RelType type, uint64_t val) const {
    break;
  }
  default:
    error(getErrorLocation(loc) + "unrecognized relocation " + toString(type));
    llvm_unreachable("unknown relocation");
  }
}

+19 −2
Original line number Diff line number Diff line
@@ -532,6 +532,21 @@ void PPC64::relaxTlsIeToLe(uint8_t *loc, RelType type, uint64_t val) const {
RelExpr PPC64::getRelExpr(RelType type, const Symbol &s,
                          const uint8_t *loc) const {
  switch (type) {
  case R_PPC64_NONE:
    return R_NONE;
  case R_PPC64_ADDR16:
  case R_PPC64_ADDR16_DS:
  case R_PPC64_ADDR16_HA:
  case R_PPC64_ADDR16_HI:
  case R_PPC64_ADDR16_HIGHER:
  case R_PPC64_ADDR16_HIGHERA:
  case R_PPC64_ADDR16_HIGHEST:
  case R_PPC64_ADDR16_HIGHESTA:
  case R_PPC64_ADDR16_LO:
  case R_PPC64_ADDR16_LO_DS:
  case R_PPC64_ADDR32:
  case R_PPC64_ADDR64:
    return R_ABS;
  case R_PPC64_GOT16:
  case R_PPC64_GOT16_DS:
  case R_PPC64_GOT16_HA:
@@ -607,7 +622,9 @@ RelExpr PPC64::getRelExpr(RelType type, const Symbol &s,
  case R_PPC64_TLS:
    return R_TLSIE_HINT;
  default:
    return R_ABS;
    error(getErrorLocation(loc) + "unknown relocation (" + Twine(type) +
          ") against symbol " + toString(s));
    return R_NONE;
  }
}

@@ -870,7 +887,7 @@ void PPC64::relocateOne(uint8_t *loc, RelType type, uint64_t val) const {
    write64(loc, val - dynamicThreadPointerOffset);
    break;
  default:
    error(getErrorLocation(loc) + "unrecognized relocation " + toString(type));
    llvm_unreachable("unknown relocation");
  }
}