Jakub Jelinek 327d37
2013-08-29  Jakub Jelinek  <jakub@redhat.com>
Jakub Jelinek 327d37
Jakub Jelinek 327d37
	* elf64-x86-64.c (elf_x86_64_check_tls_transition): Allow
Jakub Jelinek 327d37
	64-bit -mcmodel=large -fpic TLS GD and LD sequences.
Jakub Jelinek 327d37
	(elf_x86_64_relocate_section): Handle -mcmodel=large -fpic
Jakub Jelinek 327d37
	TLS GD and LD sequences in GD->LE, GD->IE and LD->LE transitions.
Jakub Jelinek 327d37
ld/testsuite/
Jakub Jelinek 327d37
	* ld-x86-64/x86-64.exp: Add tlsld3, tlsgd7 and tlsgd8 tests.
Jakub Jelinek 327d37
	* ld-x86-64/tlspic1.s: Add -mcmodel=large -fpic TLS GD and LD
Jakub Jelinek 327d37
	sequences.
Jakub Jelinek 327d37
	* ld-x86-64/tlspic.dd: Adjusted.
Jakub Jelinek 327d37
	* ld-x86-64/tlspic.rd: Adjusted.
Jakub Jelinek 327d37
	* ld-x86-64/tlspic-nacl.rd: Adjusted.
Jakub Jelinek 327d37
	* ld-x86-64/tlsld3.dd: New test.
Jakub Jelinek 327d37
	* ld-x86-64/tlsld3.s: New file.
Jakub Jelinek 327d37
	* ld-x86-64/tlsgd7.dd: New test.
Jakub Jelinek 327d37
	* ld-x86-64/tlsgd7.s: New file.
Jakub Jelinek 327d37
	* ld-x86-64/tlsgd8.dd: New test.
Jakub Jelinek 327d37
	* ld-x86-64/tlsgd8.s: New file.
