Index: llvm/lib/Target/Sparc/MCTargetDesc/SparcAsmBackend.cpp =================================================================== --- llvm/lib/Target/Sparc/MCTargetDesc/SparcAsmBackend.cpp +++ llvm/lib/Target/Sparc/MCTargetDesc/SparcAsmBackend.cpp @@ -46,6 +46,9 @@ case Sparc::fixup_sparc_br16_14: return (Value >> 2) & 0x3fff; + case Sparc::fixup_sparc_hix22: + return (~Value >> 10) & 0x3fffff; + case Sparc::fixup_sparc_pc22: case Sparc::fixup_sparc_got22: case Sparc::fixup_sparc_tls_gd_hi22: @@ -59,6 +62,9 @@ case Sparc::fixup_sparc_13: return Value & 0x1fff; + case Sparc::fixup_sparc_lox10: + return (Value & 0x3ff) | 0x1c00; + case Sparc::fixup_sparc_pc10: case Sparc::fixup_sparc_got10: case Sparc::fixup_sparc_tls_gd_lo10: @@ -97,6 +103,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_gotdata_lox10: + case Sparc::fixup_sparc_gotdata_hix22: + case Sparc::fixup_sparc_gotdata_op: return 0; } } @@ -171,7 +180,12 @@ { "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_hix22", 10, 22, 0 }, + { "fixup_sparc_lox10", 19, 13, 0 }, + { "fixup_sparc_gotdata_hix22", 0, 0, 0 }, + { "fixup_sparc_gotdata_lox10", 0, 0, 0 }, + { "fixup_sparc_gotdata_op", 0, 0, 0 }, }; const static MCFixupKindInfo InfosLE[Sparc::NumTargetFixupKinds] = { @@ -213,7 +227,12 @@ { "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_hix22", 0, 22, 0 }, + { "fixup_sparc_lox10", 0, 13, 0 }, + { "fixup_sparc_gotdata_hix22", 0, 0, 0 }, + { "fixup_sparc_gotdata_lox10", 0, 0, 0 }, + { "fixup_sparc_gotdata_op", 0, 0, 0 }, }; if (Kind < FirstTargetFixupKind) Index: llvm/lib/Target/Sparc/MCTargetDesc/SparcELFObjectWriter.cpp =================================================================== --- llvm/lib/Target/Sparc/MCTargetDesc/SparcELFObjectWriter.cpp +++ llvm/lib/Target/Sparc/MCTargetDesc/SparcELFObjectWriter.cpp @@ -108,6 +108,11 @@ 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_hix22: return ELF::R_SPARC_HIX22; + case Sparc::fixup_sparc_lox10: return ELF::R_SPARC_LOX10; + case Sparc::fixup_sparc_gotdata_hix22: return ELF::R_SPARC_GOTDATA_HIX22; + case Sparc::fixup_sparc_gotdata_lox10: return ELF::R_SPARC_GOTDATA_LOX10; + case Sparc::fixup_sparc_gotdata_op: return ELF::R_SPARC_GOTDATA_OP; } return ELF::R_SPARC_NONE; Index: llvm/lib/Target/Sparc/MCTargetDesc/SparcFixupKinds.h =================================================================== --- llvm/lib/Target/Sparc/MCTargetDesc/SparcFixupKinds.h +++ llvm/lib/Target/Sparc/MCTargetDesc/SparcFixupKinds.h @@ -95,6 +95,18 @@ fixup_sparc_tls_le_hix22, fixup_sparc_tls_le_lox10, + /// 22-bit fixup corresponding to %hix(foo) + fixup_sparc_hix22, + /// 13-bit fixup corresponding to %lox(foo) + fixup_sparc_lox10, + + /// 22-bit fixup corresponding to %gdop_hix22(foo) + fixup_sparc_gotdata_hix22, + /// 13-bit fixup corresponding to %gdop_lox10(foo) + fixup_sparc_gotdata_lox10, + /// 32-bit fixup corresponding to %gdop(foo) + fixup_sparc_gotdata_op, + // Marker LastTargetFixupKind, NumTargetFixupKinds = LastTargetFixupKind - FirstTargetFixupKind Index: llvm/lib/Target/Sparc/MCTargetDesc/SparcMCExpr.h =================================================================== --- llvm/lib/Target/Sparc/MCTargetDesc/SparcMCExpr.h +++ llvm/lib/Target/Sparc/MCTargetDesc/SparcMCExpr.h @@ -58,7 +58,12 @@ 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_HIX22, + VK_Sparc_LOX10, + VK_Sparc_GOTDATA_HIX22, + VK_Sparc_GOTDATA_LOX10, + VK_Sparc_GOTDATA_OP, }; private: Index: llvm/lib/Target/Sparc/MCTargetDesc/SparcMCExpr.cpp =================================================================== --- llvm/lib/Target/Sparc/MCTargetDesc/SparcMCExpr.cpp +++ llvm/lib/Target/Sparc/MCTargetDesc/SparcMCExpr.cpp @@ -80,6 +80,11 @@ case VK_Sparc_TLS_IE_ADD: OS << "%tie_add("; return true; case VK_Sparc_TLS_LE_HIX22: OS << "%tle_hix22("; return true; case VK_Sparc_TLS_LE_LOX10: OS << "%tle_lox10("; return true; + case VK_Sparc_HIX22: OS << "%hix("; return true; + case VK_Sparc_LOX10: OS << "%lox("; return true; + case VK_Sparc_GOTDATA_HIX22: OS << "%gdop_hix22("; return true; + case VK_Sparc_GOTDATA_LOX10: OS << "%gdop_lox10("; return true; + case VK_Sparc_GOTDATA_OP: OS << "%gdop("; return true; } llvm_unreachable("Unhandled SparcMCExpr::VariantKind"); } @@ -119,6 +124,11 @@ .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("hix", VK_Sparc_HIX22) + .Case("lox", VK_Sparc_LOX10) + .Case("gdop_hix22", VK_Sparc_GOTDATA_HIX22) + .Case("gdop_lox10", VK_Sparc_GOTDATA_LOX10) + .Case("gdop", VK_Sparc_GOTDATA_OP) .Default(VK_Sparc_None); } @@ -159,6 +169,11 @@ 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_HIX22: return Sparc::fixup_sparc_hix22; + case VK_Sparc_LOX10: return Sparc::fixup_sparc_lox10; + case VK_Sparc_GOTDATA_HIX22: return Sparc::fixup_sparc_gotdata_hix22; + case VK_Sparc_GOTDATA_LOX10: return Sparc::fixup_sparc_gotdata_lox10; + case VK_Sparc_GOTDATA_OP: return Sparc::fixup_sparc_gotdata_op; } } Index: llvm/test/MC/Sparc/sparc-fixups.s =================================================================== --- /dev/null +++ llvm/test/MC/Sparc/sparc-fixups.s @@ -0,0 +1,30 @@ +! RUN: llvm-mc %s -arch=sparcv9 -filetype=obj | llvm-objdump -dr - | FileCheck %s +.text + +! Check that fixups are correctly applied. + +.set sym, 0xfedcba98 + +! CHECK: sethi 4175662, %o0 +sethi %hi(sym), %o0 +! CHECK: xor %o0, 664, %o0 +xor %o0, %lo(sym), %o0 + +! CHECK: sethi 1019, %o0 +sethi %h44(sym), %o0 +! CHECK: or %o0, 459, %o0 +or %o0, %m44(sym), %o0 +! CHECK: ld [%o0+2712], %o0 +ld [%o0 + %l44(sym)], %o0 + +! CHECK: sethi 0, %o0 +sethi %hh(sym), %o0 +! CHECK: sethi 4175662, %o0 +sethi %lm(sym), %o0 +! CHECK: or %o0, 0, %o0 +or %o0, %hm(sym), %o0 + +! CHECK: sethi 18641, %o0 +sethi %hix(sym), %o0 +! CHECK: xor %o0, -360, %o0 +xor %o0, %lox(sym), %o0 Index: llvm/test/MC/Sparc/sparc-relocations.s =================================================================== --- llvm/test/MC/Sparc/sparc-relocations.s +++ llvm/test/MC/Sparc/sparc-relocations.s @@ -2,18 +2,24 @@ ! RUN: llvm-mc %s -arch=sparcv9 -filetype=obj | llvm-readobj -r - | FileCheck %s --check-prefix=CHECK-OBJ ! CHECK-OBJ: Format: elf64-sparc - ! CHECK-OBJ: Relocations [ - ! CHECK-OBJ: 0x{{[0-9,A-F]+}} R_SPARC_WDISP30 foo - ! CHECK-OBJ: 0x{{[0-9,A-F]+}} R_SPARC_LO10 sym - ! CHECK-OBJ: 0x{{[0-9,A-F]+}} R_SPARC_HI22 sym - ! CHECK-OBJ: 0x{{[0-9,A-F]+}} R_SPARC_H44 sym - ! CHECK-OBJ: 0x{{[0-9,A-F]+}} R_SPARC_M44 sym - ! CHECK-OBJ: 0x{{[0-9,A-F]+}} R_SPARC_L44 sym - ! CHECK-OBJ: 0x{{[0-9,A-F]+}} R_SPARC_HH22 sym - ! CHECK-OBJ: 0x{{[0-9,A-F]+}} R_SPARC_HM10 sym - ! CHECK-OBJ: 0x{{[0-9,A-F]+}} R_SPARC_LM22 sym - ! CHECK-OBJ: 0x{{[0-9,A-F]+}} R_SPARC_13 sym - ! CHECK-ELF: ] + ! CHECK-OBJ: .rela.text { + ! CHECK-OBJ-NEXT: 0x{{[0-9,A-F]+}} R_SPARC_WDISP30 foo + ! CHECK-OBJ-NEXT: 0x{{[0-9,A-F]+}} R_SPARC_LO10 sym + ! CHECK-OBJ-NEXT: 0x{{[0-9,A-F]+}} R_SPARC_HI22 sym + ! CHECK-OBJ-NEXT: 0x{{[0-9,A-F]+}} R_SPARC_H44 sym + ! CHECK-OBJ-NEXT: 0x{{[0-9,A-F]+}} R_SPARC_M44 sym + ! CHECK-OBJ-NEXT: 0x{{[0-9,A-F]+}} R_SPARC_L44 sym + ! CHECK-OBJ-NEXT: 0x{{[0-9,A-F]+}} R_SPARC_HH22 sym + ! CHECK-OBJ-NEXT: 0x{{[0-9,A-F]+}} R_SPARC_HM10 sym + ! CHECK-OBJ-NEXT: 0x{{[0-9,A-F]+}} R_SPARC_LM22 sym + ! CHECK-OBJ-NEXT: 0x{{[0-9,A-F]+}} R_SPARC_13 sym + ! CHECK-OBJ-NEXT: 0x{{[0-9,A-F]+}} R_SPARC_13 sym + ! CHECK-OBJ-NEXT: 0x{{[0-9,A-F]+}} R_SPARC_HIX22 sym + ! CHECK-OBJ-NEXT: 0x{{[0-9,A-F]+}} R_SPARC_LOX10 sym + ! CHECK-OBJ-NEXT: 0x{{[0-9,A-F]+}} R_SPARC_GOTDATA_HIX22 sym + ! CHECK-OBJ-NEXT: 0x{{[0-9,A-F]+}} R_SPARC_GOTDATA_LOX10 sym + ! CHECK-OBJ-NEXT: 0x{{[0-9,A-F]+}} R_SPARC_GOTDATA_OP sym + ! CHECK-OBJ-NEXT: } ! CHECK: call foo ! encoding: [0b01AAAAAA,A,A,A] ! CHECK: ! fixup A - offset: 0, value: foo, kind: fixup_sparc_call30 @@ -59,6 +65,26 @@ ! CHECK-NEXT: ! fixup A - offset: 0, value: sym+4, kind: fixup_sparc_13 or %g1, (sym+4), %g3 + ! CHECK: sethi %hix(sym), %g1 ! encoding: [0x03,0b00AAAAAA,A,A] + ! CHECK-NEXT: ! fixup A - offset: 0, value: %hix(sym), kind: fixup_sparc_hix22 + sethi %hix(sym), %g1 + + ! CHECK: or %g1, %lox(sym), %g1 ! encoding: [0x82,0x10,0b011AAAAA,A] + ! CHECK-NEXT: ! fixup A - offset: 0, value: %lox(sym), kind: fixup_sparc_lox10 + or %g1, %lox(sym), %g1 + + ! CHECK: sethi %gdop_hix22(sym), %l1 ! encoding: [0x23,0x00,0x00,0x00] + ! CHECK-NEXT: ! fixup A - offset: 0, value: %gdop_hix22(sym), kind: fixup_sparc_gotdata_hix22 + sethi %gdop_hix22(sym), %l1 + + ! CHECK: or %l1, %gdop_lox10(sym), %l1 ! encoding: [0xa2,0x14,0x60,0x00] + ! CHECK-NEXT: ! fixup A - offset: 0, value: %gdop_lox10(sym), kind: fixup_sparc_gotdata_lox10 + or %l1, %gdop_lox10(sym), %l1 + + ! CHECK: ld [%l7+%l1], %l2, %gdop(sym) ! encoding: [0xe4,0x05,0xc0,0x11] + ! CHECK-NEXT: ! fixup A - offset: 0, value: %gdop(sym), kind: fixup_sparc_gotdata_op + ld [%l7 + %l1], %l2, %gdop(sym) + ! This test needs to placed last in the file ! CHECK: .half a-.Ltmp0 .half a - .