Skip to content

Commit 336d00a

Browse files
authored
Merge pull request rust-lang#141 from jacob-hughes/serialise_deopt_opcode
Serialise llvm.experimental.stackmap as new opcode
2 parents 6472aa1 + 4c5e249 commit 336d00a

File tree

1 file changed

+29
-1
lines changed

1 file changed

+29
-1
lines changed

llvm/lib/YkIR/YkIRWriter.cpp

+29-1
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
#include "llvm/IR/InlineAsm.h"
1212
#include "llvm/IR/InstrTypes.h"
1313
#include "llvm/IR/Instructions.h"
14+
#include "llvm/IR/Intrinsics.h"
1415
#include "llvm/IR/Module.h"
1516
#include "llvm/MC/MCContext.h"
1617
#include "llvm/MC/MCSectionELF.h"
@@ -50,6 +51,7 @@ enum OpCode {
5051
OpCodePtrAdd,
5152
OpCodeBinOp,
5253
OpCodeCast,
54+
OpCodeDeoptSafepoint,
5355
OpCodeUnimplemented = 255, // YKFIXME: Will eventually be deleted.
5456
};
5557

@@ -393,6 +395,26 @@ class YkIRWriter {
393395
InstIdx++;
394396
}
395397

398+
void serialiseDeoptSafepointInst(CallInst *I, ValueLoweringMap &VLMap,
399+
unsigned BBIdx, unsigned &InstIdx) {
400+
serialiseOpcode(OpCodeDeoptSafepoint);
401+
// stackmap ID:
402+
serialiseOperand(I, VLMap, I->getOperand(0));
403+
404+
// num_shadow_bytes:
405+
serialiseOperand(I, VLMap, I->getOperand(1));
406+
407+
// num_lives:
408+
OutStreamer.emitInt32(I->arg_size() - 2);
409+
410+
// lives:
411+
for (unsigned OI = 2; OI < I->arg_size(); OI++) {
412+
serialiseOperand(I, VLMap, I->getOperand(OI));
413+
}
414+
InstIdx++;
415+
return;
416+
}
417+
396418
void serialiseCallInst(CallInst *I, ValueLoweringMap &VLMap, unsigned BBIdx,
397419
unsigned &InstIdx) {
398420
if (I->isInlineAsm()) {
@@ -426,7 +448,13 @@ class YkIRWriter {
426448
// call i32 (i32, ...) @f(1i32, 2i32);
427449
assert(I->getCalledFunction());
428450

429-
// opcode:
451+
// special case for llvm.experimental.stackmap intrinsic.
452+
if (I->getCalledFunction()->isIntrinsic() &&
453+
I->getIntrinsicID() == Intrinsic::experimental_stackmap) {
454+
serialiseDeoptSafepointInst(I, VLMap, BBIdx, InstIdx);
455+
return;
456+
}
457+
430458
serialiseOpcode(OpCodeCall);
431459
// callee:
432460
OutStreamer.emitSizeT(functionIndex(I->getCalledFunction()));

0 commit comments

Comments
 (0)