Jakub Jelinek 327d37
Jakub Jelinek 327d37
--- bfd/elf64-x86-64.c.jj	2013-08-28 17:58:32.549408509 +0200
Jakub Jelinek 327d37
+++ bfd/elf64-x86-64.c	2013-08-28 17:33:13.738626828 +0200
Jakub Jelinek 327d37
@@ -1089,6 +1089,7 @@ elf_x86_64_check_tls_transition (bfd *ab
Jakub Jelinek 327d37
 {
Jakub Jelinek 327d37
   unsigned int val;
Jakub Jelinek 327d37
   unsigned long r_symndx;
Jakub Jelinek 327d37
+  bfd_boolean largepic = FALSE;
Jakub Jelinek 327d37
   struct elf_link_hash_entry *h;
Jakub Jelinek 327d37
   bfd_vma offset;
Jakub Jelinek 327d37
   struct elf_x86_64_link_hash_table *htab;
Jakub Jelinek 327d37
@@ -1126,16 +1127,32 @@ elf_x86_64_check_tls_transition (bfd *ab
Jakub Jelinek 327d37
 	     can transit to different access model.  For 32bit, only
Jakub Jelinek 327d37
 		leaq foo@tlsgd(%rip), %rdi
Jakub Jelinek 327d37
 		.word 0x6666; rex64; call __tls_get_addr
Jakub Jelinek 327d37
-	     can transit to different access model.  */
Jakub Jelinek 327d37
+	     can transit to different access model.  For largepic
Jakub Jelinek 327d37
+	     we also support:
Jakub Jelinek 327d37
+	        leaq foo@tlsgd(%rip), %rdi
Jakub Jelinek 327d37
+	        movabsq $__tls_get_addr@pltoff, %rax
Jakub Jelinek 327d37
+	        addq $rbx, %rax
Jakub Jelinek 327d37
+	        call *%rax.  */
Jakub Jelinek 327d37
 
Jakub Jelinek 327d37
 	  static const unsigned char call[] = { 0x66, 0x66, 0x48, 0xe8 };
Jakub Jelinek 327d37
 	  static const unsigned char leaq[] = { 0x66, 0x48, 0x8d, 0x3d };
Jakub Jelinek 327d37
 
Jakub Jelinek 327d37
-	  if ((offset + 12) > sec->size
Jakub Jelinek 327d37
-	      || memcmp (contents + offset + 4, call, 4) != 0)
Jakub Jelinek 327d37
+	  if ((offset + 12) > sec->size)
Jakub Jelinek 327d37
 	    return FALSE;
Jakub Jelinek 327d37
 
Jakub Jelinek 327d37
-	  if (ABI_64_P (abfd))
Jakub Jelinek 327d37
+	  if (memcmp (contents + offset + 4, call, 4) != 0)
Jakub Jelinek 327d37
+	    {
Jakub Jelinek 327d37
+	      if (!ABI_64_P (abfd)
Jakub Jelinek 327d37
+		  || (offset + 19) > sec->size
Jakub Jelinek 327d37
+		  || offset < 3
Jakub Jelinek 327d37
+		  || memcmp (contents + offset - 3, leaq + 1, 3) != 0
Jakub Jelinek 327d37
+		  || memcmp (contents + offset + 4, "\x48\xb8", 2) != 0
Jakub Jelinek 327d37
+		  || memcmp (contents + offset + 14, "\x48\x01\xd8\xff\xd0", 5)
Jakub Jelinek 327d37
+		     != 0)
Jakub Jelinek 327d37
+		return FALSE;
Jakub Jelinek 327d37
+	      largepic = TRUE;
Jakub Jelinek 327d37
+	    }
Jakub Jelinek 327d37
+	  else if (ABI_64_P (abfd))
Jakub Jelinek 327d37
 	    {
Jakub Jelinek 327d37
 	      if (offset < 4
Jakub Jelinek 327d37
 		  || memcmp (contents + offset - 4, leaq, 4) != 0)
Jakub Jelinek 327d37
@@ -1153,16 +1170,31 @@ elf_x86_64_check_tls_transition (bfd *ab
Jakub Jelinek 327d37
 	  /* Check transition from LD access model.  Only
Jakub Jelinek 327d37
 		leaq foo@tlsld(%rip), %rdi;
Jakub Jelinek 327d37
 		call __tls_get_addr
Jakub Jelinek 327d37
-	     can transit to different access model.  */
Jakub Jelinek 327d37
+	     can transit to different access model.  For largepic
Jakub Jelinek 327d37
+	     we also support:
Jakub Jelinek 327d37
+	        leaq foo@tlsld(%rip), %rdi
Jakub Jelinek 327d37
+	        movabsq $__tls_get_addr@pltoff, %rax
Jakub Jelinek 327d37
+	        addq $rbx, %rax
Jakub Jelinek 327d37
+	        call *%rax.  */
Jakub Jelinek 327d37
 
Jakub Jelinek 327d37
 	  static const unsigned char lea[] = { 0x48, 0x8d, 0x3d };
Jakub Jelinek 327d37
 
Jakub Jelinek 327d37
 	  if (offset < 3 || (offset + 9) > sec->size)
Jakub Jelinek 327d37
 	    return FALSE;
Jakub Jelinek 327d37
 
Jakub Jelinek 327d37
-	  if (memcmp (contents + offset - 3, lea, 3) != 0
Jakub Jelinek 327d37
-	      || 0xe8 != *(contents + offset + 4))
Jakub Jelinek 327d37
+	  if (memcmp (contents + offset - 3, lea, 3) != 0)
Jakub Jelinek 327d37
 	    return FALSE;
Jakub Jelinek 327d37
+
Jakub Jelinek 327d37
+	  if (0xe8 != *(contents + offset + 4))
Jakub Jelinek 327d37
+	    {
Jakub Jelinek 327d37
+	      if (!ABI_64_P (abfd)
Jakub Jelinek 327d37
+		  || (offset + 19) > sec->size
Jakub Jelinek 327d37
+		  || memcmp (contents + offset + 4, "\x48\xb8", 2) != 0
Jakub Jelinek 327d37
+		  || memcmp (contents + offset + 14, "\x48\x01\xd8\xff\xd0", 5)
Jakub Jelinek 327d37
+		     != 0)
Jakub Jelinek 327d37
+		return FALSE;
Jakub Jelinek 327d37
+	      largepic = TRUE;
Jakub Jelinek 327d37
+	    }
Jakub Jelinek 327d37
 	}
Jakub Jelinek 327d37
 
Jakub Jelinek 327d37
       r_symndx = htab->r_sym (rel[1].r_info);
Jakub Jelinek 327d37
@@ -1174,8 +1206,10 @@ elf_x86_64_check_tls_transition (bfd *ab
Jakub Jelinek 327d37
 	 may be versioned.  */
Jakub Jelinek 327d37
       return (h != NULL
Jakub Jelinek 327d37
 	      && h->root.root.string != NULL
Jakub Jelinek 327d37
-	      && (ELF32_R_TYPE (rel[1].r_info) == R_X86_64_PC32
Jakub Jelinek 327d37
-		  || ELF32_R_TYPE (rel[1].r_info) == R_X86_64_PLT32)
Jakub Jelinek 327d37
+	      && (largepic
Jakub Jelinek 327d37
+		  ? ELF32_R_TYPE (rel[1].r_info) == R_X86_64_PLTOFF64
Jakub Jelinek 327d37
+		  : (ELF32_R_TYPE (rel[1].r_info) == R_X86_64_PC32
Jakub Jelinek 327d37
+		     || ELF32_R_TYPE (rel[1].r_info) == R_X86_64_PLT32))
Jakub Jelinek 327d37
 	      && (strncmp (h->root.root.string,
Jakub Jelinek 327d37
 			   "__tls_get_addr", 14) == 0));
Jakub Jelinek 327d37
 
Jakub Jelinek 327d37
@@ -3949,8 +3983,26 @@ direct:
Jakub Jelinek 327d37
 		     .word 0x6666; rex64; call __tls_get_addr
Jakub Jelinek 327d37
 		     into:
Jakub Jelinek 327d37
 		     movl %fs:0, %eax
Jakub Jelinek 327d37
-		     leaq foo@tpoff(%rax), %rax */
Jakub Jelinek 327d37
-		  if (ABI_64_P (output_bfd))
Jakub Jelinek 327d37
+		     leaq foo@tpoff(%rax), %rax
Jakub Jelinek 327d37
+		     For largepic, change:
Jakub Jelinek 327d37
+		     leaq foo@tlsgd(%rip), %rdi
Jakub Jelinek 327d37
+		     movabsq $__tls_get_addr@pltoff, %rax
Jakub Jelinek 327d37
+		     addq %rbx, %rax
Jakub Jelinek 327d37
+		     call *%rax
Jakub Jelinek 327d37
+		     into:
Jakub Jelinek 327d37
+		     movq %fs:0, %rax
Jakub Jelinek 327d37
+		     leaq foo@tpoff(%rax), %rax
Jakub Jelinek 327d37
+		     nopw 0x0(%rax,%rax,1) */
Jakub Jelinek 327d37
+		  int largepic = 0;
Jakub Jelinek 327d37
+		  if (ABI_64_P (output_bfd)
Jakub Jelinek 327d37
+		      && contents[roff + 5] == (bfd_byte) '\xb8')
Jakub Jelinek 327d37
+		    {
Jakub Jelinek 327d37
+		      memcpy (contents + roff - 3,
Jakub Jelinek 327d37
+			      "\x64\x48\x8b\x04\x25\0\0\0\0\x48\x8d\x80"
Jakub Jelinek 327d37
+			      "\0\0\0\0\x66\x0f\x1f\x44\0", 22);
Jakub Jelinek 327d37
+		      largepic = 1;
Jakub Jelinek 327d37
+		    }
Jakub Jelinek 327d37
+		  else if (ABI_64_P (output_bfd))
Jakub Jelinek 327d37
 		    memcpy (contents + roff - 4,
Jakub Jelinek 327d37
 			    "\x64\x48\x8b\x04\x25\0\0\0\0\x48\x8d\x80\0\0\0",
Jakub Jelinek 327d37
 			    16);
Jakub Jelinek 327d37
@@ -3960,8 +4012,8 @@ direct:
Jakub Jelinek 327d37
 			    15);
Jakub Jelinek 327d37
 		  bfd_put_32 (output_bfd,
Jakub Jelinek 327d37
 			      elf_x86_64_tpoff (info, relocation),
Jakub Jelinek 327d37
-			      contents + roff + 8);
Jakub Jelinek 327d37
-		  /* Skip R_X86_64_PC32/R_X86_64_PLT32.  */
Jakub Jelinek 327d37
+			      contents + roff + 8 + largepic);
Jakub Jelinek 327d37
+		  /* Skip R_X86_64_PC32/R_X86_64_PLT32/R_X86_64_PLTOFF64.  */
Jakub Jelinek 327d37
 		  rel++;
Jakub Jelinek 327d37
 		  continue;
Jakub Jelinek 327d37
 		}
Jakub Jelinek 327d37
@@ -4196,8 +4248,26 @@ direct:
Jakub Jelinek 327d37
 		     .word 0x6666; rex64; call __tls_get_addr@plt
Jakub Jelinek 327d37
 		     into:
Jakub Jelinek 327d37
 		     movl %fs:0, %eax
Jakub Jelinek 327d37
-		     addq foo@gottpoff(%rip), %rax */
Jakub Jelinek 327d37
-		  if (ABI_64_P (output_bfd))
Jakub Jelinek 327d37
+		     addq foo@gottpoff(%rip), %rax
Jakub Jelinek 327d37
+		     For largepic, change:
Jakub Jelinek 327d37
+		     leaq foo@tlsgd(%rip), %rdi
Jakub Jelinek 327d37
+		     movabsq $__tls_get_addr@pltoff, %rax
Jakub Jelinek 327d37
+		     addq %rbx, %rax
Jakub Jelinek 327d37
+		     call *%rax
Jakub Jelinek 327d37
+		     into:
Jakub Jelinek 327d37
+		     movq %fs:0, %rax
Jakub Jelinek 327d37
+		     addq foo@gottpoff(%rax), %rax
Jakub Jelinek 327d37
+		     nopw 0x0(%rax,%rax,1) */
Jakub Jelinek 327d37
+		  int largepic = 0;
Jakub Jelinek 327d37
+		  if (ABI_64_P (output_bfd)
Jakub Jelinek 327d37
+		      && contents[roff + 5] == (bfd_byte) '\xb8')
Jakub Jelinek 327d37
+		    {
Jakub Jelinek 327d37
+		      memcpy (contents + roff - 3,
Jakub Jelinek 327d37
+			      "\x64\x48\x8b\x04\x25\0\0\0\0\x48\x03\x05"
Jakub Jelinek 327d37
+			      "\0\0\0\0\x66\x0f\x1f\x44\0", 22);
Jakub Jelinek 327d37
+		      largepic = 1;
Jakub Jelinek 327d37
+		    }
Jakub Jelinek 327d37
+		  else if (ABI_64_P (output_bfd))
Jakub Jelinek 327d37
 		    memcpy (contents + roff - 4,
Jakub Jelinek 327d37
 			    "\x64\x48\x8b\x04\x25\0\0\0\0\x48\x03\x05\0\0\0",
Jakub Jelinek 327d37
 			    16);
Jakub Jelinek 327d37
@@ -4209,12 +4279,13 @@ direct:
Jakub Jelinek 327d37
 		  relocation = (htab->elf.sgot->output_section->vma
Jakub Jelinek 327d37
 				+ htab->elf.sgot->output_offset + off
Jakub Jelinek 327d37
 				- roff
Jakub Jelinek 327d37
+				- largepic
Jakub Jelinek 327d37
 				- input_section->output_section->vma
Jakub Jelinek 327d37
 				- input_section->output_offset
Jakub Jelinek 327d37
 				- 12);
Jakub Jelinek 327d37
 		  bfd_put_32 (output_bfd, relocation,
Jakub Jelinek 327d37
-			      contents + roff + 8);
Jakub Jelinek 327d37
-		  /* Skip R_X86_64_PLT32.  */
Jakub Jelinek 327d37
+			      contents + roff + 8 + largepic);
Jakub Jelinek 327d37
+		  /* Skip R_X86_64_PLT32/R_X86_64_PLTOFF64.  */
Jakub Jelinek 327d37
 		  rel++;
Jakub Jelinek 327d37
 		  continue;
Jakub Jelinek 327d37
 		}
Jakub Jelinek 327d37
@@ -4276,16 +4347,29 @@ direct:
Jakub Jelinek 327d37
 		 For 64bit, we change it into:
Jakub Jelinek 327d37
 		 .word 0x6666; .byte 0x66; movq %fs:0, %rax.
Jakub Jelinek 327d37
 		 For 32bit, we change it into:
