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 *>; |