From dee199fe82f9cc10d61fe6e8f9924b8837231e67 Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Fri, 6 May 2005 22:34:01 +0000 Subject: encode calling conventions for call/invoke instructions. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@21751 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Bytecode/Writer/Writer.cpp | 50 ++++++++++++++++++++++++++++++++++++------ 1 file changed, 43 insertions(+), 7 deletions(-) (limited to 'lib/Bytecode/Writer/Writer.cpp') diff --git a/lib/Bytecode/Writer/Writer.cpp b/lib/Bytecode/Writer/Writer.cpp index 4cf4cf5a97..81c86d6ffa 100644 --- a/lib/Bytecode/Writer/Writer.cpp +++ b/lib/Bytecode/Writer/Writer.cpp @@ -19,6 +19,7 @@ #include "WriterInternals.h" #include "llvm/Bytecode/WriteBytecodePass.h" +#include "llvm/CallingConv.h" #include "llvm/Constants.h" #include "llvm/DerivedTypes.h" #include "llvm/Instructions.h" @@ -425,7 +426,7 @@ void BytecodeWriter::outputConstantStrings() { typedef unsigned char uchar; // outputInstructionFormat0 - Output those weird instructions that have a large -// number of operands or have large operands themselves... +// number of operands or have large operands themselves. // // Format: [opcode] [type] [numargs] [arg0] [arg1] ... [arg] // @@ -439,7 +440,7 @@ void BytecodeWriter::outputInstructionFormat0(const Instruction *I, unsigned NumArgs = I->getNumOperands(); output_vbr(NumArgs + (isa(I) || isa(I) || - isa(I))); + isa(I) || Opcode == 56 || Opcode == 58)); if (!isa(&I)) { for (unsigned i = 0; i < NumArgs; ++i) { @@ -456,8 +457,12 @@ void BytecodeWriter::outputInstructionFormat0(const Instruction *I, int Slot = Table.getSlot(VAI->getArgType()); assert(Slot != -1 && "VarArg argument type unknown?"); output_typeid((unsigned)Slot); + } else if (Opcode == 56) { // Invoke escape sequence + output_vbr(cast(I)->getCallingConv()); + } else if (Opcode == 58) { // Call escape sequence + output_vbr((cast(I)->getCallingConv() << 1) | + cast(I)->isTailCall()); } - } else { int Slot = Table.getSlot(I->getOperand(0)); assert(Slot >= 0 && "No slot number for value!?!?"); @@ -608,12 +613,31 @@ void BytecodeWriter::outputInstruction(const Instruction &I) { // Encode 'tail call' as 61, 'volatile load' as 62, and 'volatile store' as // 63. - if (isa(I) && cast(I).isTailCall()) - Opcode = 61; - if (isa(I) && cast(I).isVolatile()) + if (const CallInst *CI = dyn_cast(&I)) { + if (CI->getCallingConv() == CallingConv::C) { + if (CI->isTailCall()) + Opcode = 61; // CCC + Tail Call + else + ; // Opcode = Instruction::Call + } else if (CI->getCallingConv() == CallingConv::Fast) { + if (CI->isTailCall()) + Opcode = 59; // FastCC + TailCall + else + Opcode = 60; // FastCC + Not Tail Call + } else { + Opcode = 58; // Call escape sequence. + } + } else if (const InvokeInst *II = dyn_cast(&I)) { + if (II->getCallingConv() == CallingConv::Fast) + Opcode = 57; // FastCC invoke. + else if (II->getCallingConv() != CallingConv::C) + Opcode = 56; // Invoke escape sequence. + + } else if (isa(I) && cast(I).isVolatile()) { Opcode = 62; - if (isa(I) && cast(I).isVolatile()) + } else if (isa(I) && cast(I).isVolatile()) { Opcode = 63; + } // Figure out which type to encode with the instruction. Typically we want // the type of the first parameter, as opposed to the type of the instruction @@ -702,6 +726,18 @@ void BytecodeWriter::outputInstruction(const Instruction &I) { Slots[Idx] = (Slots[Idx] << 2) | IdxId; if (Slots[Idx] > MaxOpSlot) MaxOpSlot = Slots[Idx]; } + } else if (Opcode == 58) { + // If this is the escape sequence for call, emit the tailcall/cc info. + const CallInst &CI = cast(I); + ++NumOperands; + if (NumOperands < 3) { + Slots[NumOperands-1] = (CI.getCallingConv() << 1) | CI.isTailCall(); + if (Slots[NumOperands-1] > MaxOpSlot) + MaxOpSlot = Slots[NumOperands-1]; + } + } else if (Opcode == 56) { + // Invoke escape seq has at least 4 operands to encode. + ++NumOperands; } // Decide which instruction encoding to use. This is determined primarily -- cgit v1.2.3-18-g5258