Jakub Jelinek 327d37
-		 nopl 0x0(%rax); movl %fs:0, %eax.  */
Jakub Jelinek 327d37
+		 nopl 0x0(%rax); movl %fs:0, %eax.
Jakub Jelinek 327d37
+		 For largepic, change:
Jakub Jelinek 327d37
+		 leaq foo@tlsgd(%rip), %rdi
Jakub Jelinek 327d37
+		 movabsq $__tls_get_addr@pltoff, %rax
Jakub Jelinek 327d37
+		 addq %rbx, %rax
Jakub Jelinek 327d37
+		 call *%rax
Jakub Jelinek 327d37
+		 into:
Jakub Jelinek 327d37
+		 data32 data32 data32 nopw %cs:0x0(%rax,%rax,1)
Jakub Jelinek 327d37
+		 movq %fs:0, %eax */
Jakub Jelinek 327d37
 
Jakub Jelinek 327d37
 	      BFD_ASSERT (r_type == R_X86_64_TPOFF32);
Jakub Jelinek 327d37
-	      if (ABI_64_P (output_bfd))
Jakub Jelinek 327d37
+	      if (ABI_64_P (output_bfd)
Jakub Jelinek 327d37
+		  && contents[rel->r_offset + 5] == (bfd_byte) '\xb8')
Jakub Jelinek 327d37
+		memcpy (contents + rel->r_offset - 3,
Jakub Jelinek 327d37
+			"\x66\x66\x66\x66\x2e\x0f\x1f\x84\0\0\0\0\0"
Jakub Jelinek 327d37
+			"\x64\x48\x8b\x04\x25\0\0\0", 22);
Jakub Jelinek 327d37
+	      else if (ABI_64_P (output_bfd))
Jakub Jelinek 327d37
 		memcpy (contents + rel->r_offset - 3,
Jakub Jelinek 327d37
 			"\x66\x66\x66\x64\x48\x8b\x04\x25\0\0\0", 12);
Jakub Jelinek 327d37
 	      else
Jakub Jelinek 327d37
 		memcpy (contents + rel->r_offset - 3,
Jakub Jelinek 327d37
 			"\x0f\x1f\x40\x00\x64\x8b\x04\x25\0\0\0", 12);
Jakub Jelinek 327d37
-	      /* Skip R_X86_64_PC32/R_X86_64_PLT32.  */
Jakub Jelinek 327d37
+	      /* Skip R_X86_64_PC32/R_X86_64_PLT32/R_X86_64_PLTOFF64.  */
Jakub Jelinek 327d37
 	      rel++;
Jakub Jelinek 327d37
 	      continue;
Jakub Jelinek 327d37
 	    }
Jakub Jelinek 327d37
--- ld/testsuite/ld-x86-64/tlsgd7.dd.jj	2013-08-28 18:57:11.655623528 +0200
Jakub Jelinek 327d37
+++ ld/testsuite/ld-x86-64/tlsgd7.dd	2013-08-28 20:46:30.469141384 +0200
Jakub Jelinek 327d37
@@ -0,0 +1,23 @@
Jakub Jelinek 327d37
+#source: tlsgd7.s
Jakub Jelinek 327d37
+#as: --64
Jakub Jelinek 327d37
+#ld: -melf_x86_64 tmpdir/tlsgd7
Jakub Jelinek 327d37
+#objdump: -drw
Jakub Jelinek 327d37
+#target: x86_64-*-linux*
Jakub Jelinek 327d37
+
Jakub Jelinek 327d37
+.*: +file format .*
Jakub Jelinek 327d37
+
Jakub Jelinek 327d37
+Disassembly of section .text:
Jakub Jelinek 327d37
+
Jakub Jelinek 327d37
+[a-f0-9]+ <_start>:
Jakub Jelinek 327d37
+[ 	]*[a-f0-9]+:	49 bb ([0-9a-f]{2} ){8}	movabs \$0x[0-9a-f]+,%r11
Jakub Jelinek 327d37
+[ 	]*[a-f0-9]+:	53                   	push   %rbx
Jakub Jelinek 327d37
+[ 	]*[a-f0-9]+:	53                   	push   %rbx
Jakub Jelinek 327d37
+[ 	]*[a-f0-9]+:	48 8d 1d ed ff ff ff 	lea    -0x13\(%rip\),%rbx        # [0-9a-f]+ <_start>
Jakub Jelinek 327d37
+[ 	]*[a-f0-9]+:	4c 01 db             	add    %r11,%rbx
Jakub Jelinek 327d37
+[ 	]*[a-f0-9]+:	64 48 8b 04 25 00 00 00 00 	mov    %fs:0x0,%rax
Jakub Jelinek 327d37
+[ 	]*[a-f0-9]+:	48 8d 80 fc ff ff ff 	lea    -0x4\(%rax\),%rax
Jakub Jelinek 327d37
+[ 	]*[a-f0-9]+:	66 0f 1f 44 00 00    	nopw   0x0\(%rax,%rax,1\)
Jakub Jelinek 327d37
+[ 	]*[a-f0-9]+:	5b                   	pop    %rbx
Jakub Jelinek 327d37
+[ 	]*[a-f0-9]+:	5b                   	pop    %rbx
Jakub Jelinek 327d37
+[ 	]*[a-f0-9]+:	c3                   	retq   
Jakub Jelinek 327d37
+#pass
Jakub Jelinek 327d37
--- ld/testsuite/ld-x86-64/tlspic.dd.jj	2013-08-13 13:42:26.000000000 +0200
Jakub Jelinek 327d37
+++ ld/testsuite/ld-x86-64/tlspic.dd	2013-08-29 12:12:18.724775938 +0200
Jakub Jelinek 327d37
@@ -224,6 +224,163 @@ Disassembly of section .text:
Jakub Jelinek 327d37
  +11a5:	90[ 	]+nop *
Jakub Jelinek 327d37
  +11a6:	90[ 	]+nop *
Jakub Jelinek 327d37
  +11a7:	90[ 	]+nop *
