aboutsummaryrefslogtreecommitdiff
path: root/contrib/llvm-project/llvm/lib/Target/PowerPC/MCTargetDesc/PPCXCOFFObjectWriter.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/llvm-project/llvm/lib/Target/PowerPC/MCTargetDesc/PPCXCOFFObjectWriter.cpp')
-rw-r--r--contrib/llvm-project/llvm/lib/Target/PowerPC/MCTargetDesc/PPCXCOFFObjectWriter.cpp23
1 files changed, 20 insertions, 3 deletions
diff --git a/contrib/llvm-project/llvm/lib/Target/PowerPC/MCTargetDesc/PPCXCOFFObjectWriter.cpp b/contrib/llvm-project/llvm/lib/Target/PowerPC/MCTargetDesc/PPCXCOFFObjectWriter.cpp
index 64e11dbc1efc..729cb35cbebc 100644
--- a/contrib/llvm-project/llvm/lib/Target/PowerPC/MCTargetDesc/PPCXCOFFObjectWriter.cpp
+++ b/contrib/llvm-project/llvm/lib/Target/PowerPC/MCTargetDesc/PPCXCOFFObjectWriter.cpp
@@ -71,6 +71,19 @@ std::pair<uint8_t, uint8_t> PPCXCOFFObjectWriter::getRelocTypeAndSignSize(
return {XCOFF::RelocationType::R_TOCL, SignAndSizeForHalf16};
}
} break;
+ case PPC::fixup_ppc_half16ds:
+ case PPC::fixup_ppc_half16dq: {
+ if (IsPCRel)
+ report_fatal_error("Invalid PC-relative relocation.");
+ switch (Modifier) {
+ default:
+ llvm_unreachable("Unsupported Modifier");
+ case MCSymbolRefExpr::VK_None:
+ return {XCOFF::RelocationType::R_TOC, 15};
+ case MCSymbolRefExpr::VK_PPC_L:
+ return {XCOFF::RelocationType::R_TOCL, 15};
+ }
+ } break;
case PPC::fixup_ppc_br24:
// Branches are 4 byte aligned, so the 24 bits we encode in
// the instruction actually represents a 26 bit offset.
@@ -78,15 +91,19 @@ std::pair<uint8_t, uint8_t> PPCXCOFFObjectWriter::getRelocTypeAndSignSize(
case PPC::fixup_ppc_br24abs:
return {XCOFF::RelocationType::R_RBA, EncodedSignednessIndicator | 25};
case FK_Data_4:
+ case FK_Data_8:
+ const uint8_t SignAndSizeForFKData =
+ EncodedSignednessIndicator |
+ ((unsigned)Fixup.getKind() == FK_Data_4 ? 31 : 63);
switch (Modifier) {
default:
report_fatal_error("Unsupported modifier");
case MCSymbolRefExpr::VK_PPC_AIX_TLSGD:
- return {XCOFF::RelocationType::R_TLS, EncodedSignednessIndicator | 31};
+ return {XCOFF::RelocationType::R_TLS, SignAndSizeForFKData};
case MCSymbolRefExpr::VK_PPC_AIX_TLSGDM:
- return {XCOFF::RelocationType::R_TLSM, EncodedSignednessIndicator | 31};
+ return {XCOFF::RelocationType::R_TLSM, SignAndSizeForFKData};
case MCSymbolRefExpr::VK_None:
- return {XCOFF::RelocationType::R_POS, EncodedSignednessIndicator | 31};
+ return {XCOFF::RelocationType::R_POS, SignAndSizeForFKData};
}
}
}