Index: lib/Target/Sparc/MCTargetDesc/SparcAsmBackend.cpp =================================================================== --- lib/Target/Sparc/MCTargetDesc/SparcAsmBackend.cpp +++ lib/Target/Sparc/MCTargetDesc/SparcAsmBackend.cpp @@ -96,6 +96,9 @@ case Sparc::fixup_sparc_tls_ie_ld: case Sparc::fixup_sparc_tls_ie_ldx: case Sparc::fixup_sparc_tls_ie_add: + case Sparc::fixup_sparc_gdop: + case Sparc::fixup_sparc_gdop_hix22: + case Sparc::fixup_sparc_gdop_lox10: return 0; } } @@ -169,7 +172,10 @@ { "fixup_sparc_tls_ie_ldx", 0, 0, 0 }, { "fixup_sparc_tls_ie_add", 0, 0, 0 }, { "fixup_sparc_tls_le_hix22", 0, 0, 0 }, - { "fixup_sparc_tls_le_lox10", 0, 0, 0 } + { "fixup_sparc_tls_le_lox10", 0, 0, 0 }, + { "fixup_sparc_gdop", 0, 0, 0 }, + { "fixup_sparc_gdop_hix22", 0, 0, 0 }, + { "fixup_sparc_gdop_lox10", 0, 0, 0 }, }; const static MCFixupKindInfo InfosLE[Sparc::NumTargetFixupKinds] = { @@ -210,7 +216,10 @@ { "fixup_sparc_tls_ie_ldx", 0, 0, 0 }, { "fixup_sparc_tls_ie_add", 0, 0, 0 }, { "fixup_sparc_tls_le_hix22", 0, 0, 0 }, - { "fixup_sparc_tls_le_lox10", 0, 0, 0 } + { "fixup_sparc_tls_le_lox10", 0, 0, 0 }, + { "fixup_sparc_gdop", 0, 0, 0 }, + { "fixup_sparc_gdop_hix22", 0, 0, 0 }, + { "fixup_sparc_gdop_lox10", 0, 0, 0 }, }; if (Kind < FirstTargetFixupKind) Index: lib/Target/Sparc/MCTargetDesc/SparcELFObjectWriter.cpp =================================================================== --- lib/Target/Sparc/MCTargetDesc/SparcELFObjectWriter.cpp +++ lib/Target/Sparc/MCTargetDesc/SparcELFObjectWriter.cpp @@ -108,6 +108,9 @@ case Sparc::fixup_sparc_tls_ie_add: return ELF::R_SPARC_TLS_IE_ADD; case Sparc::fixup_sparc_tls_le_hix22: return ELF::R_SPARC_TLS_LE_HIX22; case Sparc::fixup_sparc_tls_le_lox10: return ELF::R_SPARC_TLS_LE_LOX10; + case Sparc::fixup_sparc_gdop: return ELF::R_SPARC_GOTDATA_OP; + case Sparc::fixup_sparc_gdop_hix22: return ELF::R_SPARC_GOTDATA_OP_HIX22; + case Sparc::fixup_sparc_gdop_lox10: return ELF::R_SPARC_GOTDATA_OP_LOX10; } return ELF::R_SPARC_NONE; Index: lib/Target/Sparc/MCTargetDesc/SparcFixupKinds.h =================================================================== --- lib/Target/Sparc/MCTargetDesc/SparcFixupKinds.h +++ lib/Target/Sparc/MCTargetDesc/SparcFixupKinds.h @@ -93,6 +93,11 @@ fixup_sparc_tls_le_hix22, fixup_sparc_tls_le_lox10, + /// fixups for GOTdata_op model + fixup_sparc_gdop_hix22, + fixup_sparc_gdop_lox10, + fixup_sparc_gdop, + // Marker LastTargetFixupKind, NumTargetFixupKinds = LastTargetFixupKind - FirstTargetFixupKind Index: lib/Target/Sparc/MCTargetDesc/SparcMCExpr.h =================================================================== --- lib/Target/Sparc/MCTargetDesc/SparcMCExpr.h +++ lib/Target/Sparc/MCTargetDesc/SparcMCExpr.h @@ -57,7 +57,10 @@ VK_Sparc_TLS_IE_LDX, VK_Sparc_TLS_IE_ADD, VK_Sparc_TLS_LE_HIX22, - VK_Sparc_TLS_LE_LOX10 + VK_Sparc_TLS_LE_LOX10, + VK_Sparc_GDOP_HIX22, + VK_Sparc_GDOP_LOX10, + VK_Sparc_GDOP, }; private: Index: lib/Target/Sparc/MCTargetDesc/SparcMCExpr.cpp =================================================================== --- lib/Target/Sparc/MCTargetDesc/SparcMCExpr.cpp +++ lib/Target/Sparc/MCTargetDesc/SparcMCExpr.cpp @@ -80,6 +80,9 @@ case VK_Sparc_TLS_IE_ADD: OS << "%tie_add("; break; case VK_Sparc_TLS_LE_HIX22: OS << "%tle_hix22("; break; case VK_Sparc_TLS_LE_LOX10: OS << "%tle_lox10("; break; + case VK_Sparc_GDOP_HIX22: OS << "%gdop_hix22("; break; + case VK_Sparc_GDOP_LOX10: OS << "%gdop_lox10("; break; + case VK_Sparc_GDOP: OS << "%gdop("; break; } return closeParen; } @@ -118,6 +121,9 @@ .Case("tie_add", VK_Sparc_TLS_IE_ADD) .Case("tle_hix22", VK_Sparc_TLS_LE_HIX22) .Case("tle_lox10", VK_Sparc_TLS_LE_LOX10) + .Case("gdop_hix22", VK_Sparc_GDOP_HIX22) + .Case("gdop_lox10", VK_Sparc_GDOP_LOX10) + .Case("gdop", VK_Sparc_GDOP) .Default(VK_Sparc_None); } @@ -156,6 +162,9 @@ case VK_Sparc_TLS_IE_ADD: return Sparc::fixup_sparc_tls_ie_add; case VK_Sparc_TLS_LE_HIX22: return Sparc::fixup_sparc_tls_le_hix22; case VK_Sparc_TLS_LE_LOX10: return Sparc::fixup_sparc_tls_le_lox10; + case VK_Sparc_GDOP_HIX22: return Sparc::fixup_sparc_gdop_hix22; + case VK_Sparc_GDOP_LOX10: return Sparc::fixup_sparc_gdop_lox10; + case VK_Sparc_GDOP: return Sparc::fixup_sparc_gdop; } } Index: test/MC/Sparc/sparc-pic.s =================================================================== --- test/MC/Sparc/sparc-pic.s +++ test/MC/Sparc/sparc-pic.s @@ -16,6 +16,9 @@ ! PIC-NEXT: 0x{{[0-9,A-F]+}} R_SPARC_GOT10 .LC0 0x0 ! PIC-NEXT: 0x{{[0-9,A-F]+}} R_SPARC_WPLT30 bar 0x0 ! PIC: 0x{{[0-9,A-F]+}} R_SPARC_GOT13 value 0x0 +! PIC: 0x{{[0-9,A-F]+}} R_SPARC_GOTDATA_OP_HIX22 AGlobalVar 0x0 +! PIC: 0x{{[0-9,A-F]+}} R_SPARC_GOTDATA_OP_LOX10 AGlobalVar 0x0 +! PIC: 0x{{[0-9,A-F]+}} R_SPARC_GOTDATA_OP AGlobalVar 0x0 ! PIC: ] ! NOPIC: Relocations [ @@ -101,3 +104,21 @@ restore .Lfunc_end0: .size pic13, .Lfunc_end0-pic13 + +! Test GOTdata_op model relocations + +gotdataop: + save %sp, -128, %sp +.Ltmpg0: + call .Ltmpg1 +.Ltmpg2: + sethi %hi(_GLOBAL_OFFSET_TABLE_+(.Ltmpg2-.Ltmpg0)), %i0 +.Ltmpg1: + or %i0, %lo(_GLOBAL_OFFSET_TABLE_+(.Ltmpg1-.Ltmpg0)), %i0 + add %i0, %o7, %i0 + sethi %gdop_hix22(AGlobalVar), %i1 + xor %i1, %gdop_lox10(AGlobalVar), %i1 + ld [%i0+%i1], %i0, %gdop(AGlobalVar) + ldsw [%i0], %i0 + ret + restore