Jakub Jelinek 327d37
- +11a8:	c9[ 	]+leaveq *
Jakub Jelinek 327d37
- +11a9:	c3[ 	]+retq *
Jakub Jelinek 327d37
- +11aa:	66 90[ 	]+xchg   %ax,%ax
Jakub Jelinek 327d37
+ +11a8:	49 bb ([0-9a-f]{2} ){5}[ 	]+movabs \$0x[0-9a-f]+,%r11
Jakub Jelinek 327d37
+ +11af:	([0-9a-f]{2} ){3}
Jakub Jelinek 327d37
+ +11b2:	53[ 	]+push   %rbx
Jakub Jelinek 327d37
+ +11b3:	53[ 	]+push   %rbx
Jakub Jelinek 327d37
+ +11b4:	48 8d 1d ed ff ff ff[ 	]+lea    -0x13\(%rip\),%rbx +# [0-9a-f]+ <fn1\+0x[0-9a-f]+>
Jakub Jelinek 327d37
+ +11bb:	4c 01 db[ 	]+add    %r11,%rbx
Jakub Jelinek 327d37
+ +11be:	90[ 	]+nop *
Jakub Jelinek 327d37
+ +11bf:	90[ 	]+nop *
Jakub Jelinek 327d37
+ +11c0:	90[ 	]+nop *
Jakub Jelinek 327d37
+ +11c1:	90[ 	]+nop *
Jakub Jelinek 327d37
+# -mcmodel=large sequences
Jakub Jelinek 327d37
+#
Jakub Jelinek 327d37
+#  -mcmodel=large GD
Jakub Jelinek 327d37
+ +11c2:	48 8d 3d ([0-9a-f]{2} ){4}[ 	]+lea    0x[0-9a-f]+\(%rip\),%rdi +# [0-9a-f]+ <_DYNAMIC\+0x180>
Jakub Jelinek 327d37
+#				-> R_X86_64_DTPMOD64	sg1
Jakub Jelinek 327d37
+ +11c9:	48 b8 ([0-9a-f]{2} ){5}[ 	]+movabs \$0x[0-9a-f]+,%rax
Jakub Jelinek 327d37
+#				-> R_X86_64_JUMP_SLOT	__tls_get_addr
Jakub Jelinek 327d37
+ +11d0:	([0-9a-f]{2} ){3}
Jakub Jelinek 327d37
+ +11d3:	48 01 d8[ 	]+add    %rbx,%rax
Jakub Jelinek 327d37
+ +11d6:	ff d0[ 	]+callq  \*%rax
Jakub Jelinek 327d37
+ +11d8:	90[ 	]+nop *
Jakub Jelinek 327d37
+ +11d9:	90[ 	]+nop *
Jakub Jelinek 327d37
+ +11da:	90[ 	]+nop *
Jakub Jelinek 327d37
+ +11db:	90[ 	]+nop *
Jakub Jelinek 327d37
+#  -mcmodel=large GD -> IE because variable is referenced through IE too
Jakub Jelinek 327d37
+#				-> R_X86_64_TPOFF64	sg2
Jakub Jelinek 327d37
+ +11dc:	64 48 8b 04 25 00 00[ 	]+mov    %fs:0x0,%rax
Jakub Jelinek 327d37
+ +11e3:	00 00 
Jakub Jelinek 327d37
+ +11e5:	48 03 05 ([0-9a-f]{2} ){4}[ 	]+add    0x[0-9a-f]+\(%rip\),%rax +# [0-9a-f]+ <_DYNAMIC\+0x1a0>
Jakub Jelinek 327d37
+#				-> R_X86_64_TPOFF64	sg2
Jakub Jelinek 327d37
+ +11ec:	66 0f 1f 44 00 00[ 	]+nopw   0x0\(%rax,%rax,1\)
Jakub Jelinek 327d37
+ +11f2:	90[ 	]+nop *
Jakub Jelinek 327d37
+ +11f3:	90[ 	]+nop *
Jakub Jelinek 327d37
+ +11f4:	90[ 	]+nop *
Jakub Jelinek 327d37
+ +11f5:	90[ 	]+nop *
Jakub Jelinek 327d37
+#  -mcmodel=large GD against local variable
Jakub Jelinek 327d37
+ +11f6:	48 8d 3d ([0-9a-f]{2} ){4}[ 	]+lea    0x[0-9a-f]+\(%rip\),%rdi +# [0-9a-f]+ <_DYNAMIC\+0x130>
Jakub Jelinek 327d37
+#				-> R_X86_64_DTPMOD64	[0 0x2000000000000000]
Jakub Jelinek 327d37
+ +11fd:	48 b8 ([0-9a-f]{2} ){5}[ 	]+movabs \$0x[0-9a-f]+,%rax
Jakub Jelinek 327d37
+#				-> R_X86_64_JUMP_SLOT	__tls_get_addr
Jakub Jelinek 327d37
+ +1204:	([0-9a-f]{2} ){3}
Jakub Jelinek 327d37
+ +1207:	48 01 d8[ 	]+add    %rbx,%rax
Jakub Jelinek 327d37
+ +120a:	ff d0[ 	]+callq  \*%rax
Jakub Jelinek 327d37
+ +120c:	90[ 	]+nop *
Jakub Jelinek 327d37
+ +120d:	90[ 	]+nop *
Jakub Jelinek 327d37
+ +120e:	90[ 	]+nop *
Jakub Jelinek 327d37
+ +120f:	90[ 	]+nop *
Jakub Jelinek 327d37
+#  -mcmodel=large GD -> IE against local variable referenced through IE too
Jakub Jelinek 327d37
+ +1210:	64 48 8b 04 25 00 00[ 	]+mov    %fs:0x0,%rax
Jakub Jelinek 327d37
+ +1217:	00 00 
Jakub Jelinek 327d37
+ +1219:	48 03 05 ([0-9a-f]{2} ){4}[ 	]+add    0x[0-9a-f]+\(%rip\),%rax +# [0-9a-f]+ <_DYNAMIC\+0x140>
Jakub Jelinek 327d37
+#				-> R_X86_64_TPOFF64	*ABS*+0x24
Jakub Jelinek 327d37
+ +1220:	66 0f 1f 44 00 00[ 	]+nopw   0x0\(%rax,%rax,1\)
Jakub Jelinek 327d37
+ +1226:	90[ 	]+nop *
Jakub Jelinek 327d37
+ +1227:	90[ 	]+nop *
Jakub Jelinek 327d37
+ +1228:	90[ 	]+nop *
Jakub Jelinek 327d37
+ +1229:	90[ 	]+nop *
Jakub Jelinek 327d37
+#  -mcmodel=large GD against hidden and local variable
Jakub Jelinek 327d37
+ +122a:	48 8d 3d ([0-9a-f]{2} ){4}[ 	]+lea    0x[0-9a-f]+\(%rip\),%rdi +# [0-9a-f]+ <_DYNAMIC\+0x1a8>
Jakub Jelinek 327d37
+#				-> R_X86_64_DTPMOD64	[0 0x4000000000000000]
Jakub Jelinek 327d37
+ +1231:	48 b8 ([0-9a-f]{2} ){5}[ 	]+movabs \$0x[0-9a-f]+,%rax
Jakub Jelinek 327d37
+#				-> R_X86_64_JUMP_SLOT	__tls_get_addr
Jakub Jelinek 327d37
+ +1238:	([0-9a-f]{2} ){3}
Jakub Jelinek 327d37
+ +123b:	48 01 d8[ 	]+add    %rbx,%rax
Jakub Jelinek 327d37
+ +123e:	ff d0[ 	]+callq  \*%rax
Jakub Jelinek 327d37
+ +1240:	90[ 	]+nop *
Jakub Jelinek 327d37
+ +1241:	90[ 	]+nop *
Jakub Jelinek 327d37
+ +1242:	90[ 	]+nop *
Jakub Jelinek 327d37
+ +1243:	90[ 	]+nop *
Jakub Jelinek 327d37
+#  -mcmodel=large GD -> IE against hidden and local variable referenced through IE too
Jakub Jelinek 327d37
+ +1244:	64 48 8b 04 25 00 00[ 	]+mov    %fs:0x0,%rax
Jakub Jelinek 327d37
+ +124b:	00 00 
Jakub Jelinek 327d37
+ +124d:	48 03 05 ([0-9a-f]{2} ){4}[ 	]+add    0x[0-9a-f]+\(%rip\),%rax +# [0-9a-f]+ <_DYNAMIC\+0x1b8>
Jakub Jelinek 327d37
+#				-> R_X86_64_TPOFF64	*ABS*+0x44
Jakub Jelinek 327d37
+ +1254:	66 0f 1f 44 00 00[ 	]+nopw   0x0\(%rax,%rax,1\)
Jakub Jelinek 327d37
+ +125a:	90[ 	]+nop *
Jakub Jelinek 327d37
+ +125b:	90[ 	]+nop *
Jakub Jelinek 327d37
+ +125c:	90[ 	]+nop *
Jakub Jelinek 327d37
+ +125d:	90[ 	]+nop *
Jakub Jelinek 327d37
+#  -mcmodel=large GD against hidden but not local variable
Jakub Jelinek 327d37
+ +125e:	48 8d 3d ([0-9a-f]{2} ){4}[ 	]+lea    0x[0-9a-f]+\(%rip\),%rdi +# [0-9a-f]+ <_DYNAMIC\+0x160>
Jakub Jelinek 327d37
+#				-> R_X86_64_DTPMOD64	[0 0x6000000000000000]
Jakub Jelinek 327d37
+ +1265:	48 b8 ([0-9a-f]{2} ){5}[ 	]+movabs \$0x[0-9a-f]+,%rax
Jakub Jelinek 327d37
+#				-> R_X86_64_JUMP_SLOT	__tls_get_addr
Jakub Jelinek 327d37
+ +126c:	([0-9a-f]{2} ){3}
Jakub Jelinek 327d37
+ +126f:	48 01 d8[ 	]+add    %rbx,%rax
Jakub Jelinek 327d37
+ +1272:	ff d0[ 	]+callq  \*%rax
Jakub Jelinek 327d37
+ +1274:	90[ 	]+nop *
Jakub Jelinek 327d37
+ +1275:	90[ 	]+nop *
Jakub Jelinek 327d37
+ +1276:	90[ 	]+nop *
Jakub Jelinek 327d37
+ +1277:	90[ 	]+nop *
Jakub Jelinek 327d37
+#  -mcmodel=large GD -> IE against hidden but not local variable referenced through IE too
Jakub Jelinek 327d37
+ +1278:	64 48 8b 04 25 00 00[ 	]+mov    %fs:0x0,%rax
Jakub Jelinek 327d37
+ +127f:	00 00 
Jakub Jelinek 327d37
+ +1281:	48 03 05 ([0-9a-f]{2} ){4}[ 	]+add    0x[0-9a-f]+\(%rip\),%rax +# [0-9a-f]+ <_DYNAMIC\+0x170>
Jakub Jelinek 327d37
+#				-> R_X86_64_TPOFF64	*ABS*+0x64
Jakub Jelinek 327d37
+ +1288:	66 0f 1f 44 00 00[ 	]+nopw   0x0\(%rax,%rax,1\)
Jakub Jelinek 327d37
+ +128e:	90[ 	]+nop *
Jakub Jelinek 327d37
+ +128f:	90[ 	]+nop *
Jakub Jelinek 327d37
+ +1290:	90[ 	]+nop *
Jakub Jelinek 327d37
+ +1291:	90[ 	]+nop *
Jakub Jelinek 327d37
+#  -mcmodel=large LD
Jakub Jelinek 327d37
+ +1292:	48 8d 3d ([0-9a-f]{2} ){4}[ 	]+lea    0x[0-9a-f]+\(%rip\),%rdi +# [0-9a-f]+ <_DYNAMIC\+0x150>
Jakub Jelinek 327d37
+#				-> R_X86_64_DTPMOD64	[0 0x000000000000000]
Jakub Jelinek 327d37
+ +1299:	48 b8 ([0-9a-f]{2} ){5}[ 	]+movabs \$0x[0-9a-f]+,%rax
Jakub Jelinek 327d37
+#				-> R_X86_64_JUMP_SLOT	__tls_get_addr
Jakub Jelinek 327d37
+ +12a0:	([0-9a-f]{2} ){3}
Jakub Jelinek 327d37
+ +12a3:	48 01 d8[ 	]+add    %rbx,%rax
Jakub Jelinek 327d37
+ +12a6:	ff d0[ 	]+callq  \*%rax
Jakub Jelinek 327d37
+ +12a8:	90[ 	]+nop *
Jakub Jelinek 327d37
+ +12a9:	90[ 	]+nop *
Jakub Jelinek 327d37
+ +12aa:	48 8d 90 20 00 00 00[ 	]+lea    0x20\(%rax\),%rdx
Jakub Jelinek 327d37
+ +12b1:	90[ 	]+nop *
Jakub Jelinek 327d37
+ +12b2:	90[ 	]+nop *
Jakub Jelinek 327d37
+ +12b3:	4c 8d 88 26 00 00 00[ 	]+lea    0x26\(%rax\),%r9
Jakub Jelinek 327d37
+ +12ba:	90[ 	]+nop *
Jakub Jelinek 327d37
+ +12bb:	90[ 	]+nop *
Jakub Jelinek 327d37
+ +12bc:	90[ 	]+nop *
Jakub Jelinek 327d37
+ +12bd:	90[ 	]+nop *
Jakub Jelinek 327d37
+#  -mcmodel=large LD against hidden and local variables
Jakub Jelinek 327d37
+ +12be:	48 8d 3d ([0-9a-f]{2} ){4}[ 	]+lea    0x[0-9a-f]+\(%rip\),%rdi +# [0-9a-f]+ <_DYNAMIC\+0x150>
Jakub Jelinek 327d37
+#				-> R_X86_64_DTPMOD64	[0 0x000000000000000]
Jakub Jelinek 327d37
+ +12c5:	48 b8 ([0-9a-f]{2} ){5}[ 	]+movabs \$0x[0-9a-f]+,%rax
Jakub Jelinek 327d37
+#				-> R_X86_64_JUMP_SLOT	__tls_get_addr
Jakub Jelinek 327d37
+ +12cc:	([0-9a-f]{2} ){3}
Jakub Jelinek 327d37
+ +12cf:	48 01 d8[ 	]+add    %rbx,%rax
Jakub Jelinek 327d37
+ +12d2:	ff d0[ 	]+callq  \*%rax
Jakub Jelinek 327d37
+ +12d4:	90[ 	]+nop *
Jakub Jelinek 327d37
+ +12d5:	90[ 	]+nop *
Jakub Jelinek 327d37
+ +12d6:	48 8d 90 40 00 00 00[ 	]+lea    0x40\(%rax\),%rdx
Jakub Jelinek 327d37
+ +12dd:	90[ 	]+nop *
Jakub Jelinek 327d37
+ +12de:	90[ 	]+nop *
Jakub Jelinek 327d37
+ +12df:	48 8d 88 47 00 00 00[ 	]+lea    0x47\(%rax\),%rcx
Jakub Jelinek 327d37
+ +12e6:	90[ 	]+nop *
Jakub Jelinek 327d37
+ +12e7:	90[ 	]+nop *
Jakub Jelinek 327d37
+ +12e8:	90[ 	]+nop *
Jakub Jelinek 327d37
+ +12e9:	90[ 	]+nop *
Jakub Jelinek 327d37
+#  -mcmodel=large LD against hidden but not local variables
Jakub Jelinek 327d37
+ +12ea:	48 8d 3d ([0-9a-f]{2} ){4}[ 	]+lea    0x[0-9a-f]+\(%rip\),%rdi +# [0-9a-f]+ <_DYNAMIC\+0x150>
Jakub Jelinek 327d37
+#				-> R_X86_64_DTPMOD64	[0 0x000000000000000]
Jakub Jelinek 327d37
+ +12f1:	48 b8 ([0-9a-f]{2} ){5}[ 	]+movabs \$0x[0-9a-f]+,%rax
Jakub Jelinek 327d37
+#				-> R_X86_64_JUMP_SLOT	__tls_get_addr
Jakub Jelinek 327d37
+ +12f8:	([0-9a-f]{2} ){3}
Jakub Jelinek 327d37
+ +12fb:	48 01 d8[ 	]+add    %rbx,%rax
Jakub Jelinek 327d37
+ +12fe:	ff d0[ 	]+callq  \*%rax
Jakub Jelinek 327d37
+ +1300:	90[ 	]+nop *
Jakub Jelinek 327d37
+ +1301:	90[ 	]+nop *
Jakub Jelinek 327d37
+ +1302:	4c 8d a0 60 00 00 00[ 	]+lea    0x60\(%rax\),%r12
Jakub Jelinek 327d37
+ +1309:	90[ 	]+nop *
Jakub Jelinek 327d37
+ +130a:	90[ 	]+nop *
Jakub Jelinek 327d37
+ +130b:	48 8d 88 65 00 00 00[ 	]+lea    0x65\(%rax\),%rcx
Jakub Jelinek 327d37
+ +1312:	90[ 	]+nop *
Jakub Jelinek 327d37
+ +1313:	90[ 	]+nop *
Jakub Jelinek 327d37
+ +1314:	90[ 	]+nop *
Jakub Jelinek 327d37
+ +1315:	90[ 	]+nop *
Jakub Jelinek 327d37
+ +1316:	5b[ 	]+pop    %rbx
Jakub Jelinek 327d37
+ +1317:	5b[ 	]+pop    %rbx
Jakub Jelinek 327d37
+ +1318:	c9[ 	]+leaveq *
Jakub Jelinek 327d37
+ +1319:	c3[ 	]+retq *
Jakub Jelinek 327d37
+ +131a:	66 90[ 	]+xchg   %ax,%ax
Jakub Jelinek 327d37
--- ld/testsuite/ld-x86-64/tlsld3.dd.jj	2013-08-28 18:58:29.020210650 +0200
Jakub Jelinek 327d37
+++ ld/testsuite/ld-x86-64/tlsld3.dd	2013-08-28 20:55:12.959317891 +0200
Jakub Jelinek 327d37
@@ -0,0 +1,23 @@
Jakub Jelinek 327d37
+#source: tlsld3.s
Jakub Jelinek 327d37
+#as: --64
Jakub Jelinek 327d37
+#ld: -melf_x86_64 tmpdir/tlsld3
Jakub Jelinek 327d37
+#objdump: -drw
Jakub Jelinek 327d37
+#target: x86_64-*-linux*
Jakub Jelinek 327d37
+
Jakub Jelinek 327d37
+.*: +file format .*
Jakub Jelinek 327d37
+
Jakub Jelinek 327d37
+Disassembly of section .text:
Jakub Jelinek 327d37
+
Jakub Jelinek 327d37
+[a-f0-9]+ <_start>:
Jakub Jelinek 327d37
+[ 	]*[a-f0-9]+:	49 bb ([0-9a-f]{2} ){8}	movabs \$0x[0-9a-f]+,%r11
Jakub Jelinek 327d37
+[ 	]*[a-f0-9]+:	53                   	push   %rbx
Jakub Jelinek 327d37
+[ 	]*[a-f0-9]+:	53                   	push   %rbx
Jakub Jelinek 327d37
+[ 	]*[a-f0-9]+:	48 8d 1d ed ff ff ff 	lea    -0x13\(%rip\),%rbx        # [0-9a-f]+ <_start>
Jakub Jelinek 327d37
+[ 	]*[a-f0-9]+:	4c 01 db             	add    %r11,%rbx
Jakub Jelinek 327d37
+[ 	]*[a-f0-9]+:	66 66 66 66 2e 0f 1f 84 00 00 00 00 00 	data32 data32 data32 nopw %cs:0x0\(%rax,%rax,1\)
Jakub Jelinek 327d37
+[ 	]*[a-f0-9]+:	64 48 8b 04 25 00 00 00 00 	mov    %fs:0x0,%rax
Jakub Jelinek 327d37
+[ 	]*[a-f0-9]+:	8b 80 fc ff ff ff    	mov    -0x4\(%rax\),%eax
Jakub Jelinek 327d37
+[ 	]*[a-f0-9]+:	5b                   	pop    %rbx
Jakub Jelinek 327d37
+[ 	]*[a-f0-9]+:	5b                   	pop    %rbx
Jakub Jelinek 327d37
+[ 	]*[a-f0-9]+:	c3                   	retq   
Jakub Jelinek 327d37
+#pass
Jakub Jelinek 327d37
--- ld/testsuite/ld-x86-64/tlsld3.s.jj	2013-08-28 18:44:26.341741095 +0200
Jakub Jelinek 327d37
+++ ld/testsuite/ld-x86-64/tlsld3.s	2013-08-28 20:50:53.190720964 +0200
Jakub Jelinek 327d37
@@ -0,0 +1,27 @@
Jakub Jelinek 327d37
+	.text
Jakub Jelinek 327d37
+	.globl _start
Jakub Jelinek 327d37
+_start:
Jakub Jelinek 327d37
+1:	movabsq	$_GLOBAL_OFFSET_TABLE_-1b, %r11
Jakub Jelinek 327d37
+	pushq	%rbx
Jakub Jelinek 327d37
+	pushq	%rbx
Jakub Jelinek 327d37
+	leaq	1b(%rip), %rbx
Jakub Jelinek 327d37
+	addq	%r11, %rbx
Jakub Jelinek 327d37
+
Jakub Jelinek 327d37
+	/* LD, -mcmodel=large  */
Jakub Jelinek 327d37
+	leaq	foo@tlsld(%rip), %rdi
Jakub Jelinek 327d37
+	movabsq	$__tls_get_addr@pltoff, %rax
Jakub Jelinek 327d37
+	addq	%rbx, %rax
Jakub Jelinek 327d37
+	call	*%rax
Jakub Jelinek 327d37
+
Jakub Jelinek 327d37
+	movl	foo@dtpoff(%rax), %eax
Jakub Jelinek 327d37
+
Jakub Jelinek 327d37
+	popq	%rbx
Jakub Jelinek 327d37
+	popq	%rbx
Jakub Jelinek 327d37
+	ret
Jakub Jelinek 327d37
+	.globl foo
Jakub Jelinek 327d37
+	.section	.tdata,"awT",@progbits
Jakub Jelinek 327d37
+	.align 4
Jakub Jelinek 327d37
+	.type	foo, @object
Jakub Jelinek 327d37
+	.size	foo, 4
Jakub Jelinek 327d37
+foo:
Jakub Jelinek 327d37
+	.long	100
Jakub Jelinek 327d37
--- ld/testsuite/ld-x86-64/tlspic.rd.jj	2013-08-13 13:42:26.000000000 +0200
Jakub Jelinek 327d37
+++ ld/testsuite/ld-x86-64/tlspic.rd	2013-08-28 23:16:49.751620744 +0200
Jakub Jelinek 327d37
@@ -16,12 +16,12 @@ Section Headers:
Jakub Jelinek 327d37
  +\[[ 0-9]+\] .rela.dyn +.*
