[LLVMdev] proposal to simplify isel/asmprinter interaction with globals

Chris Lattner clattner at apple.com
Wed Jun 24 10:21:29 PDT 2009


Ok, not too much screaming :), I'll see what I can do.

-Chris

On Jun 20, 2009, at 7:30 PM, Chris Lattner wrote:

> Hi All,
>
> I'm working on various cleanups and simplifications to the
> asmprinters.  One thing that is driving me nuts is that the
> asmprinters currently "reverse engineer" a lot of information when
> printing an operand that isel had when it created it.
>
> I'm specifically talking about all the suffixes generated by isel,
> like $non_lazy_ptr, @TLSGD, @NTPOFF, (%rip) etc.  These are all
> "magic" things that the assembler uses (for example, it generates a
> reference to a global's GOT entry instead of to the global itself).
>
> The thing that is really frustrating to me is that the asmprinters
> need to reverse engineer what isel *meant* in order to output the
> right thing.  For example, to determine whether to emit $non_lazy_ptr,
> it uses a logic tree like this:
>
>     if (shouldPrintStub(TM, Subtarget)) {
>       // Link-once, declaration, or Weakly-linked global variables  
> need
>       // non-lazily-resolved stubs
>       if (GV->isDeclaration() || GV->isWeakForLinker()) {
>         // Dynamically-resolved functions need a stub for the  
> function.
>         if (GV->hasHiddenVisibility()) {
>           if (!GV->isDeclaration() && !GV->hasCommonLinkage())
>   ...
>           else {
>             printSuffixedName(Name, "$non_lazy_ptr");
>           }
>         } else {
>           printSuffixedName(Name, "$non_lazy_ptr");
>         }
>
>  where shouldPrintStub is:
>
> static inline bool shouldPrintStub(TargetMachine &TM, const
> X86Subtarget* ST) {
>   return ST->isPICStyleStub() && TM.getRelocationModel() !=
> Reloc::Static;
> }
>
> This is really redundant with isel, because isel also needs to know
> exactly which GV references go through a stub so that it isels the
> access correctly.
>
> My proposed fix for this is to add an 'unsigned char' slot to
> MachineOperand that holds a target-specific enum value.  The code in
> asmprinter would be reduced to:
>
> switch (theoperandenum) {
> case X86::MO_Flag_non_lazy_ptr:
>   O << "$non_lazy_ptr";
>   break;
> case X86::MO_Flag_TLSGD:
>   O << "@TLSGD";
>   break;
> case X86::MO_Flag_NTPOFF:
>   O << "@NTPOFF";
>   break;
>
>
> etc.  The possible set of suffixes and modifiers are all target-
> specific, so the main code generator would just pass them through (as
> it does now).
>
> Does anyone have any objections to this?
>
> -Chris
> _______________________________________________
> LLVM Developers mailing list
> LLVMdev at cs.uiuc.edu         http://llvm.cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev




More information about the llvm-dev mailing list