[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