Jakub Jelinek 327d37
  +\[[ 0-9]+\] .rela.plt +.*
Jakub Jelinek 327d37
  +\[[ 0-9]+\] .plt +.*
Jakub Jelinek 327d37
- +\[[ 0-9]+\] .text +PROGBITS +0+1000 0+1000 0+1ac 00 +AX +0 +0 4096
Jakub Jelinek 327d37
- +\[[ 0-9]+\] .tdata +PROGBITS +0+2011ac 0+11ac 0+60 00 WAT +0 +0 +1
Jakub Jelinek 327d37
- +\[[ 0-9]+\] .tbss +NOBITS +0+20120c 0+120c 0+20 00 WAT +0 +0 +1
Jakub Jelinek 327d37
- +\[[ 0-9]+\] .dynamic +DYNAMIC +0+201210 0+1210 0+130 10 +WA +3 +0 +8
Jakub Jelinek 327d37
- +\[[ 0-9]+\] .got +PROGBITS +0+201340 0+1340 0+90 08 +WA +0 +0 +8
Jakub Jelinek 327d37
- +\[[ 0-9]+\] .got.plt +PROGBITS +0+2013d0 0+13d0 0+20 08 +WA +0 +0 +8
Jakub Jelinek 327d37
+ +\[[ 0-9]+\] .text +PROGBITS +0+1000 0+1000 0+31c 00 +AX +0 +0 4096
Jakub Jelinek 327d37
+ +\[[ 0-9]+\] .tdata +PROGBITS +0+20131c 0+131c 0+60 00 WAT +0 +0 +1
Jakub Jelinek 327d37
+ +\[[ 0-9]+\] .tbss +NOBITS +0+20137c 0+137c 0+20 00 WAT +0 +0 +1
Jakub Jelinek 327d37
+ +\[[ 0-9]+\] .dynamic +DYNAMIC +0+201380 0+1380 0+130 10 +WA +3 +0 +8
Jakub Jelinek 327d37
+ +\[[ 0-9]+\] .got +PROGBITS +0+2014b0 0+14b0 0+90 08 +WA +0 +0 +8
Jakub Jelinek 327d37
+ +\[[ 0-9]+\] .got.plt +PROGBITS +0+201540 0+1540 0+20 08 +WA +0 +0 +8
Jakub Jelinek 327d37
  +\[[ 0-9]+\] .shstrtab +.*
Jakub Jelinek 327d37
  +\[[ 0-9]+\] .symtab +.*
Jakub Jelinek 327d37
  +\[[ 0-9]+\] .strtab +.*
Jakub Jelinek 327d37
@@ -37,9 +37,9 @@ There are [0-9]+ program headers, starti
Jakub Jelinek 327d37
 Program Headers:
Jakub Jelinek 327d37
  +Type +Offset +VirtAddr +PhysAddr +FileSiz +MemSiz +Flg Align
Jakub Jelinek 327d37
  +LOAD +0x0+ 0x0+ 0x0+ 0x[0-9a-f]+ 0x[0-9a-f]+ R E 0x200000
Jakub Jelinek 327d37
- +LOAD +0x0+11ac 0x0+2011ac 0x0+2011ac 0x0+244 0x0+244 RW +0x200000
Jakub Jelinek 327d37
- +DYNAMIC +0x0+1210 0x0+201210 0x0+201210 0x0+130 0x0+130 RW +0x8
Jakub Jelinek 327d37
- +TLS +0x0+11ac 0x0+2011ac 0x0+2011ac 0x0+60 0x0+80 R +0x1
Jakub Jelinek 327d37
+ +LOAD +0x0+131c 0x0+20131c 0x0+20131c 0x0+244 0x0+244 RW +0x200000
Jakub Jelinek 327d37
+ +DYNAMIC +0x0+1380 0x0+201380 0x0+201380 0x0+130 0x0+130 RW +0x8
Jakub Jelinek 327d37
+ +TLS +0x0+131c 0x0+20131c 0x0+20131c 0x0+60 0x0+80 R +0x1
Jakub Jelinek 327d37
 
Jakub Jelinek 327d37
  Section to Segment mapping:
Jakub Jelinek 327d37
  +Segment Sections...
Jakub Jelinek 327d37
--- ld/testsuite/ld-x86-64/tlspic1.s.jj	2013-04-24 09:05:15.000000000 +0200
Jakub Jelinek 327d37
+++ ld/testsuite/ld-x86-64/tlspic1.s	2013-08-28 23:01:42.774606954 +0200
Jakub Jelinek 327d37
@@ -183,5 +183,108 @@ fn1:
Jakub Jelinek 327d37
 	movq	%fs:(%rcx), %rdx
Jakub Jelinek 327d37
 	nop;nop;nop;nop
Jakub Jelinek 327d37
 
