[Constants] Handle ptrtoaddr in getRelocationInfo()

Treat it the same way as ptrtoint.
This commit is contained in:
Nikita Popov 2025-10-13 15:31:40 +02:00
parent c0fb07c2da
commit 44463630f1
2 changed files with 20 additions and 2 deletions

View File

@ -667,8 +667,11 @@ Constant::PossibleRelocationsTy Constant::getRelocationInfo() const {
if (CE->getOpcode() == Instruction::Sub) {
ConstantExpr *LHS = dyn_cast<ConstantExpr>(CE->getOperand(0));
ConstantExpr *RHS = dyn_cast<ConstantExpr>(CE->getOperand(1));
if (LHS && RHS && LHS->getOpcode() == Instruction::PtrToInt &&
RHS->getOpcode() == Instruction::PtrToInt) {
if (LHS && RHS &&
(LHS->getOpcode() == Instruction::PtrToInt ||
LHS->getOpcode() == Instruction::PtrToAddr) &&
(RHS->getOpcode() == Instruction::PtrToInt ||
RHS->getOpcode() == Instruction::PtrToAddr)) {
Constant *LHSOp0 = LHS->getOperand(0);
Constant *RHSOp0 = RHS->getOperand(0);

View File

@ -10,16 +10,31 @@ target triple = "x86_64-unknown-linux-gnu"
; CHECK: .long hidden-rodata
@rodata = hidden constant i32 trunc (i64 sub (i64 ptrtoint (ptr @hidden to i64), i64 ptrtoint (ptr @rodata to i64)) to i32)
; CHECK: .section .rodata.rodata_ptrtoaddr
; CHECK: rodata_ptrtoaddr:
; CHECK: .long hidden-rodata_ptrtoaddr
@rodata_ptrtoaddr = hidden constant i32 trunc (i64 sub (i64 ptrtoaddr (ptr @hidden to i64), i64 ptrtoaddr (ptr @rodata_ptrtoaddr to i64)) to i32)
; CHECK: .section .data.rel.ro.relro1
; CHECK: relro1:
; CHECK: .long default-relro1
@relro1 = hidden constant i32 trunc (i64 sub (i64 ptrtoint (ptr @default to i64), i64 ptrtoint (ptr @relro1 to i64)) to i32)
; CHECK: .section .data.rel.ro.relro1_ptrtoaddr
; CHECK: relro1_ptrtoaddr:
; CHECK: .long default-relro1_ptrtoaddr
@relro1_ptrtoaddr = hidden constant i32 trunc (i64 sub (i64 ptrtoaddr (ptr @default to i64), i64 ptrtoaddr (ptr @relro1_ptrtoaddr to i64)) to i32)
; CHECK: .section .data.rel.ro.relro2
; CHECK: relro2:
; CHECK: .long hidden-relro2
@relro2 = constant i32 trunc (i64 sub (i64 ptrtoint (ptr @hidden to i64), i64 ptrtoint (ptr @relro2 to i64)) to i32)
; CHECK: .section .data.rel.ro.relro2_ptrtoaddr
; CHECK: relro2_ptrtoaddr:
; CHECK: .long hidden-relro2_ptrtoaddr
@relro2_ptrtoaddr = constant i32 trunc (i64 sub (i64 ptrtoaddr (ptr @hidden to i64), i64 ptrtoaddr (ptr @relro2_ptrtoaddr to i64)) to i32)
; CHECK: .section .rodata.obj
; CHECK-NEXT: .globl obj
; CHECK: obj: