[llvm-commits] [PATCH] TLS support for Windows 32+64bit

Kai Nacke kai.nacke at redstar.de
Thu Feb 9 13:01:49 PST 2012


Hi Michael!

I incorporated all your changes. The attached patch also includes the 
suggestions from Eli.

Please, could someone with knowledge of ISelLowering have a look at this 
patch? Thank you!

Regards
Kai

On 03.02.2012 02:56, Michael Spencer wrote:
> On Tue, Jan 24, 2012 at 12:24 PM, Kai<kai at redstar.de>  wrote:
>> Hello,
>>
>> the attached patch adds TLS support for x86_64-pc-win32 and x86-pc-win32.
>> Implemented is the implicit TLS model (__declspec(thread) in Visual C++).
>> This is one of the missing pieces for the Win64 port of
>> LDC (the LLVM based D compiler). It should also be useful for implementing
>> the Microsoft specific TLS extension in Clang.
>>
>> Please review and commit if acceptable. Thank you very much!
>>
>> Regards
>> Kai
> The patch looks good, however, I am not familiar enough with
> ISelLowering to give approval. I've tested it and the behavior matches
> what VC++ generates.
>
> There are some LLVM style issues that I've noted below.
>
> @@ -231,6 +232,12 @@ EmitImmediate(const MCOperand&DispOp, unsigned
> Size, MCFixupKind FixupKind,
>         if (Kind == GOT_Normal)
>           ImmOffset = CurByte;
>       }
> +    else if (Expr->getKind() == MCExpr::SymbolRef) {
> +      const MCSymbolRefExpr *Ref = static_cast<const MCSymbolRefExpr*>(Expr);
> +      if (Ref->getKind() == MCSymbolRefExpr::VK_SECREL) {
> +        FixupKind = MCFixupKind(FK_SecRel_4);
> +      }
> +    }
>
> There should not be a new line between the } and else if.
>
> +    // If GV is an alias then use the aliasee for determining
> +    // thread-localness.
> +    if (const GlobalAlias *GA = dyn_cast<GlobalAlias>(GV))
> +      GV = GA->resolveAliasedGlobal(false);
> +    DebugLoc dl = GA->getDebugLoc();
> +   SDValue Chain = DAG.getEntryNode();
>
> The indentation drops by one space here to the end of the block.
>
> +   if (Subtarget->is64Bit())
> +       IDX = DAG.getExtLoad(ISD::ZEXTLOAD, dl, getPointerTy(), Chain,
> +                            IDX, MachinePointerInfo(), MVT::i32,
> +                            false, false, 0);
> +   else
> +       IDX = DAG.getLoad(getPointerTy(), dl, Chain, IDX, MachinePointerInfo(),
> +                         false, false, false, 0);
>
> These are indented too far. We use two space indentation.
>
> -  assert(Inst.getOperand(0).isReg()&&  Inst.getOperand(ImmOp).isImm()&&
> +  assert(Inst.getOperand(0).isReg()&&
> +	     (Inst.getOperand(ImmOp).isImm() ||
> +		 (Inst.getOperand(ImmOp).isExpr()&&
> +		  Inst.getOperand(ImmOp).getExpr()->getKind() == MCExpr::SymbolRef)&&
> +		  static_cast<const
> MCSymbolRefExpr*>(Inst.getOperand(ImmOp).getExpr())->getKind() ==
> MCSymbolRefExpr::VK_SECREL)&&
>
> This is over 80 columns. It also contains tabs.
>
> +; RUN: llc<  %s -march=x86-64 -mtriple=x86_64-pc-win32>  %t3
> +; RUN: grep {movl	_tls_index(%rip), %eax} %t3
> +; RUN: grep {movabsq	\$i at SECREL, %rcx} %t3
> +; RUN: llc<  %s -march=x86 -mtriple=x86-pc-win32>  %t4
> +; RUN: grep {movl	__tls_index, %eax} %t4
> +; RUN: grep {movl	%fs:__tls_array, %ecx} %t4
> +; RUN: grep {movl	_i at SECREL(%eax), %eax} %t4
>
> You should use FileCheck instead of grep for new tests.
>
> Thanks for working on this. I'm excited to see more work on Windows codegen :)
>
> - Michael Spencer
>

-------------- next part --------------
An embedded and charset-unspecified text was scrubbed...
Name: tls-20120209.diff
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20120209/727cfd3b/attachment.ksh>


More information about the llvm-commits mailing list