Jakub Jelinek 327d37
+1:	movabsq	$_GLOBAL_OFFSET_TABLE_-1b, %r11
Jakub Jelinek 327d37
+	pushq	%rbx
Jakub Jelinek 327d37
+	pushq	%rbx
Jakub Jelinek 327d37
+	leaq	1b(%rip), %rbx
Jakub Jelinek 327d37
+	addq	%r11, %rbx
Jakub Jelinek 327d37
+	nop;nop;nop;nop
Jakub Jelinek 327d37
+
Jakub Jelinek 327d37
+	/* -mcmodel=large sequences  */
Jakub Jelinek 327d37
+
Jakub Jelinek 327d37
+	/* -mcmodel=large GD  */
Jakub Jelinek 327d37
+	leaq	sg1@tlsgd(%rip), %rdi
Jakub Jelinek 327d37
+	movabsq	$__tls_get_addr@pltoff, %rax
Jakub Jelinek 327d37
+	addq	%rbx, %rax
Jakub Jelinek 327d37
+	call	*%rax
Jakub Jelinek 327d37
+	nop;nop;nop;nop
Jakub Jelinek 327d37
+
Jakub Jelinek 327d37
+	/* -mcmodel=large GD -> IE because variable is referenced through IE too */
Jakub Jelinek 327d37
+	leaq	sg2@tlsgd(%rip), %rdi
Jakub Jelinek 327d37
+	movabsq	$__tls_get_addr@pltoff, %rax
Jakub Jelinek 327d37
+	addq	%rbx, %rax
Jakub Jelinek 327d37
+	call	*%rax
Jakub Jelinek 327d37
+	nop;nop;nop;nop
Jakub Jelinek 327d37
+
Jakub Jelinek 327d37
+	/* -mcmodel=large GD against local variable */
Jakub Jelinek 327d37
+	leaq	sl1@tlsgd(%rip), %rdi
Jakub Jelinek 327d37
+	movabsq	$__tls_get_addr@pltoff, %rax
Jakub Jelinek 327d37
+	addq	%rbx, %rax
Jakub Jelinek 327d37
+	call	*%rax
Jakub Jelinek 327d37
+	nop;nop;nop;nop
Jakub Jelinek 327d37
+
Jakub Jelinek 327d37
+	/* -mcmodel=large GD -> IE against local variable referenced through IE too */
Jakub Jelinek 327d37
+	leaq	sl2@tlsgd(%rip), %rdi
Jakub Jelinek 327d37
+	movabsq	$__tls_get_addr@pltoff, %rax
Jakub Jelinek 327d37
+	addq	%rbx, %rax
Jakub Jelinek 327d37
+	call	*%rax
Jakub Jelinek 327d37
+	nop;nop;nop;nop
Jakub Jelinek 327d37
+
Jakub Jelinek 327d37
+	/* -mcmodel=large GD against hidden and local variable */
Jakub Jelinek 327d37
+	leaq	sh1@tlsgd(%rip), %rdi
Jakub Jelinek 327d37
+	movabsq	$__tls_get_addr@pltoff, %rax
Jakub Jelinek 327d37
+	addq	%rbx, %rax
Jakub Jelinek 327d37
+	call	*%rax
Jakub Jelinek 327d37
+	nop;nop;nop;nop
Jakub Jelinek 327d37
+
Jakub Jelinek 327d37
+	/* -mcmodel=large GD -> IE against hidden and local variable referenced through
Jakub Jelinek 327d37
+	   IE too */
Jakub Jelinek 327d37
+	leaq	sh2@tlsgd(%rip), %rdi
Jakub Jelinek 327d37
+	movabsq	$__tls_get_addr@pltoff, %rax
Jakub Jelinek 327d37
+	addq	%rbx, %rax
Jakub Jelinek 327d37
+	call	*%rax
Jakub Jelinek 327d37
+	nop;nop;nop;nop
Jakub Jelinek 327d37
+
Jakub Jelinek 327d37
+	/* -mcmodel=large GD against hidden but not local variable */
Jakub Jelinek 327d37
+	leaq	sH1@tlsgd(%rip), %rdi
Jakub Jelinek 327d37
+	movabsq	$__tls_get_addr@pltoff, %rax
Jakub Jelinek 327d37
+	addq	%rbx, %rax
Jakub Jelinek 327d37
+	call	*%rax
Jakub Jelinek 327d37
+	nop;nop;nop;nop
Jakub Jelinek 327d37
+
Jakub Jelinek 327d37
+	/* -mcmodel=large GD -> IE against hidden but not local variable referenced through
Jakub Jelinek 327d37
+	   IE too */
Jakub Jelinek 327d37
+	leaq	sH2@tlsgd(%rip), %rdi
Jakub Jelinek 327d37
+	movabsq	$__tls_get_addr@pltoff, %rax
Jakub Jelinek 327d37
+	addq	%rbx, %rax
Jakub Jelinek 327d37
+	call	*%rax
Jakub Jelinek 327d37
+	nop;nop;nop;nop
Jakub Jelinek 327d37
+
Jakub Jelinek 327d37
+	/* -mcmodel=large LD */
Jakub Jelinek 327d37
+	leaq	sl1@tlsld(%rip), %rdi
Jakub Jelinek 327d37
+	movabsq	$__tls_get_addr@pltoff, %rax
Jakub Jelinek 327d37
+	addq	%rbx, %rax
Jakub Jelinek 327d37
+	call	*%rax
Jakub Jelinek 327d37
+	nop;nop
Jakub Jelinek 327d37
+	leaq	sl1@dtpoff(%rax), %rdx
Jakub Jelinek 327d37
+	nop;nop
Jakub Jelinek 327d37
+	leaq	2+sl2@dtpoff(%rax), %r9
Jakub Jelinek 327d37
+	nop;nop;nop;nop
Jakub Jelinek 327d37
+
Jakub Jelinek 327d37
+	/* -mcmodel=large LD against hidden and local variables */
Jakub Jelinek 327d37
+	leaq	sh1@tlsld(%rip), %rdi
Jakub Jelinek 327d37
+	movabsq	$__tls_get_addr@pltoff, %rax
Jakub Jelinek 327d37
+	addq	%rbx, %rax
Jakub Jelinek 327d37
+	call	*%rax
Jakub Jelinek 327d37
+	nop;nop
Jakub Jelinek 327d37
+	leaq	sh1@dtpoff(%rax), %rdx
Jakub Jelinek 327d37
+	nop;nop
Jakub Jelinek 327d37
+	leaq	sh2@dtpoff+3(%rax), %rcx
Jakub Jelinek 327d37
+	nop;nop;nop;nop
Jakub Jelinek 327d37
+
Jakub Jelinek 327d37
+	/* -mcmodel=large LD against hidden but not local variables */
Jakub Jelinek 327d37
+	leaq	sH1@tlsld(%rip), %rdi
Jakub Jelinek 327d37
+	movabsq	$__tls_get_addr@pltoff, %rax
Jakub Jelinek 327d37
+	addq	%rbx, %rax
Jakub Jelinek 327d37
+	call	*%rax
Jakub Jelinek 327d37
+	nop;nop
Jakub Jelinek 327d37
+	leaq	sH1@dtpoff(%rax), %r12
Jakub Jelinek 327d37
+	nop;nop
Jakub Jelinek 327d37
+	leaq	sH2@dtpoff+1(%rax), %rcx
Jakub Jelinek 327d37
+	nop;nop;nop;nop
Jakub Jelinek 327d37
+
Jakub Jelinek 327d37
+	popq	%rbx
Jakub Jelinek 327d37
+	popq	%rbx
Jakub Jelinek 327d37
+
Jakub Jelinek 327d37
 	leave
Jakub Jelinek 327d37
 	ret
