Index: src/assembler_ia32.cpp |
diff --git a/src/assembler_ia32.cpp b/src/assembler_ia32.cpp |
index 2b80820558ec3e2826b6d06270801750c136e031..0d5f4b623d778cd5ec44b2b7319e70b08dd507e2 100644 |
--- a/src/assembler_ia32.cpp |
+++ b/src/assembler_ia32.cpp |
@@ -67,6 +67,37 @@ Address Address::ofConstPool(GlobalContext *Ctx, Assembler *Asm, |
return x86::Address::Absolute(Fixup); |
} |
+AssemblerX86::~AssemblerX86() { |
+#ifndef NDEBUG |
+ for (const Label *Label : CfgNodeLabels) { |
+ Label->FinalCheck(); |
+ } |
+#endif |
+} |
+ |
+Label *AssemblerX86::GetOrCreateCfgNodeLabel(SizeT NodeNumber) { |
+ Label *L = nullptr; |
+ if (NodeNumber == CfgNodeLabels.size()) { |
+ L = new (this->Allocate<Label>()) Label(); |
+ CfgNodeLabels.push_back(L); |
+ return L; |
+ } |
+ if (NodeNumber > CfgNodeLabels.size()) { |
+ CfgNodeLabels.resize(NodeNumber + 1); |
+ } |
+ L = CfgNodeLabels[NodeNumber]; |
+ if (!L) { |
+ L = new (this->Allocate<Label>()) Label(); |
+ CfgNodeLabels[NodeNumber] = L; |
+ } |
+ return L; |
+} |
+ |
+void AssemblerX86::BindCfgNodeLabel(SizeT NodeNumber) { |
+ Label *L = GetOrCreateCfgNodeLabel(NodeNumber); |
+ this->Bind(L); |
+} |
+ |
void AssemblerX86::call(GPRRegister reg) { |
AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
EmitUint8(0xFF); |