[llvm] r189400 - Given target assembler parsers a chance to handle variant expressions

Alexey Samsonov samsonov at google.com
Wed Aug 28 01:35:05 PDT 2013


On Wed, Aug 28, 2013 at 12:23 AM, Joerg Sonnenberger <joerg at bec.de> wrote:

> Author: joerg
> Date: Tue Aug 27 15:23:19 2013
> New Revision: 189400
>
> URL: http://llvm.org/viewvc/llvm-project?rev=189400&view=rev
> Log:
> Given target assembler parsers a chance to handle variant expressions
> first. Use this to turn the PPC modifiers into PPC specific expressions,
> allowing them to work on constants.
>
> Modified:
>     llvm/trunk/include/llvm/MC/MCTargetAsmParser.h
>     llvm/trunk/lib/MC/MCParser/AsmParser.cpp
>     llvm/trunk/lib/Target/PowerPC/AsmParser/PPCAsmParser.cpp
>     llvm/trunk/lib/Target/PowerPC/MCTargetDesc/PPCMCExpr.cpp
>     llvm/trunk/test/MC/PowerPC/ppc64-errors.s
>     llvm/trunk/test/MC/PowerPC/ppc64-fixups.s
>
> Modified: llvm/trunk/include/llvm/MC/MCTargetAsmParser.h
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/MC/MCTargetAsmParser.h?rev=189400&r1=189399&r2=189400&view=diff
>
> ==============================================================================
> --- llvm/trunk/include/llvm/MC/MCTargetAsmParser.h (original)
> +++ llvm/trunk/include/llvm/MC/MCTargetAsmParser.h Tue Aug 27 15:23:19 2013
> @@ -11,6 +11,7 @@
>  #define LLVM_MC_TARGETPARSER_H
>
>  #include "llvm/MC/MCParser/MCAsmParserExtension.h"
> +#include "llvm/MC/MCExpr.h"
>
>  namespace llvm {
>  class MCStreamer;
> @@ -174,6 +175,12 @@ public:
>
>    virtual void convertToMapAndConstraints(unsigned Kind,
>                        const SmallVectorImpl<MCParsedAsmOperand*>
> &Operands) = 0;
> +
> +  virtual const MCExpr *applyModifierToExpr(const MCExpr *E,
> +                                            MCSymbolRefExpr::VariantKind,
> +                                            MCContext &Ctx) {
> +    return 0;
> +  }
>  };
>
>  } // End llvm namespace
>
> Modified: llvm/trunk/lib/MC/MCParser/AsmParser.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/MCParser/AsmParser.cpp?rev=189400&r1=189399&r2=189400&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/MC/MCParser/AsmParser.cpp (original)
> +++ llvm/trunk/lib/MC/MCParser/AsmParser.cpp Tue Aug 27 15:23:19 2013
> @@ -896,6 +896,10 @@ bool AsmParser::parsePrimaryExpr(const M
>  const MCExpr *
>  AsmParser::ApplyModifierToExpr(const MCExpr *E,
>                                 MCSymbolRefExpr::VariantKind Variant) {
> +  // Ask the target implementation about this expression first.
> +  const MCExpr *NewE = getTargetParser().applyModifierToExpr(E, Variant,
> Ctx);
> +  if (NewE)
> +    return NewE;
>    // Recurse over the given expression, rebuilding it to apply the given
> variant
>    // if there is exactly one symbol.
>    switch (E->getKind()) {
>
> Modified: llvm/trunk/lib/Target/PowerPC/AsmParser/PPCAsmParser.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/PowerPC/AsmParser/PPCAsmParser.cpp?rev=189400&r1=189399&r2=189400&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/Target/PowerPC/AsmParser/PPCAsmParser.cpp (original)
> +++ llvm/trunk/lib/Target/PowerPC/AsmParser/PPCAsmParser.cpp Tue Aug 27
> 15:23:19 2013
> @@ -235,6 +235,10 @@ public:
>    virtual bool ParseDirective(AsmToken DirectiveID);
>
>    unsigned validateTargetOperandClass(MCParsedAsmOperand *Op, unsigned
> Kind);
> +
> +  virtual const MCExpr *applyModifierToExpr(const MCExpr *E,
> +                                            MCSymbolRefExpr::VariantKind,
> +                                            MCContext &Ctx);
>  };
>
>  /// PPCOperand - Instances of this class represent a parsed PowerPC
> machine
> @@ -1363,3 +1367,26 @@ unsigned PPCAsmParser::validateTargetOpe
>    return Match_InvalidOperand;
>  }
>
> +const MCExpr *
> +PPCAsmParser::applyModifierToExpr(const MCExpr *E,
> +                                  MCSymbolRefExpr::VariantKind Variant,
> +                                  MCContext &Ctx) {
> +  switch (Variant) {
> +  case MCSymbolRefExpr::VK_PPC_LO:
> +    return PPCMCExpr::Create(PPCMCExpr::VK_PPC_LO, E, false, Ctx);
> +  case MCSymbolRefExpr::VK_PPC_HI:
> +    return PPCMCExpr::Create(PPCMCExpr::VK_PPC_HI, E, false, Ctx);
> +  case MCSymbolRefExpr::VK_PPC_HA:
> +    return PPCMCExpr::Create(PPCMCExpr::VK_PPC_HA, E, false, Ctx);
> +  case MCSymbolRefExpr::VK_PPC_HIGHER:
> +    return PPCMCExpr::Create(PPCMCExpr::VK_PPC_HIGHER, E, false, Ctx);
> +  case MCSymbolRefExpr::VK_PPC_HIGHERA:
> +    return PPCMCExpr::Create(PPCMCExpr::VK_PPC_HIGHERA, E, false, Ctx);
> +  case MCSymbolRefExpr::VK_PPC_HIGHEST:
> +    return PPCMCExpr::Create(PPCMCExpr::VK_PPC_HIGHEST, E, false, Ctx);
> +  case MCSymbolRefExpr::VK_PPC_HIGHESTA:
> +    return PPCMCExpr::Create(PPCMCExpr::VK_PPC_HIGHESTA, E, false, Ctx);
> +  default:
> +    return 0;
> +  }
> +}
>
> Modified: llvm/trunk/lib/Target/PowerPC/MCTargetDesc/PPCMCExpr.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/PowerPC/MCTargetDesc/PPCMCExpr.cpp?rev=189400&r1=189399&r2=189400&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/Target/PowerPC/MCTargetDesc/PPCMCExpr.cpp (original)
> +++ llvm/trunk/lib/Target/PowerPC/MCTargetDesc/PPCMCExpr.cpp Tue Aug 27
> 15:23:19 2013
> @@ -54,7 +54,7 @@ PPCMCExpr::EvaluateAsRelocatableImpl(MCV
>                                       const MCAsmLayout *Layout) const {
>    MCValue Value;
>
> -  if (!getSubExpr()->EvaluateAsRelocatable(Value, *Layout))
> +  if (Layout && !getSubExpr()->EvaluateAsRelocatable(Value, *Layout))
>      return false;
>
>    if (Value.isAbsolute()) {
>

If Layout is NULL, Value will not be initialized at this point. This was
detected by our MemorySanitizer bootstrap bot.
I've submitted a fix for this in r189456


> @@ -85,7 +85,7 @@ PPCMCExpr::EvaluateAsRelocatableImpl(MCV
>          break;
>      }
>      Res = MCValue::get(Result);
> -  } else {
> +  } else if (Layout) {
>      MCContext &Context = Layout->getAssembler().getContext();
>      const MCSymbolRefExpr *Sym = Value.getSymA();
>      MCSymbolRefExpr::VariantKind Modifier = Sym->getKind();
> @@ -118,7 +118,8 @@ PPCMCExpr::EvaluateAsRelocatableImpl(MCV
>      }
>      Sym = MCSymbolRefExpr::Create(&Sym->getSymbol(), Modifier, Context);
>      Res = MCValue::get(Sym, Value.getSymB(), Value.getConstant());
> -  }
> +  } else
> +    return false;
>
>    return true;
>  }
>
> Modified: llvm/trunk/test/MC/PowerPC/ppc64-errors.s
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/PowerPC/ppc64-errors.s?rev=189400&r1=189399&r2=189400&view=diff
>
> ==============================================================================
> --- llvm/trunk/test/MC/PowerPC/ppc64-errors.s (original)
> +++ llvm/trunk/test/MC/PowerPC/ppc64-errors.s Tue Aug 27 15:23:19 2013
> @@ -96,3 +96,6 @@
>  # CHECK-NEXT: ld 1, 32768(2)
>                ld 1, 32768(2)
>
> +# CHECK: error: invalid modifier 'got' (no symbols present)
> +         addi 4, 3, 123 at got
> +# CHECK-NEXT: addi 4, 3, 123 at got
>
> Modified: llvm/trunk/test/MC/PowerPC/ppc64-fixups.s
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/PowerPC/ppc64-fixups.s?rev=189400&r1=189399&r2=189400&view=diff
>
> ==============================================================================
> --- llvm/trunk/test/MC/PowerPC/ppc64-fixups.s (original)
> +++ llvm/trunk/test/MC/PowerPC/ppc64-fixups.s Tue Aug 27 15:23:19 2013
> @@ -442,3 +442,7 @@ base:
>  # CHECK-REL: 0x{{[0-9A-F]*[08]}} R_PPC64_DTPREL64 target 0x0
>         .quad target at dtprel
>
> +# Constant fixup
> +        ori 1, 2, 131071 at l
> +# CHECK: ori 1, 2, 131071 at l              # encoding: [0x60,0x41,A,A]
> +# CHECK-NEXT:                            #   fixup A - offset: 2, value:
> 131071 at l, kind: fixup_ppc_half16
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>



-- 
Alexey Samsonov, MSK
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20130828/b69eb2bf/attachment.html>


More information about the llvm-commits mailing list