Jakub Jelinek 327d37
--- ld/testsuite/ld-x86-64/x86-64.exp.jj	2013-08-28 17:33:33.000000000 +0200
Jakub Jelinek 327d37
+++ ld/testsuite/ld-x86-64/x86-64.exp	2013-08-29 12:02:27.972052125 +0200
Jakub Jelinek 327d37
@@ -124,6 +124,15 @@ set x86_64tests {
Jakub Jelinek 327d37
     {"TLS X32 LD->LE transition" "-melf32_x86_64" ""
Jakub Jelinek 327d37
      "--x32" {tlsld2.s}
Jakub Jelinek 327d37
      {{objdump -dwr tlsld2.dd}} "tlsld2"}
Jakub Jelinek 327d37
+    {"TLS -mcmodel=large GD->LE transition" "-melf_x86_64" ""
Jakub Jelinek 327d37
+     "--64" {tlsgd7.s}
Jakub Jelinek 327d37
+     {{objdump -dwr tlsgd7.dd}} "tlsgd7"}
Jakub Jelinek 327d37
+    {"TLS -mcmodel=large LD->LE transition" "-melf_x86_64" ""
Jakub Jelinek 327d37
+     "--64" {tlsld3.s}
Jakub Jelinek 327d37
+     {{objdump -dwr tlsld3.dd}} "tlsld3"}
Jakub Jelinek 327d37
+    {"TLS -mcmodel=large GD->IE transition" "-melf_x86_64 tmpdir/libtlsgd5.so" ""
Jakub Jelinek 327d37
+     "--64" {tlsgd8.s}
Jakub Jelinek 327d37
+     {{objdump -dwrj.text tlsgd8.dd}} "tlsgd8"}
Jakub Jelinek 327d37
 
Jakub Jelinek 327d37
      {"build 32-bit object with 33 locals" "-melf_x86_64 -e 0" "" "--32" {32bit.s} {{ ld incompatible.l }} "dummy" }
Jakub Jelinek 327d37
      {"build 64-bit object" "-melf_x86_64 -e 0 --defsym foo=1" "" "--64" {64bit.s} {} "dummy" }
Jakub Jelinek 327d37
--- ld/testsuite/ld-x86-64/tlsgd8.dd.jj	2013-08-28 19:06:04.610777915 +0200
Jakub Jelinek 327d37
+++ ld/testsuite/ld-x86-64/tlsgd8.dd	2013-08-29 12:04:31.221378937 +0200
Jakub Jelinek 327d37
@@ -0,0 +1,23 @@
Jakub Jelinek 327d37
+#source: tlsgd8.s
Jakub Jelinek 327d37
+#as: --64
Jakub Jelinek 327d37
+#ld: -melf_x86_64 tmpdir/tlsgd8
Jakub Jelinek 327d37
+#objdump: -drwj.text
Jakub Jelinek 327d37
+#target: x86_64-*-linux* x86_64-*-nacl*
Jakub Jelinek 327d37
+
Jakub Jelinek 327d37
+.*: +file format .*
Jakub Jelinek 327d37
+
Jakub Jelinek 327d37
+Disassembly of section .text:
Jakub Jelinek 327d37
+
Jakub Jelinek 327d37
+[a-f0-9]+ <_start>:
Jakub Jelinek 327d37
+[ 	]*[a-f0-9]+:	49 bb ([0-9a-f]{2} ){8}	movabs \$0x[0-9a-f]+,%r11
Jakub Jelinek 327d37
+[ 	]*[a-f0-9]+:	53                   	push   %rbx
Jakub Jelinek 327d37
+[ 	]*[a-f0-9]+:	53                   	push   %rbx
Jakub Jelinek 327d37
+[ 	]*[a-f0-9]+:	48 8d 1d ed ff ff ff 	lea    -0x13\(%rip\),%rbx        # [0-9a-f]+ <_start>
Jakub Jelinek 327d37
+[ 	]*[a-f0-9]+:	4c 01 db             	add    %r11,%rbx
Jakub Jelinek 327d37
+[ 	]*[a-f0-9]+:	64 48 8b 04 25 00 00 00 00 	mov    %fs:0x0,%rax
Jakub Jelinek 327d37
+[ 	]*[a-f0-9]+:	48 03 05 ([0-9a-f]{2} ){4}	add    0x[0-9a-f]+\(%rip\),%rax        # [0-9a-f]+ <_DYNAMIC\+0x140>
Jakub Jelinek 327d37
+[ 	]*[a-f0-9]+:	66 0f 1f 44 00 00    	nopw   0x0\(%rax,%rax,1\)
Jakub Jelinek 327d37
+[ 	]*[a-f0-9]+:	5b                   	pop    %rbx
Jakub Jelinek 327d37
+[ 	]*[a-f0-9]+:	5b                   	pop    %rbx
Jakub Jelinek 327d37
+[ 	]*[a-f0-9]+:	c3                   	retq   
Jakub Jelinek 327d37
+#pass
Jakub Jelinek 327d37
--- ld/testsuite/ld-x86-64/tlsgd7.s.jj	2013-08-28 18:38:50.655538216 +0200
Jakub Jelinek 327d37
+++ ld/testsuite/ld-x86-64/tlsgd7.s	2013-08-28 19:14:44.906981548 +0200
Jakub Jelinek 327d37
@@ -0,0 +1,25 @@
Jakub Jelinek 327d37
+	.text
Jakub Jelinek 327d37
+	.globl _start
Jakub Jelinek 327d37
+_start:
Jakub Jelinek 327d37
+1:	movabsq	$_GLOBAL_OFFSET_TABLE_-1b, %r11
Jakub Jelinek 327d37
+	pushq	%rbx
Jakub Jelinek 327d37
+	pushq	%rbx
Jakub Jelinek 327d37
+	leaq	1b(%rip), %rbx
Jakub Jelinek 327d37
+	addq	%r11, %rbx
Jakub Jelinek 327d37
+
Jakub Jelinek 327d37
+	/* GD, -mcmodel=large  */
Jakub Jelinek 327d37
+	leaq	foo@tlsgd(%rip), %rdi
Jakub Jelinek 327d37
+	movabsq	$__tls_get_addr@pltoff, %rax
Jakub Jelinek 327d37
+	addq	%rbx, %rax
Jakub Jelinek 327d37
+	call	*%rax
Jakub Jelinek 327d37
+
Jakub Jelinek 327d37
+	popq	%rbx
Jakub Jelinek 327d37
+	popq	%rbx
Jakub Jelinek 327d37
+	ret
Jakub Jelinek 327d37
+	.globl foo
Jakub Jelinek 327d37
+	.section	.tdata,"awT",@progbits
Jakub Jelinek 327d37
+	.align 4
Jakub Jelinek 327d37
+	.type	foo, @object
Jakub Jelinek 327d37
+	.size	foo, 4
Jakub Jelinek 327d37
+foo:
Jakub Jelinek 327d37
+	.long	100
Jakub Jelinek 327d37
--- ld/testsuite/ld-x86-64/tlsgd8.s.jj	2013-08-28 19:05:37.528923105 +0200
Jakub Jelinek 327d37
+++ ld/testsuite/ld-x86-64/tlsgd8.s	2013-08-28 19:15:22.181782577 +0200
Jakub Jelinek 327d37
@@ -0,0 +1,18 @@
Jakub Jelinek 327d37
+	.text
Jakub Jelinek 327d37
+	.globl _start
Jakub Jelinek 327d37
+_start:
Jakub Jelinek 327d37
+1:	movabsq	$_GLOBAL_OFFSET_TABLE_-1b, %r11
Jakub Jelinek 327d37
+	pushq	%rbx
Jakub Jelinek 327d37
+	pushq	%rbx
Jakub Jelinek 327d37
+	leaq	1b(%rip), %rbx
Jakub Jelinek 327d37
+	addq	%r11, %rbx
Jakub Jelinek 327d37
+
Jakub Jelinek 327d37
+	/* GD, -mcmodel=large  */
Jakub Jelinek 327d37
+	leaq	foo@tlsgd(%rip), %rdi
Jakub Jelinek 327d37
+	movabsq	$__tls_get_addr@pltoff, %rax
Jakub Jelinek 327d37
+	addq	%rbx, %rax
Jakub Jelinek 327d37
+	call	*%rax
Jakub Jelinek 327d37
+
Jakub Jelinek 327d37
+	popq	%rbx
Jakub Jelinek 327d37
+	popq	%rbx
Jakub Jelinek 327d37
+	ret
Jakub Jelinek 327d37
--- ld/testsuite/ld-x86-64/tlspic-nacl.rd.jj	2013-08-28 17:33:33.000000000 +0200
Jakub Jelinek 327d37
+++ ld/testsuite/ld-x86-64/tlspic-nacl.rd	2013-08-29 12:09:37.464675310 +0200
Jakub Jelinek 327d37
@@ -11,7 +11,7 @@ Section Headers:
Jakub Jelinek 327d37
  +\[Nr\] Name +Type +Address +Off +Size +ES Flg Lk Inf Al
Jakub Jelinek 327d37
  +\[[ 0-9]+\] +NULL +0+ 0+ 0+ 00 +0 +0 +0
Jakub Jelinek 327d37
  +\[[ 0-9]+\] .plt +.*
Jakub Jelinek 327d37
- +\[[ 0-9]+\] .text +PROGBITS +0+1000 [0-9a-f]+ 0+1ac 00 +AX +0 +0 4096
Jakub Jelinek 327d37
+ +\[[ 0-9]+\] .text +PROGBITS +0+1000 [0-9a-f]+ 0+31c 00 +AX +0 +0 4096
Jakub Jelinek 327d37
  +\[[ 0-9]+\] .hash +.*
Jakub Jelinek 327d37
  +\[[ 0-9]+\] .dynsym +.*
Jakub Jelinek 327d37
  +\[[ 0-9]+\] .dynstr +.*