[llvm-commits] [llvm] r84234 - in /llvm/trunk: include/llvm/MC/MCAssembler.h lib/MC/MCAssembler.cpp lib/MC/MCMachOStreamer.cpp

Chris Lattner clattner at apple.com
Thu Oct 15 19:17:53 PDT 2009


On Oct 15, 2009, at 6:58 PM, Daniel Dunbar wrote:

> Author: ddunbar
> Date: Thu Oct 15 20:58:03 2009
> New Revision: 84234
>
> URL: http://llvm.org/viewvc/llvm-project?rev=84234&view=rev
> Log:
> MC: Switch assembler API to using MCExpr instead of MCValue.

Hey Daniel,

Why does MCFillFragment (for example) take an return MCExpr's by  
reference?  While I agree that these can never be null, enforcing this  
through the API seems like a bad idea, particularly because most  
clients will have them as pointers.

-Chris

> +  MCFillFragment(const MCExpr &_Value, unsigned _ValueSize,  
> uint64_t _Count,
>                  MCSectionData *SD = 0)
>     : MCFragment(FT_Fill, SD),
> -      Value(_Value), ValueSize(_ValueSize), Count(_Count) {}
> +      Value(&_Value), ValueSize(_ValueSize), Count(_Count) {}
>
>   /// @name Accessors
>   /// @{
> @@ -195,7 +196,7 @@
>     return ValueSize * Count;
>   }
>
> -  MCValue getValue() const { return Value; }
> +  const MCExpr &getValue() const { return *Value; }
>
>   unsigned getValueSize() const { return ValueSize; }
>
> @@ -211,15 +212,15 @@
>
> class MCOrgFragment : public MCFragment {
>   /// Offset - The offset this fragment should start at.
> -  MCValue Offset;
> +  const MCExpr *Offset;
>
>   /// Value - Value to use for filling bytes.
>   int8_t Value;
>
> public:
> -  MCOrgFragment(MCValue _Offset, int8_t _Value, MCSectionData *SD =  
> 0)
> +  MCOrgFragment(const MCExpr &_Offset, int8_t _Value, MCSectionData  
> *SD = 0)
>     : MCFragment(FT_Org, SD),
> -      Offset(_Offset), Value(_Value) {}
> +      Offset(&_Offset), Value(_Value) {}
>
>   /// @name Accessors
>   /// @{
> @@ -229,7 +230,7 @@
>     return ~UINT64_C(0);
>   }
>
> -  MCValue getOffset() const { return Offset; }
> +  const MCExpr &getOffset() const { return *Offset; }
>
>   uint8_t getValue() const { return Value; }
>
> @@ -294,10 +295,7 @@
>     uint64_t Offset;
>
>     /// Value - The expression to eventually write into the fragment.
> -    //
> -    // FIXME: We could probably get away with requiring the client  
> to pass in an
> -    // owned reference whose lifetime extends past that of the fixup.
> -    MCValue Value;
> +    const MCExpr *Value;
>
>     /// Size - The fixup size.
>     unsigned Size;
> @@ -308,9 +306,9 @@
>     uint64_t FixedValue;
>
>   public:
> -    Fixup(MCFragment &_Fragment, uint64_t _Offset, const MCValue  
> &_Value,
> +    Fixup(MCFragment &_Fragment, uint64_t _Offset, const MCExpr  
> &_Value,
>           unsigned _Size)
> -      : Fragment(&_Fragment), Offset(_Offset), Value(_Value), Size 
> (_Size),
> +      : Fragment(&_Fragment), Offset(_Offset), Value(&_Value), Size 
> (_Size),
>         FixedValue(0) {}
>   };
>
>
> Modified: llvm/trunk/lib/MC/MCAssembler.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/MCAssembler.cpp?rev=84234&r1=84233&r2=84234&view=diff
>
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> ======================================================================
> --- llvm/trunk/lib/MC/MCAssembler.cpp (original)
> +++ llvm/trunk/lib/MC/MCAssembler.cpp Thu Oct 15 20:58:03 2009
> @@ -9,7 +9,10 @@
>
> #define DEBUG_TYPE "assembler"
> #include "llvm/MC/MCAssembler.h"
> +#include "llvm/MC/MCExpr.h"
> #include "llvm/MC/MCSectionMachO.h"
> +#include "llvm/MC/MCSymbol.h"
> +#include "llvm/MC/MCValue.h"
> #include "llvm/Target/TargetMachOWriterInfo.h"
> #include "llvm/ADT/DenseMap.h"
> #include "llvm/ADT/SmallString.h"
> @@ -397,6 +400,7 @@
>   };
>   void ComputeScatteredRelocationInfo(MCAssembler &Asm,
>                                       MCSectionData::Fixup &Fixup,
> +                                      const MCValue &Target,
>                              DenseMap<const MCSymbol*,MCSymbolData*>  
> &SymbolMap,
>                                       
> std::vector<MachRelocationEntry> &Relocs) {
>     uint32_t Address = Fixup.Fragment->getOffset() + Fixup.Offset;
> @@ -404,13 +408,12 @@
>     unsigned Type = RIT_Vanilla;
>
>     // See <reloc.h>.
> -
> -    const MCSymbol *A = Fixup.Value.getSymA();
> +    const MCSymbol *A = Target.getSymA();
>     MCSymbolData *SD = SymbolMap.lookup(A);
>     uint32_t Value = SD->getFragment()->getAddress() + SD->getOffset 
> ();
>     uint32_t Value2 = 0;
>
> -    if (const MCSymbol *B = Fixup.Value.getSymB()) {
> +    if (const MCSymbol *B = Target.getSymB()) {
>       Type = RIT_LocalDifference;
>
>       MCSymbolData *SD = SymbolMap.lookup(B);
> @@ -421,7 +424,7 @@
>     assert((1U << Log2Size) == Fixup.Size && "Invalid fixup size!");
>
>     // The value which goes in the fixup is current value of the  
> expression.
> -    Fixup.FixedValue = Value - Value2 + Fixup.Value.getConstant();
> +    Fixup.FixedValue = Value - Value2 + Target.getConstant();
>
>     MachRelocationEntry MRE;
>     MRE.Word0 = ((Address   <<  0) |
> @@ -450,13 +453,17 @@
>                              MCSectionData::Fixup &Fixup,
>                              DenseMap<const MCSymbol*,MCSymbolData*>  
> &SymbolMap,
>                              std::vector<MachRelocationEntry>  
> &Relocs) {
> -    // If this is a local symbol plus an offset or a difference,  
> then we need a
> +    MCValue Target;
> +    if (!Fixup.Value->EvaluateAsRelocatable(Target))
> +      llvm_report_error("expected relocatable expression");
> +
> +    // If this is a difference or a local symbol plus an offset,  
> then we need a
>     // scattered relocation entry.
> -    if (Fixup.Value.getSymB()) // a - b
> -      return ComputeScatteredRelocationInfo(Asm, Fixup, SymbolMap,  
> Relocs);
> -    if (Fixup.Value.getSymA() && Fixup.Value.getConstant())
> -      if (!Fixup.Value.getSymA()->isUndefined())
> -        return ComputeScatteredRelocationInfo(Asm, Fixup,  
> SymbolMap, Relocs);
> +    if (Target.getSymB() ||
> +        (Target.getSymA() && !Target.getSymA()->isUndefined() &&
> +         Target.getConstant()))
> +      return ComputeScatteredRelocationInfo(Asm, Fixup, Target,
> +                                            SymbolMap, Relocs);
>
>     // See <reloc.h>.
>     uint32_t Address = Fixup.Fragment->getOffset() + Fixup.Offset;
> @@ -466,13 +473,13 @@
>     unsigned IsExtern = 0;
>     unsigned Type = 0;
>
> -    if (Fixup.Value.isAbsolute()) { // constant
> +    if (Target.isAbsolute()) { // constant
>       // SymbolNum of 0 indicates the absolute section.
>       Type = RIT_Vanilla;
>       Value = 0;
>       llvm_unreachable("FIXME: Not yet implemented!");
>     } else {
> -      const MCSymbol *Symbol = Fixup.Value.getSymA();
> +      const MCSymbol *Symbol = Target.getSymA();
>       MCSymbolData *SD = SymbolMap.lookup(Symbol);
>
>       if (Symbol->isUndefined()) {
> @@ -495,7 +502,7 @@
>     }
>
>     // The value which goes in the fixup is current value of the  
> expression.
> -    Fixup.FixedValue = Value + Fixup.Value.getConstant();
> +    Fixup.FixedValue = Value + Target.getConstant();
>
>     unsigned Log2Size = Log2_32(Fixup.Size);
>     assert((1U << Log2Size) == Fixup.Size && "Invalid fixup size!");
> @@ -978,8 +985,12 @@
>
>       F.setFileSize(F.getMaxFileSize());
>
> +      MCValue Target;
> +      if (!FF.getValue().EvaluateAsRelocatable(Target))
> +        llvm_report_error("expected relocatable expression");
> +
>       // If the fill value is constant, thats it.
> -      if (FF.getValue().isAbsolute())
> +      if (Target.isAbsolute())
>         break;
>
>       // Otherwise, add fixups for the values.
> @@ -994,9 +1005,13 @@
>     case MCFragment::FT_Org: {
>       MCOrgFragment &OF = cast<MCOrgFragment>(F);
>
> -      if (!OF.getOffset().isAbsolute())
> +      MCValue Target;
> +      if (!OF.getOffset().EvaluateAsRelocatable(Target))
> +        llvm_report_error("expected relocatable expression");
> +
> +      if (!Target.isAbsolute())
>         llvm_unreachable("FIXME: Not yet implemented!");
> -      uint64_t OrgOffset = OF.getOffset().getConstant();
> +      uint64_t OrgOffset = Target.getConstant();
>       uint64_t Offset = Address - SD.getAddress();
>
>       // FIXME: We need a way to communicate this error.
> @@ -1077,10 +1092,15 @@
>     MCFillFragment &FF = cast<MCFillFragment>(F);
>
>     int64_t Value = 0;
> -    if (FF.getValue().isAbsolute())
> -      Value = FF.getValue().getConstant();
> +
> +    MCValue Target;
> +    if (!FF.getValue().EvaluateAsRelocatable(Target))
> +      llvm_report_error("expected relocatable expression");
> +
> +    if (Target.isAbsolute())
> +      Value = Target.getConstant();
>     for (uint64_t i = 0, e = FF.getCount(); i != e; ++i) {
> -      if (!FF.getValue().isAbsolute()) {
> +      if (!Target.isAbsolute()) {
>         // Find the fixup.
>         //
>         // FIXME: Find a better way to write in the fixes.
>
> Modified: llvm/trunk/lib/MC/MCMachOStreamer.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/MCMachOStreamer.cpp?rev=84234&r1=84233&r2=84234&view=diff
>
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> ======================================================================
> --- llvm/trunk/lib/MC/MCMachOStreamer.cpp (original)
> +++ llvm/trunk/lib/MC/MCMachOStreamer.cpp Thu Oct 15 20:58:03 2009
> @@ -321,12 +321,7 @@
> }
>
> void MCMachOStreamer::EmitValue(const MCExpr *Value, unsigned Size) {
> -  MCValue RelocValue;
> -
> -  if (!AddValueSymbols(Value)->EvaluateAsRelocatable(getContext(),  
> RelocValue))
> -    return llvm_report_error("expected relocatable expression");
> -
> -  new MCFillFragment(RelocValue, Size, 1, CurSectionData);
> +  new MCFillFragment(*AddValueSymbols(Value), Size, 1,  
> CurSectionData);
> }
>
> void MCMachOStreamer::EmitValueToAlignment(unsigned ByteAlignment,
> @@ -344,12 +339,7 @@
>
> void MCMachOStreamer::EmitValueToOffset(const MCExpr *Offset,
>                                         unsigned char Value) {
> -  MCValue RelocOffset;
> -
> -  if (!AddValueSymbols(Offset)->EvaluateAsRelocatable(RelocOffset))
> -    return llvm_report_error("expected relocatable expression");
> -
> -  new MCOrgFragment(RelocOffset, Value, CurSectionData);
> +  new MCOrgFragment(*Offset, Value, CurSectionData);
> }
>
> void MCMachOStreamer::EmitInstruction(const MCInst &Inst) {
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits




More information about the llvm-commits mailing list