| Index: src/IceFixups.h
|
| diff --git a/src/IceFixups.h b/src/IceFixups.h
|
| index 43284ac9fefb8b3f81fc40c35ec0e6d7c1eb3e0f..303e592bb3d35e582eadb5141139f481e10f8a8d 100644
|
| --- a/src/IceFixups.h
|
| +++ b/src/IceFixups.h
|
| @@ -45,7 +45,9 @@ public:
|
|
|
| void set_value(const Constant *Value) { value_ = Value; }
|
|
|
| - void emit(GlobalContext *Ctx, RelocOffsetT OverrideOffset) const;
|
| + /// Emits fixup, then returns the number of bytes to skip.
|
| + virtual size_t emit(GlobalContext *Ctx, RelocOffsetT OverrideOffset,
|
| + bool IsPCRel) const;
|
|
|
| private:
|
| intptr_t position_ = 0;
|
| @@ -53,6 +55,26 @@ private:
|
| const Constant *value_ = nullptr;
|
| };
|
|
|
| +/// Extends a fixup to be textual. That is, it emits text instead of a sequence
|
| +/// of bytes. This class is used as a fallback for unimplemented emitIAS
|
| +/// methods, allowing them to generate compilable assembly code.
|
| +class AssemblerTextFixup : public AssemblerFixup {
|
| + AssemblerTextFixup() = delete;
|
| + AssemblerTextFixup(const AssemblerTextFixup &) = delete;
|
| + AssemblerTextFixup &operator=(const AssemblerTextFixup &) = delete;
|
| +
|
| +public:
|
| + AssemblerTextFixup(const std::string &Message, size_t NumBytes)
|
| + : AssemblerFixup(), Message(Message), NumBytes(NumBytes) {}
|
| + ~AssemblerTextFixup() = default;
|
| + virtual size_t emit(GlobalContext *Ctx, RelocOffsetT OverrideOffset,
|
| + bool isPcRel) const;
|
| +
|
| +private:
|
| + const std::string Message;
|
| + const size_t NumBytes;
|
| +};
|
| +
|
| using FixupList = std::vector<AssemblerFixup>;
|
| using FixupRefList = std::vector<AssemblerFixup *>;
|
|
|
|
|