Skip to content

Commit 0237357

Browse files
committed
[RelLookupTableConverter] Drop unnamed_addr to avoid generating GOTPCREL relocations
1 parent ffa4343 commit 0237357

File tree

2 files changed

+19
-14
lines changed

2 files changed

+19
-14
lines changed

llvm/lib/Transforms/Utils/RelLookupTableConverter.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,11 @@ static GlobalVariable *createRelLookupTable(Function &Func,
110110

111111
for (Use &Operand : LookupTableArr->operands()) {
112112
Constant *Element = cast<Constant>(Operand);
113+
// Drop unnamed_addr to avoid matching pattern in
114+
// `handleIndirectSymViaGOTPCRel`, which creates GOTPCREL relocations not
115+
// supported by the GNU linker and LLD versions below 18 on aarch64.
116+
if (auto *GlobalElement = dyn_cast<GlobalValue>(Element))
117+
GlobalElement->setUnnamedAddr(GlobalValue::UnnamedAddr::None);
113118
Type *IntPtrTy = M.getDataLayout().getIntPtrType(M.getContext());
114119
Constant *Base = llvm::ConstantExpr::getPtrToInt(RelLookupTable, IntPtrTy);
115120
Constant *Target = llvm::ConstantExpr::getPtrToInt(Element, IntPtrTy);

llvm/test/Transforms/RelLookupTableConverter/unnamed_addr.ll

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -18,32 +18,32 @@
1818
@load_relative_2.table = private unnamed_addr constant [4 x ptr] [ptr @y3, ptr @y2, ptr @y1, ptr @y0]
1919

2020
;.
21-
; x86_64: @a0 = private unnamed_addr constant i32 0
22-
; x86_64: @a1 = private unnamed_addr constant i32 1
23-
; x86_64: @a2 = private unnamed_addr constant i32 2
21+
; x86_64: @a0 = private constant i32 0
22+
; x86_64: @a1 = private constant i32 1
23+
; x86_64: @a2 = private constant i32 2
2424
; x86_64: @load_relative_1.table.rel = private unnamed_addr constant [3 x i32] [i32 trunc (i64 sub (i64 ptrtoint (ptr @a0 to i64), i64 ptrtoint (ptr @load_relative_1.table.rel to i64)) to i32), i32 trunc (i64 sub (i64 ptrtoint (ptr @a1 to i64), i64 ptrtoint (ptr @load_relative_1.table.rel to i64)) to i32), i32 trunc (i64 sub (i64 ptrtoint (ptr @a2 to i64), i64 ptrtoint (ptr @load_relative_1.table.rel to i64)) to i32)], align 4
2525
; x86_64: @x0 = internal unnamed_addr constant i64 0
2626
; x86_64: @x1 = internal unnamed_addr constant i64 1
2727
; x86_64: @x2 = internal unnamed_addr constant i64 2
2828
; x86_64: @x3 = internal unnamed_addr constant i64 3
29-
; x86_64: @y0 = internal unnamed_addr constant ptr @x3
30-
; x86_64: @y1 = internal unnamed_addr constant ptr @x2
31-
; x86_64: @y2 = internal unnamed_addr constant ptr @x1
32-
; x86_64: @y3 = internal unnamed_addr constant ptr @x0
29+
; x86_64: @y0 = internal constant ptr @x3
30+
; x86_64: @y1 = internal constant ptr @x2
31+
; x86_64: @y2 = internal constant ptr @x1
32+
; x86_64: @y3 = internal constant ptr @x0
3333
; x86_64: @load_relative_2.table.rel = private unnamed_addr constant [4 x i32] [i32 trunc (i64 sub (i64 ptrtoint (ptr @y3 to i64), i64 ptrtoint (ptr @load_relative_2.table.rel to i64)) to i32), i32 trunc (i64 sub (i64 ptrtoint (ptr @y2 to i64), i64 ptrtoint (ptr @load_relative_2.table.rel to i64)) to i32), i32 trunc (i64 sub (i64 ptrtoint (ptr @y1 to i64), i64 ptrtoint (ptr @load_relative_2.table.rel to i64)) to i32), i32 trunc (i64 sub (i64 ptrtoint (ptr @y0 to i64), i64 ptrtoint (ptr @load_relative_2.table.rel to i64)) to i32)], align 4
3434
;.
35-
; aarch64: @a0 = private unnamed_addr constant i32 0
36-
; aarch64: @a1 = private unnamed_addr constant i32 1
37-
; aarch64: @a2 = private unnamed_addr constant i32 2
35+
; aarch64: @a0 = private constant i32 0
36+
; aarch64: @a1 = private constant i32 1
37+
; aarch64: @a2 = private constant i32 2
3838
; aarch64: @load_relative_1.table.rel = private unnamed_addr constant [3 x i32] [i32 trunc (i64 sub (i64 ptrtoint (ptr @a0 to i64), i64 ptrtoint (ptr @load_relative_1.table.rel to i64)) to i32), i32 trunc (i64 sub (i64 ptrtoint (ptr @a1 to i64), i64 ptrtoint (ptr @load_relative_1.table.rel to i64)) to i32), i32 trunc (i64 sub (i64 ptrtoint (ptr @a2 to i64), i64 ptrtoint (ptr @load_relative_1.table.rel to i64)) to i32)], align 4
3939
; aarch64: @x0 = internal unnamed_addr constant i64 0
4040
; aarch64: @x1 = internal unnamed_addr constant i64 1
4141
; aarch64: @x2 = internal unnamed_addr constant i64 2
4242
; aarch64: @x3 = internal unnamed_addr constant i64 3
43-
; aarch64: @y0 = internal unnamed_addr constant ptr @x3
44-
; aarch64: @y1 = internal unnamed_addr constant ptr @x2
45-
; aarch64: @y2 = internal unnamed_addr constant ptr @x1
46-
; aarch64: @y3 = internal unnamed_addr constant ptr @x0
43+
; aarch64: @y0 = internal constant ptr @x3
44+
; aarch64: @y1 = internal constant ptr @x2
45+
; aarch64: @y2 = internal constant ptr @x1
46+
; aarch64: @y3 = internal constant ptr @x0
4747
; aarch64: @load_relative_2.table.rel = private unnamed_addr constant [4 x i32] [i32 trunc (i64 sub (i64 ptrtoint (ptr @y3 to i64), i64 ptrtoint (ptr @load_relative_2.table.rel to i64)) to i32), i32 trunc (i64 sub (i64 ptrtoint (ptr @y2 to i64), i64 ptrtoint (ptr @load_relative_2.table.rel to i64)) to i32), i32 trunc (i64 sub (i64 ptrtoint (ptr @y1 to i64), i64 ptrtoint (ptr @load_relative_2.table.rel to i64)) to i32), i32 trunc (i64 sub (i64 ptrtoint (ptr @y0 to i64), i64 ptrtoint (ptr @load_relative_2.table.rel to i64)) to i32)], align 4
4848
;.
4949
define ptr @load_relative_1(i64 %offset) {

0 commit comments

Comments
 (0)