Fix problems with sandboxing and the ARM integrated assembler. Fixes (at least) the obvious problems with sandboxing and the integrated assembler. This includes: Added assembly instruction Nop. Fixed implementation of padWithNop. Fixed linking to local label to only fire when persistent (i.e. last pass of assembly generation). Removed restriction on single register push/pop, since the ARM integrated assembler converts it to a corresopnding str/ldr. Fixed OperandARM32FlexImm to use smallest rotation value, so that external assemblers and the ARM integrated assembler will agree on encoding. Fixed ARM sandboxing requires test in sandboxing.ll BUG=None R=stichnot@chromium.org Review URL: https://codereview.chromium.org/1511653002 .
diff --git a/src/IceAssembler.cpp b/src/IceAssembler.cpp index 04cb949..44c4ee2 100644 --- a/src/IceAssembler.cpp +++ b/src/IceAssembler.cpp
@@ -35,6 +35,17 @@ return Result; } +void Label::linkTo(const Assembler &Asm, intptr_t Pos) { + // We must not set the link until the position is absolutely known. This means + // not during the preliminary (sandboxing) pass, and not when the instruction + // needs a text fixup (hybrid iasm mode). + if (Asm.getPreliminary() || Asm.needsTextFixup()) + return; + assert(!isBound()); + Position = Pos + kWordSize; + assert(isLinked()); +} + void AssemblerBuffer::installFixup(AssemblerFixup *F) { if (!Assemblr.getPreliminary()) Fixups.push_back(F);