Skip to content

Commit f5e6fba

Browse files
committed
[AArch64] [Windows] Error out on unsupported symbol locations
These might occur in seemingly generic assembly. Previously when targeting COFF, they were silently ignored, which certainly won't give the right result. Instead clearly error out, to make it clear that the assembly needs to be adjusted for this target. Also change a preexisting report_fatal_error into a proper error message, pointing out the offending source instruction. This isn't strictly an internal error, as it can be triggered by user input. Differential Revision: https://reviews.llvm.org/D85242
1 parent 5eedc01 commit f5e6fba

File tree

2 files changed

+69
-2
lines changed

2 files changed

+69
-2
lines changed

llvm/lib/Target/AArch64/MCTargetDesc/AArch64WinCOFFObjectWriter.cpp

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
#include "llvm/ADT/Twine.h"
1212
#include "llvm/BinaryFormat/COFF.h"
1313
#include "llvm/MC/MCAsmBackend.h"
14+
#include "llvm/MC/MCContext.h"
1415
#include "llvm/MC/MCExpr.h"
1516
#include "llvm/MC/MCFixup.h"
1617
#include "llvm/MC/MCFixupKindInfo.h"
@@ -48,10 +49,33 @@ unsigned AArch64WinCOFFObjectWriter::getRelocType(
4849
: Target.getSymA()->getKind();
4950
const MCExpr *Expr = Fixup.getValue();
5051

52+
if (const AArch64MCExpr *A64E = dyn_cast<AArch64MCExpr>(Expr)) {
53+
AArch64MCExpr::VariantKind RefKind = A64E->getKind();
54+
switch (AArch64MCExpr::getSymbolLoc(RefKind)) {
55+
case AArch64MCExpr::VK_ABS:
56+
case AArch64MCExpr::VK_SECREL:
57+
// Supported
58+
break;
59+
default:
60+
Ctx.reportError(Fixup.getLoc(), "relocation variant " +
61+
A64E->getVariantKindName() +
62+
" unsupported on COFF targets");
63+
return COFF::IMAGE_REL_ARM64_ABSOLUTE; // Dummy return value
64+
}
65+
}
66+
5167
switch (static_cast<unsigned>(Fixup.getKind())) {
5268
default: {
53-
const MCFixupKindInfo &Info = MAB.getFixupKindInfo(Fixup.getKind());
54-
report_fatal_error(Twine("unsupported relocation type: ") + Info.Name);
69+
if (const AArch64MCExpr *A64E = dyn_cast<AArch64MCExpr>(Expr)) {
70+
Ctx.reportError(Fixup.getLoc(), "relocation type " +
71+
A64E->getVariantKindName() +
72+
" unsupported on COFF targets");
73+
} else {
74+
const MCFixupKindInfo &Info = MAB.getFixupKindInfo(Fixup.getKind());
75+
Ctx.reportError(Fixup.getLoc(), Twine("relocation type ") + Info.Name +
76+
" unsupported on COFF targets");
77+
}
78+
return COFF::IMAGE_REL_ARM64_ABSOLUTE; // Dummy return value
5579
}
5680

5781
case FK_Data_4:
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
// RUN: not llvm-mc -triple aarch64-win32 -filetype=obj %s -o /dev/null 2>&1 | FileCheck %s
2+
3+
adrp x0, :got:symbol
4+
// CHECK: error: relocation variant :got: unsupported on COFF targets
5+
// CHECK-NEXT: adrp x0, :got:symbol
6+
// CHECK-NEXT: ^
7+
8+
ldr x0, [x0, :got_lo12:symbol]
9+
// CHECK: error: relocation variant :got_lo12: unsupported on COFF targets
10+
// CHECK-NEXT: ldr x0, [x0, :got_lo12:symbol]
11+
// CHECK-NEXT: ^
12+
13+
adrp x0, :tlsdesc:symbol
14+
// CHECK: error: relocation variant :tlsdesc: unsupported on COFF targets
15+
// CHECK-NEXT: adrp x0, :tlsdesc:symbol
16+
// CHECK-NEXT: ^
17+
add x0, x0, :tlsdesc_lo12:symbol
18+
// CHECK: error: relocation variant :tlsdesc_lo12: unsupported on COFF targets
19+
// CHECK-NEXT: add x0, x0, :tlsdesc_lo12:symbol
20+
// CHECK-NEXT: ^
21+
22+
adrp x0, :gottprel:symbol
23+
// CHECK: error: relocation variant :gottprel: unsupported on COFF targets
24+
// CHECK-NEXT: adrp x0, :gottprel:symbol
25+
// CHECK-NEXT: ^
26+
ldr x0, [x0, :gottprel_lo12:symbol]
27+
// CHECK: error: relocation variant :gottprel_lo12: unsupported on COFF targets
28+
// CHECK-NEXT: ldr x0, [x0, :gottprel_lo12:symbol]
29+
// CHECK-NEXT: ^
30+
31+
add x0, x0, #:dtprel_hi12:symbol, lsl #12
32+
// CHECK: error: relocation variant :dtprel_hi12: unsupported on COFF targets
33+
// CHECK-NEXT: add x0, x0, #:dtprel_hi12:symbol, lsl #12
34+
// CHECK-NEXT: ^
35+
add x0, x0, :dtprel_lo12:symbol
36+
// CHECK: error: relocation variant :dtprel_lo12: unsupported on COFF targets
37+
// CHECK-NEXT: add x0, x0, :dtprel_lo12:symbol
38+
// CHECK-NEXT: ^
39+
40+
movz x0, #:abs_g0:symbol
41+
// CHECK: error: relocation type :abs_g0: unsupported on COFF targets
42+
// CHECK-NEXT: movz x0, #:abs_g0:symbol
43+
// CHECK-NEXT: ^

0 commit comments

Comments
 (0)