Skip to content
  • Bill Schmidt's avatar
    This patch introduces initial-exec model support for thread-local storage · ca4a0c9d
    Bill Schmidt authored
    on 64-bit PowerPC ELF.
    
    The patch includes code to handle external assembly and MC output with the
    integrated assembler.  It intentionally does not support the "old" JIT.
    
    For the initial-exec TLS model, the ABI requires the following to calculate
    the address of external thread-local variable x:
    
     Code sequence            Relocation                  Symbol
      ld 9,x@got@tprel(2)      R_PPC64_GOT_TPREL16_DS      x
      add 9,9,x@tls            R_PPC64_TLS                 x
    
    The register 9 is arbitrary here.  The linker will replace x@got@tprel
    with the offset relative to the thread pointer to the generated GOT
    entry for symbol x.  It will replace x@tls with the thread-pointer
    register (13).
    
    The two test cases verify correct assembly output and relocation output
    as just described.
    
    PowerPC-specific selection node variants are added for the two
    instructions above:  LD_GOT_TPREL and ADD_TLS.  These are inserted
    when an initial-exec global variable is encountered by
    PPCTargetLowering::LowerGlobalTLSAddress(), and later lowered to
    machine instructions LDgotTPREL and ADD8TLS.  LDgotTPREL is a pseudo
    that uses the same LDrs support added for medium code model's LDtocL,
    with a different relocation type.
    
    The rest of the processing is straightforward.
    
    llvm-svn: 169281
    ca4a0c9d
Loading