foreach (IR::BasicBlock *block, _function->basicBlocks) {
_block = block;
- // _addrs[block] = _codePtr;
+ _addrs[block] = label();
foreach (IR::Stmt *s, block->statements) {
s->accept(this);
}
leaveStandardStackFrame();
ret();
+ QHashIterator<IR::BasicBlock *, QVector<Jump> > it(_patches);
+ while (it.hasNext()) {
+ it.next();
+ IR::BasicBlock *block = it.key();
+ Label target = _addrs.value(block);
+ assert(target.isSet());
+ foreach (Jump jump, it.value())
+ jump.linkTo(target, this);
+ }
+
JSC::JSGlobalData dummy;
JSC::LinkBuffer linkBuffer(dummy, this, 0);
foreach (CallToLink ctl, _callsToLink)
void InstructionSelection::visitJump(IR::Jump *s)
{
+ if (_block->index + 1 != s->target->index)
+ _patches[s->target].append(jump());
}
void InstructionSelection::visitCJump(IR::CJump *s)
uchar *_buffer;
uchar *_code;
uchar *_codePtr;
- QHash<IR::BasicBlock *, QVector<uchar *> > _patches;
- QHash<IR::BasicBlock *, uchar *> _addrs;
+ QHash<IR::BasicBlock *, QVector<Jump> > _patches;
+ QHash<IR::BasicBlock *, Label> _addrs;
QList<CallToLink> _callsToLink;
};