Index: include/llvm/MC/MCExpr.h =================================================================== --- include/llvm/MC/MCExpr.h +++ include/llvm/MC/MCExpr.h @@ -280,7 +280,9 @@ VK_Mips_PCREL_HI16, VK_Mips_PCREL_LO16, - VK_COFF_IMGREL32 // symbol@imgrel (image-relative) + VK_COFF_IMGREL32, // symbol@imgrel (image-relative) + + VK_X86_64_SIZE // symbol@SIZE }; private: Index: lib/MC/MCExpr.cpp =================================================================== --- lib/MC/MCExpr.cpp +++ lib/MC/MCExpr.cpp @@ -281,6 +281,7 @@ case VK_Mips_PCREL_HI16: return "PCREL_HI16"; case VK_Mips_PCREL_LO16: return "PCREL_LO16"; case VK_COFF_IMGREL32: return "IMGREL"; + case VK_X86_64_SIZE: return "SIZE"; } llvm_unreachable("Invalid variant kind"); } @@ -369,6 +370,7 @@ .Case("tlsldo", VK_ARM_TLSLDO) .Case("tlscall", VK_ARM_TLSCALL) .Case("tlsdesc", VK_ARM_TLSDESC) + .Case("size", VK_X86_64_SIZE) .Default(VK_Invalid); } Index: lib/Target/X86/MCTargetDesc/X86ELFObjectWriter.cpp =================================================================== --- lib/Target/X86/MCTargetDesc/X86ELFObjectWriter.cpp +++ lib/Target/X86/MCTargetDesc/X86ELFObjectWriter.cpp @@ -123,6 +123,9 @@ case MCSymbolRefExpr::VK_DTPOFF: Type = ELF::R_X86_64_DTPOFF64; break; + case MCSymbolRefExpr::VK_X86_64_SIZE: + Type = ELF::R_X86_64_SIZE64; + break; } break; case X86::reloc_signed_4byte: @@ -144,6 +147,9 @@ case MCSymbolRefExpr::VK_DTPOFF: Type = ELF::R_X86_64_DTPOFF32; break; + case MCSymbolRefExpr::VK_X86_64_SIZE: + Type = ELF::R_X86_64_SIZE64; + break; } break; case FK_Data_4: Index: test/MC/ELF/relocation.s =================================================================== --- test/MC/ELF/relocation.s +++ test/MC/ELF/relocation.s @@ -34,6 +34,10 @@ movl $_GLOBAL_OFFSET_TABLE_, %eax movabs $_GLOBAL_OFFSET_TABLE_, %rax + movq $foo@SIZE + 32, %rax # R_X86_64_SIZE64 + movq $foo@SIZE, %rax # R_X86_64_SIZE64 + movq $foo@SIZE - 32, %rax # R_X86_64_SIZE64 + // CHECK: Section { // CHECK: Name: .rela.text // CHECK: Relocations [ @@ -62,6 +66,9 @@ // CHECK-NEXT: 0x98 R_X86_64_PC32 foo 0xFFFFFFFFFFFFFFFB // CHECK-NEXT: 0x9D R_X86_64_GOTPC32 _GLOBAL_OFFSET_TABLE_ 0x1 // CHECK-NEXT: 0xA3 R_X86_64_GOTPC64 _GLOBAL_OFFSET_TABLE_ 0x2 +// CHECK-NEXT: 0xAE R_X86_64_SIZE64 foo 0x20 +// CHECK-NEXT: 0xB5 R_X86_64_SIZE64 foo 0x0 +// CHECK-NEXT: 0xBC R_X86_64_SIZE64 foo 0xFFFFFFFFFFFFFFE0 // CHECK-NEXT: ] // CHECK-NEXT: }