Index: include/llvm/MC/MCExpr.h =================================================================== --- include/llvm/MC/MCExpr.h +++ include/llvm/MC/MCExpr.h @@ -188,6 +188,7 @@ VK_GOTPAGE, VK_GOTPAGEOFF, VK_SECREL, + VK_SIZE, // symbol@SIZE VK_WEAKREF, // The link between the symbols in .weakref foo, bar VK_ARM_NONE, Index: lib/MC/MCExpr.cpp =================================================================== --- lib/MC/MCExpr.cpp +++ lib/MC/MCExpr.cpp @@ -192,6 +192,7 @@ case VK_GOTPAGE: return "GOTPAGE"; case VK_GOTPAGEOFF: return "GOTPAGEOFF"; case VK_SECREL: return "SECREL32"; + case VK_SIZE: return "SIZE"; case VK_WEAKREF: return "WEAKREF"; case VK_ARM_NONE: return "none"; case VK_ARM_TARGET1: return "target1"; @@ -311,6 +312,7 @@ .Case("gotpageoff", VK_GOTPAGEOFF) .Case("imgrel", VK_COFF_IMGREL32) .Case("secrel32", VK_SECREL) + .Case("size", VK_SIZE) .Case("l", VK_PPC_LO) .Case("h", VK_PPC_HI) .Case("ha", VK_PPC_HA) 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_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_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: }