[PATCH] D153839: [XCOFF] Force recording a relocation for weak symbol label.
Esme Yi via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Tue Jul 4 22:58:47 PDT 2023
This revision was landed with ongoing or failed builds.
This revision was automatically updated to reflect the committed changes.
Closed by commit rG2d74cf1f2470: [XCOFF] Force recording a relocation for weak symbol label. (authored by Esme).
Changed prior to commit:
https://reviews.llvm.org/D153839?vs=534853&id=537224#toc
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D153839/new/
https://reviews.llvm.org/D153839
Files:
llvm/lib/MC/XCOFFObjectWriter.cpp
llvm/lib/Target/PowerPC/MCTargetDesc/PPCAsmBackend.cpp
llvm/test/CodeGen/PowerPC/aix-weak-reloc.ll
Index: llvm/test/CodeGen/PowerPC/aix-weak-reloc.ll
===================================================================
--- /dev/null
+++ llvm/test/CodeGen/PowerPC/aix-weak-reloc.ll
@@ -0,0 +1,46 @@
+; RUN: llc -mtriple powerpc-ibm-aix-xcoff -filetype=obj -o %t.o < %s
+; RUN: llvm-objdump -dr %t.o | FileCheck --check-prefix=OBJ32 %s
+
+; RUN: llc -mtriple powerpc64-ibm-aix-xcoff -filetype=obj -o %t.o < %s
+; RUN: llvm-objdump -dr %t.o | FileCheck --check-prefix=OBJ64 %s
+
+; Function Attrs: noinline nounwind optnone
+define i32 @main() {
+entry:
+ %retval = alloca i32, align 4
+ store i32 0, ptr %retval, align 4
+ %call = call i32 @foo()
+ ret i32 %call
+}
+
+; Function Attrs: noinline nounwind optnone
+define weak i32 @foo() {
+entry:
+ ret i32 3
+}
+
+; OBJ32: 00000000 <.main>:
+; OBJ32-NEXT: 0: 7c 08 02 a6 mflr 0
+; OBJ32-NEXT: 4: 94 21 ff c0 stwu 1, -64(1)
+; OBJ32-NEXT: 8: 38 60 00 00 li 3, 0
+; OBJ32-NEXT: c: 90 01 00 48 stw 0, 72(1)
+; OBJ32-NEXT: 10: 90 61 00 3c stw 3, 60(1)
+; OBJ32-NEXT: 14: 48 00 00 31 bl 0x44 <.foo>
+; OBJ32-NEXT: 00000014: R_RBR .foo
+; OBJ32-NEXT: 18: 60 00 00 00 nop
+; OBJ32: 00000044 <.foo>:
+; OBJ32-NEXT: 44: 38 60 00 03 li 3, 3
+; OBJ32-NEXT: 48: 4e 80 00 20 blr
+
+; OBJ64: 0000000000000000 <.main>:
+; OBJ64-NEXT: 0: 7c 08 02 a6 mflr 0
+; OBJ64-NEXT: 4: f8 21 ff 81 stdu 1, -128(1)
+; OBJ64-NEXT: 8: 38 60 00 00 li 3, 0
+; OBJ64-NEXT: c: f8 01 00 90 std 0, 144(1)
+; OBJ64-NEXT: 10: 90 61 00 7c stw 3, 124(1)
+; OBJ64-NEXT: 14: 48 00 00 31 bl 0x44 <.foo>
+; OBJ64-NEXT: 0000000000000014: R_RBR .foo
+; OBJ64-NEXT: 18: 60 00 00 00 nop
+; OBJ64: 0000000000000044 <.foo>:
+; OBJ64-NEXT: 44: 38 60 00 03 li 3, 3
+; OBJ64-NEXT: 48: 4e 80 00 20 blr
Index: llvm/lib/Target/PowerPC/MCTargetDesc/PPCAsmBackend.cpp
===================================================================
--- llvm/lib/Target/PowerPC/MCTargetDesc/PPCAsmBackend.cpp
+++ llvm/lib/Target/PowerPC/MCTargetDesc/PPCAsmBackend.cpp
@@ -19,6 +19,7 @@
#include "llvm/MC/MCSectionMachO.h"
#include "llvm/MC/MCSubtargetInfo.h"
#include "llvm/MC/MCSymbolELF.h"
+#include "llvm/MC/MCSymbolXCOFF.h"
#include "llvm/MC/MCValue.h"
#include "llvm/MC/TargetRegistry.h"
#include "llvm/Support/ErrorHandling.h"
@@ -178,7 +179,10 @@
unsigned Other = S->getOther() << 2;
if ((Other & ELF::STO_PPC64_LOCAL_MASK) != 0)
return true;
- }
+ } else if (const auto *S = dyn_cast<MCSymbolXCOFF>(&A->getSymbol())) {
+ return !Target.isAbsolute() && S->isExternal() &&
+ S->getStorageClass() == XCOFF::C_WEAKEXT;
+ }
}
return false;
}
Index: llvm/lib/MC/XCOFFObjectWriter.cpp
===================================================================
--- llvm/lib/MC/XCOFFObjectWriter.cpp
+++ llvm/lib/MC/XCOFFObjectWriter.cpp
@@ -664,10 +664,10 @@
// address, fragment offset and Fixup offset.
uint64_t BRInstrAddress =
SectionMap[ParentSec]->Address + FixupOffsetInCsect;
- // The FixedValue should be the difference between SymA csect address and BR
- // instr address plus any constant value.
- FixedValue =
- SectionMap[SymASec]->Address - BRInstrAddress + Target.getConstant();
+ // The FixedValue should be the difference between symbol's virtual address
+ // and BR instr address plus any constant value.
+ FixedValue = getVirtualAddress(SymA, SymASec) - BRInstrAddress +
+ Target.getConstant();
} else if (Type == XCOFF::RelocationType::R_REF) {
// The FixedValue and FixupOffsetInCsect should always be 0 since it
// specifies a nonrelocating reference.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D153839.537224.patch
Type: text/x-patch
Size: 3818 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20230705/668febbd/attachment.bin>
More information about the llvm-commits
mailing list