| Index: src/IceFixups.h
|
| diff --git a/src/IceFixups.h b/src/IceFixups.h
|
| index 47ea02ed96460250df9f12d56140375c78d4f8cb..2232a67f6064d50e29bbd5c0afe09cd14f6d385d 100644
|
| --- a/src/IceFixups.h
|
| +++ b/src/IceFixups.h
|
| @@ -23,6 +23,8 @@ namespace Ice {
|
| /// This holds the specific target+container format's relocation number.
|
| using FixupKind = uint32_t;
|
|
|
| +struct ELFSym;
|
| +
|
| /// Assembler fixups are positions in generated code/data that hold relocation
|
| /// information that needs to be processed before finalizing the code/data.
|
| class AssemblerFixup {
|
| @@ -32,27 +34,33 @@ public:
|
| AssemblerFixup() = default;
|
| AssemblerFixup(const AssemblerFixup &) = default;
|
| virtual ~AssemblerFixup() = default;
|
| - intptr_t position() const {
|
| - assert(position_was_set_);
|
| - return position_;
|
| - }
|
| - void set_position(intptr_t Position) {
|
| - position_ = Position;
|
| - position_was_set_ = true;
|
| - }
|
| + intptr_t position() const { return position_; }
|
| + void set_position(intptr_t Position) { position_ = Position; }
|
|
|
| FixupKind kind() const { return kind_; }
|
| void set_kind(FixupKind Kind) { kind_ = Kind; }
|
|
|
| RelocOffsetT offset() const;
|
| - IceString symbol(const Assembler *Asm) const;
|
| + IceString symbol() const;
|
|
|
| static const Constant *NullSymbol;
|
| - bool isNullSymbol() const { return value_ == NullSymbol; }
|
| + bool isNullSymbol() const { return ConstValue == NullSymbol; }
|
|
|
| static constexpr AssemblerFixup *NoFixup = nullptr;
|
|
|
| - void set_value(const Constant *Value) { value_ = Value; }
|
| + bool valueIsSymbol() const { return ValueIsSymbol; }
|
| + void set_value(const Constant *Value) {
|
| + ValueIsSymbol = false;
|
| + ConstValue = Value;
|
| + }
|
| + void set_value(const ELFSym *Value) {
|
| + ValueIsSymbol = true;
|
| + SymbolValue = Value;
|
| + }
|
| + const ELFSym *getSymbolValue() const {
|
| + assert(ValueIsSymbol);
|
| + return SymbolValue;
|
| + }
|
|
|
| void set_addend(RelocOffsetT Addend) { addend_ = Addend; }
|
| RelocOffsetT get_addend() const { return addend_; }
|
| @@ -65,13 +73,19 @@ public:
|
| virtual void emitOffset(Assembler *Asm) const;
|
|
|
| private:
|
| - bool position_was_set_ = false;
|
| intptr_t position_ = 0;
|
| FixupKind kind_ = 0;
|
| - const Constant *value_ = nullptr;
|
| // An offset addend to the fixup offset (as returned by offset()), in case the
|
| // assembler needs to adjust it.
|
| RelocOffsetT addend_ = 0;
|
| +
|
| + // Tagged union that holds either a Constant or ELFSym pointer, depending on
|
| + // the ValueIsSymbol tag.
|
| + bool ValueIsSymbol = false;
|
| + union {
|
| + const Constant *ConstValue;
|
| + const ELFSym *SymbolValue;
|
| + };
|
| };
|
|
|
| /// Extends a fixup to be textual. That is, it emits text instead of a sequence
|
|
|