1 //===-- Execution.cpp - Implement code to simulate the program ------------===// 2 // 3 // This file contains the actual instruction interpreter. 4 // 5 //===----------------------------------------------------------------------===// 6 7 #include "Interpreter.h" 8 #include "ExecutionAnnotations.h" 9 #include "llvm/iOther.h" 10 #include "llvm/iTerminators.h" 11 #include "llvm/iMemory.h" 12 #include "llvm/Type.h" 13 #include "llvm/ConstPoolVals.h" 14 #include "llvm/Assembly/Writer.h" 15 #include "llvm/Support/DataTypes.h" 16 #include "llvm/Target/Data.h" 17 18 static unsigned getOperandSlot(Value *V) { 19 SlotNumber *SN = (SlotNumber*)V->getAnnotation(SlotNumberAID); 20 assert(SN && "Operand does not have a slot number annotation!"); 21 return SN->SlotNum; 22 } 23 24 #define GET_CONST_VAL(TY, CLASS) \ 25 case Type::TY##TyID: Result.TY##Val = ((CLASS*)CPV)->getValue(); break 26 27 static GenericValue getOperandValue(Value *V, ExecutionContext &SF) { 28 if (ConstPoolVal *CPV = V->castConstant()) { 29 GenericValue Result; 30 switch (CPV->getType()->getPrimitiveID()) { 31 GET_CONST_VAL(Bool , ConstPoolBool); 32 GET_CONST_VAL(UByte , ConstPoolUInt); 33 GET_CONST_VAL(SByte , ConstPoolSInt); 34 GET_CONST_VAL(UShort , ConstPoolUInt); 35 GET_CONST_VAL(Short , ConstPoolSInt); 36 GET_CONST_VAL(UInt , ConstPoolUInt); 37 GET_CONST_VAL(Int , ConstPoolSInt); 38 GET_CONST_VAL(Float , ConstPoolFP); 39 GET_CONST_VAL(Double , ConstPoolFP); 40 default: 41 cout << "ERROR: Constant unimp for type: " << CPV->getType() << endl; 42 } 43 return Result; 44 } else { 45 unsigned TyP = V->getType()->getUniqueID(); // TypePlane for value 46 return SF.Values[TyP][getOperandSlot(V)]; 47 } 48 } 49 50 static void printOperandInfo(Value *V, ExecutionContext &SF) { 51 if (!V->isConstant()) { 52 unsigned TyP = V->getType()->getUniqueID(); // TypePlane for value 53 unsigned Slot = getOperandSlot(V); 54 cout << "Value=" << (void*)V << " TypeID=" << TyP << " Slot=" << Slot 55 << " Addr=" << &SF.Values[TyP][Slot] << " SF=" << &SF << endl; 56 } 57 } 58 59 60 61 static void SetValue(Value *V, GenericValue Val, ExecutionContext &SF) { 62 unsigned TyP = V->getType()->getUniqueID(); // TypePlane for value 63 64 //cout << "Setting value: " << &SF.Values[TyP][getOperandSlot(V)] << endl; 65 SF.Values[TyP][getOperandSlot(V)] = Val; 66 } 67 68 69 70 //===----------------------------------------------------------------------===// 71 // Binary Instruction Implementations 72 //===----------------------------------------------------------------------===// 73 74 #define IMPLEMENT_BINARY_OPERATOR(OP, TY) \ 75 case Type::TY##TyID: Dest.TY##Val = Src1.TY##Val OP Src2.TY##Val; break 76 #define IMPLEMENT_BINARY_PTR_OPERATOR(OP) \ 77 case Type::PointerTyID: Dest.PointerVal = \ 78 (GenericValue*)((unsigned long)Src1.PointerVal OP (unsigned long)Src2.PointerVal); break 79 80 static GenericValue executeAddInst(GenericValue Src1, GenericValue Src2, 81 const Type *Ty, ExecutionContext &SF) { 82 GenericValue Dest; 83 switch (Ty->getPrimitiveID()) { 84 IMPLEMENT_BINARY_OPERATOR(+, UByte); 85 IMPLEMENT_BINARY_OPERATOR(+, SByte); 86 IMPLEMENT_BINARY_OPERATOR(+, UShort); 87 IMPLEMENT_BINARY_OPERATOR(+, Short); 88 IMPLEMENT_BINARY_OPERATOR(+, UInt); 89 IMPLEMENT_BINARY_OPERATOR(+, Int); 90 IMPLEMENT_BINARY_OPERATOR(+, Float); 91 IMPLEMENT_BINARY_OPERATOR(+, Double); 92 IMPLEMENT_BINARY_PTR_OPERATOR(+); 93 case Type::ULongTyID: 94 case Type::LongTyID: 95 default: 96 cout << "Unhandled type for Add instruction: " << Ty << endl; 97 } 98 return Dest; 99 } 100 101 static GenericValue executeSubInst(GenericValue Src1, GenericValue Src2, 102 const Type *Ty, ExecutionContext &SF) { 103 GenericValue Dest; 104 switch (Ty->getPrimitiveID()) { 105 IMPLEMENT_BINARY_OPERATOR(-, UByte); 106 IMPLEMENT_BINARY_OPERATOR(-, SByte); 107 IMPLEMENT_BINARY_OPERATOR(-, UShort); 108 IMPLEMENT_BINARY_OPERATOR(-, Short); 109 IMPLEMENT_BINARY_OPERATOR(-, UInt); 110 IMPLEMENT_BINARY_OPERATOR(-, Int); 111 IMPLEMENT_BINARY_OPERATOR(-, Float); 112 IMPLEMENT_BINARY_OPERATOR(-, Double); 113 IMPLEMENT_BINARY_PTR_OPERATOR(-); 114 case Type::ULongTyID: 115 case Type::LongTyID: 116 default: 117 cout << "Unhandled type for Sub instruction: " << Ty << endl; 118 } 119 return Dest; 120 } 121 122 #define IMPLEMENT_SETCC(OP, TY) \ 123 case Type::TY##TyID: Dest.BoolVal = Src1.TY##Val OP Src2.TY##Val; break 124 125 static GenericValue executeSetEQInst(GenericValue Src1, GenericValue Src2, 126 const Type *Ty, ExecutionContext &SF) { 127 GenericValue Dest; 128 switch (Ty->getPrimitiveID()) { 129 IMPLEMENT_SETCC(==, UByte); 130 IMPLEMENT_SETCC(==, SByte); 131 IMPLEMENT_SETCC(==, UShort); 132 IMPLEMENT_SETCC(==, Short); 133 IMPLEMENT_SETCC(==, UInt); 134 IMPLEMENT_SETCC(==, Int); 135 IMPLEMENT_SETCC(==, Float); 136 IMPLEMENT_SETCC(==, Double); 137 IMPLEMENT_SETCC(==, Pointer); 138 case Type::ULongTyID: 139 case Type::LongTyID: 140 default: 141 cout << "Unhandled type for SetEQ instruction: " << Ty << endl; 142 } 143 return Dest; 144 } 145 146 static GenericValue executeSetNEInst(GenericValue Src1, GenericValue Src2, 147 const Type *Ty, ExecutionContext &SF) { 148 GenericValue Dest; 149 switch (Ty->getPrimitiveID()) { 150 IMPLEMENT_SETCC(!=, UByte); 151 IMPLEMENT_SETCC(!=, SByte); 152 IMPLEMENT_SETCC(!=, UShort); 153 IMPLEMENT_SETCC(!=, Short); 154 IMPLEMENT_SETCC(!=, UInt); 155 IMPLEMENT_SETCC(!=, Int); 156 IMPLEMENT_SETCC(!=, Float); 157 IMPLEMENT_SETCC(!=, Double); 158 IMPLEMENT_SETCC(!=, Pointer); 159 case Type::ULongTyID: 160 case Type::LongTyID: 161 default: 162 cout << "Unhandled type for SetNE instruction: " << Ty << endl; 163 } 164 return Dest; 165 } 166 167 static GenericValue executeSetLEInst(GenericValue Src1, GenericValue Src2, 168 const Type *Ty, ExecutionContext &SF) { 169 GenericValue Dest; 170 switch (Ty->getPrimitiveID()) { 171 IMPLEMENT_SETCC(<=, UByte); 172 IMPLEMENT_SETCC(<=, SByte); 173 IMPLEMENT_SETCC(<=, UShort); 174 IMPLEMENT_SETCC(<=, Short); 175 IMPLEMENT_SETCC(<=, UInt); 176 IMPLEMENT_SETCC(<=, Int); 177 IMPLEMENT_SETCC(<=, Float); 178 IMPLEMENT_SETCC(<=, Double); 179 IMPLEMENT_SETCC(<=, Pointer); 180 case Type::ULongTyID: 181 case Type::LongTyID: 182 default: 183 cout << "Unhandled type for SetLE instruction: " << Ty << endl; 184 } 185 return Dest; 186 } 187 188 static GenericValue executeSetGEInst(GenericValue Src1, GenericValue Src2, 189 const Type *Ty, ExecutionContext &SF) { 190 GenericValue Dest; 191 switch (Ty->getPrimitiveID()) { 192 IMPLEMENT_SETCC(>=, UByte); 193 IMPLEMENT_SETCC(>=, SByte); 194 IMPLEMENT_SETCC(>=, UShort); 195 IMPLEMENT_SETCC(>=, Short); 196 IMPLEMENT_SETCC(>=, UInt); 197 IMPLEMENT_SETCC(>=, Int); 198 IMPLEMENT_SETCC(>=, Float); 199 IMPLEMENT_SETCC(>=, Double); 200 IMPLEMENT_SETCC(>=, Pointer); 201 case Type::ULongTyID: 202 case Type::LongTyID: 203 default: 204 cout << "Unhandled type for SetGE instruction: " << Ty << endl; 205 } 206 return Dest; 207 } 208 209 static GenericValue executeSetLTInst(GenericValue Src1, GenericValue Src2, 210 const Type *Ty, ExecutionContext &SF) { 211 GenericValue Dest; 212 switch (Ty->getPrimitiveID()) { 213 IMPLEMENT_SETCC(<, UByte); 214 IMPLEMENT_SETCC(<, SByte); 215 IMPLEMENT_SETCC(<, UShort); 216 IMPLEMENT_SETCC(<, Short); 217 IMPLEMENT_SETCC(<, UInt); 218 IMPLEMENT_SETCC(<, Int); 219 IMPLEMENT_SETCC(<, Float); 220 IMPLEMENT_SETCC(<, Double); 221 IMPLEMENT_SETCC(<, Pointer); 222 case Type::ULongTyID: 223 case Type::LongTyID: 224 default: 225 cout << "Unhandled type for SetLT instruction: " << Ty << endl; 226 } 227 return Dest; 228 } 229 230 static GenericValue executeSetGTInst(GenericValue Src1, GenericValue Src2, 231 const Type *Ty, ExecutionContext &SF) { 232 GenericValue Dest; 233 switch (Ty->getPrimitiveID()) { 234 IMPLEMENT_SETCC(>, UByte); 235 IMPLEMENT_SETCC(>, SByte); 236 IMPLEMENT_SETCC(>, UShort); 237 IMPLEMENT_SETCC(>, Short); 238 IMPLEMENT_SETCC(>, UInt); 239 IMPLEMENT_SETCC(>, Int); 240 IMPLEMENT_SETCC(>, Float); 241 IMPLEMENT_SETCC(>, Double); 242 IMPLEMENT_SETCC(>, Pointer); 243 case Type::ULongTyID: 244 case Type::LongTyID: 245 default: 246 cout << "Unhandled type for SetGT instruction: " << Ty << endl; 247 } 248 return Dest; 249 } 250 251 static void executeBinaryInst(BinaryOperator *I, ExecutionContext &SF) { 252 const Type *Ty = I->getOperand(0)->getType(); 253 GenericValue Src1 = getOperandValue(I->getOperand(0), SF); 254 GenericValue Src2 = getOperandValue(I->getOperand(1), SF); 255 GenericValue R; // Result 256 257 switch (I->getOpcode()) { 258 case Instruction::Add: R = executeAddInst(Src1, Src2, Ty, SF); break; 259 case Instruction::Sub: R = executeSubInst(Src1, Src2, Ty, SF); break; 260 case Instruction::SetEQ: R = executeSetEQInst(Src1, Src2, Ty, SF); break; 261 case Instruction::SetNE: R = executeSetNEInst(Src1, Src2, Ty, SF); break; 262 case Instruction::SetLE: R = executeSetLEInst(Src1, Src2, Ty, SF); break; 263 case Instruction::SetGE: R = executeSetGEInst(Src1, Src2, Ty, SF); break; 264 case Instruction::SetLT: R = executeSetLTInst(Src1, Src2, Ty, SF); break; 265 case Instruction::SetGT: R = executeSetGTInst(Src1, Src2, Ty, SF); break; 266 default: 267 cout << "Don't know how to handle this binary operator!\n-->" << I; 268 } 269 270 SetValue(I, R, SF); 271 } 272 273 //===----------------------------------------------------------------------===// 274 // Terminator Instruction Implementations 275 //===----------------------------------------------------------------------===// 276 277 void Interpreter::executeRetInst(ReturnInst *I, ExecutionContext &SF) { 278 const Type *RetTy = 0; 279 GenericValue Result; 280 281 // Save away the return value... (if we are not 'ret void') 282 if (I->getNumOperands()) { 283 RetTy = I->getReturnValue()->getType(); 284 Result = getOperandValue(I->getReturnValue(), SF); 285 } 286 287 // Save previously executing meth 288 const Method *M = ECStack.back().CurMethod; 289 290 // Pop the current stack frame... this invalidates SF 291 ECStack.pop_back(); 292 293 if (ECStack.empty()) { // Finished main. Put result into exit code... 294 if (RetTy) { // Nonvoid return type? 295 cout << "Method " << M->getType() << " \"" << M->getName() 296 << "\" returned "; 297 printValue(RetTy, Result); 298 cout << endl; 299 300 if (RetTy->isIntegral()) 301 ExitCode = Result.SByteVal; // Capture the exit code of the program 302 } else { 303 ExitCode = 0; 304 } 305 return; 306 } 307 308 // If we have a previous stack frame, and we have a previous call, fill in 309 // the return value... 310 // 311 ExecutionContext &NewSF = ECStack.back(); 312 if (NewSF.Caller) { 313 if (NewSF.Caller->getType() != Type::VoidTy) // Save result... 314 SetValue(NewSF.Caller, Result, NewSF); 315 316 NewSF.Caller = 0; // We returned from the call... 317 } else { 318 // This must be a function that is executing because of a user 'call' 319 // instruction. 320 cout << "Method " << M->getType() << " \"" << M->getName() 321 << "\" returned "; 322 printValue(RetTy, Result); 323 cout << endl; 324 } 325 } 326 327 void Interpreter::executeBrInst(BranchInst *I, ExecutionContext &SF) { 328 SF.PrevBB = SF.CurBB; // Update PrevBB so that PHI nodes work... 329 BasicBlock *Dest; 330 331 Dest = I->getSuccessor(0); // Uncond branches have a fixed dest... 332 if (!I->isUnconditional()) { 333 if (getOperandValue(I->getCondition(), SF).BoolVal == 0) // If false cond... 334 Dest = I->getSuccessor(1); 335 } 336 SF.CurBB = Dest; // Update CurBB to branch destination 337 SF.CurInst = SF.CurBB->begin(); // Update new instruction ptr... 338 } 339 340 //===----------------------------------------------------------------------===// 341 // Memory Instruction Implementations 342 //===----------------------------------------------------------------------===// 343 344 // Create a TargetData structure to handle memory addressing and size/alignment 345 // computations 346 // 347 static TargetData TD("lli Interpreter"); 348 349 void Interpreter::executeAllocInst(AllocationInst *I, ExecutionContext &SF) { 350 const Type *Ty = I->getType()->getValueType(); // Type to be allocated 351 unsigned NumElements = 1; 352 353 if (I->getNumOperands()) { // Allocating a unsized array type? 354 assert(Ty->isArrayType() && Ty->castArrayType()->isUnsized() && 355 "Allocation inst with size operand for !unsized array type???"); 356 Ty = ((const ArrayType*)Ty)->getElementType(); // Get the actual type... 357 358 // Get the number of elements being allocated by the array... 359 GenericValue NumEl = getOperandValue(I->getOperand(0), SF); 360 NumElements = NumEl.UIntVal; 361 } 362 363 // Allocate enough memory to hold the type... 364 GenericValue Result; 365 Result.PointerVal = (GenericValue*)malloc(NumElements * TD.getTypeSize(Ty)); 366 assert(Result.PointerVal != 0 && "Null pointer returned by malloc!"); 367 SetValue(I, Result, SF); 368 369 if (I->getOpcode() == Instruction::Alloca) { 370 // Keep track to free it later... 371 } 372 } 373 374 static void executeFreeInst(FreeInst *I, ExecutionContext &SF) { 375 assert(I->getOperand(0)->getType()->isPointerType() && "Freeing nonptr?"); 376 GenericValue Value = getOperandValue(I->getOperand(0), SF); 377 // TODO: Check to make sure memory is allocated 378 free(Value.PointerVal); // Free memory 379 } 380 381 static void executeLoadInst(LoadInst *I, ExecutionContext &SF) { 382 assert(I->getNumOperands() == 1 && "NI!"); 383 GenericValue *Ptr = getOperandValue(I->getPtrOperand(), SF).PointerVal; 384 GenericValue Result; 385 386 switch (I->getType()->getPrimitiveID()) { 387 case Type::BoolTyID: 388 case Type::UByteTyID: 389 case Type::SByteTyID: Result.SByteVal = Ptr->SByteVal; break; 390 case Type::UShortTyID: 391 case Type::ShortTyID: Result.ShortVal = Ptr->ShortVal; break; 392 case Type::UIntTyID: 393 case Type::IntTyID: Result.IntVal = Ptr->IntVal; break; 394 //case Type::ULongTyID: 395 //case Type::LongTyID: Result.LongVal = Ptr->LongVal; break; 396 case Type::FloatTyID: Result.FloatVal = Ptr->FloatVal; break; 397 case Type::DoubleTyID: Result.DoubleVal = Ptr->DoubleVal; break; 398 case Type::PointerTyID: Result.PointerVal = Ptr->PointerVal; break; 399 default: 400 cout << "Cannot load value of type " << I->getType() << "!\n"; 401 } 402 403 SetValue(I, Result, SF); 404 } 405 406 static void executeStoreInst(StoreInst *I, ExecutionContext &SF) { 407 GenericValue *Ptr = getOperandValue(I->getPtrOperand(), SF).PointerVal; 408 GenericValue Val = getOperandValue(I->getOperand(0), SF); 409 assert(I->getNumOperands() == 2 && "NI!"); 410 411 switch (I->getOperand(0)->getType()->getPrimitiveID()) { 412 case Type::BoolTyID: 413 case Type::UByteTyID: 414 case Type::SByteTyID: Ptr->SByteVal = Val.SByteVal; break; 415 case Type::UShortTyID: 416 case Type::ShortTyID: Ptr->ShortVal = Val.ShortVal; break; 417 case Type::UIntTyID: 418 case Type::IntTyID: Ptr->IntVal = Val.IntVal; break; 419 //case Type::ULongTyID: 420 //case Type::LongTyID: Ptr->LongVal = Val.LongVal; break; 421 case Type::FloatTyID: Ptr->FloatVal = Val.FloatVal; break; 422 case Type::DoubleTyID: Ptr->DoubleVal = Val.DoubleVal; break; 423 case Type::PointerTyID: Ptr->PointerVal = Val.PointerVal; break; 424 default: 425 cout << "Cannot store value of type " << I->getType() << "!\n"; 426 } 427 } 428 429 430 //===----------------------------------------------------------------------===// 431 // Miscellaneous Instruction Implementations 432 //===----------------------------------------------------------------------===// 433 434 void Interpreter::executeCallInst(CallInst *I, ExecutionContext &SF) { 435 ECStack.back().Caller = I; 436 vector<GenericValue> ArgVals; 437 ArgVals.reserve(I->getNumOperands()-1); 438 for (unsigned i = 1; i < I->getNumOperands(); ++i) 439 ArgVals.push_back(getOperandValue(I->getOperand(i), SF)); 440 441 callMethod(I->getCalledMethod(), ArgVals); 442 } 443 444 static void executePHINode(PHINode *I, ExecutionContext &SF) { 445 BasicBlock *PrevBB = SF.PrevBB; 446 Value *IncomingValue = 0; 447 448 // Search for the value corresponding to this previous bb... 449 for (unsigned i = I->getNumIncomingValues(); i > 0;) { 450 if (I->getIncomingBlock(--i) == PrevBB) { 451 IncomingValue = I->getIncomingValue(i); 452 break; 453 } 454 } 455 assert(IncomingValue && "No PHI node predecessor for current PrevBB!"); 456 457 // Found the value, set as the result... 458 SetValue(I, getOperandValue(IncomingValue, SF), SF); 459 } 460 461 #define IMPLEMENT_SHIFT(OP, TY) \ 462 case Type::TY##TyID: Dest.TY##Val = Src1.TY##Val OP Src2.UByteVal; break 463 464 static void executeShlInst(ShiftInst *I, ExecutionContext &SF) { 465 const Type *Ty = I->getOperand(0)->getType(); 466 GenericValue Src1 = getOperandValue(I->getOperand(0), SF); 467 GenericValue Src2 = getOperandValue(I->getOperand(1), SF); 468 GenericValue Dest; 469 470 switch (Ty->getPrimitiveID()) { 471 IMPLEMENT_SHIFT(<<, UByte); 472 IMPLEMENT_SHIFT(<<, SByte); 473 IMPLEMENT_SHIFT(<<, UShort); 474 IMPLEMENT_SHIFT(<<, Short); 475 IMPLEMENT_SHIFT(<<, UInt); 476 IMPLEMENT_SHIFT(<<, Int); 477 case Type::ULongTyID: 478 case Type::LongTyID: 479 default: 480 cout << "Unhandled type for Shl instruction: " << Ty << endl; 481 } 482 SetValue(I, Dest, SF); 483 } 484 485 static void executeShrInst(ShiftInst *I, ExecutionContext &SF) { 486 const Type *Ty = I->getOperand(0)->getType(); 487 GenericValue Src1 = getOperandValue(I->getOperand(0), SF); 488 GenericValue Src2 = getOperandValue(I->getOperand(1), SF); 489 GenericValue Dest; 490 491 switch (Ty->getPrimitiveID()) { 492 IMPLEMENT_SHIFT(>>, UByte); 493 IMPLEMENT_SHIFT(>>, SByte); 494 IMPLEMENT_SHIFT(>>, UShort); 495 IMPLEMENT_SHIFT(>>, Short); 496 IMPLEMENT_SHIFT(>>, UInt); 497 IMPLEMENT_SHIFT(>>, Int); 498 case Type::ULongTyID: 499 case Type::LongTyID: 500 default: 501 cout << "Unhandled type for Shr instruction: " << Ty << endl; 502 } 503 SetValue(I, Dest, SF); 504 } 505 506 #define IMPLEMENT_CAST(DTY, DCTY, STY) \ 507 case Type::STY##TyID: Dest.DTY##Val = (DCTY)Src.STY##Val; break; 508 509 #define IMPLEMENT_CAST_CASE_START(DESTTY, DESTCTY) \ 510 case Type::DESTTY##TyID: \ 511 switch (SrcTy->getPrimitiveID()) { \ 512 IMPLEMENT_CAST(DESTTY, DESTCTY, UByte); \ 513 IMPLEMENT_CAST(DESTTY, DESTCTY, SByte); \ 514 IMPLEMENT_CAST(DESTTY, DESTCTY, UShort); \ 515 IMPLEMENT_CAST(DESTTY, DESTCTY, Short); \ 516 IMPLEMENT_CAST(DESTTY, DESTCTY, UInt); \ 517 IMPLEMENT_CAST(DESTTY, DESTCTY, Int); 518 519 #define IMPLEMENT_CAST_CASE_PTR_IMP(DESTTY, DESTCTY) \ 520 IMPLEMENT_CAST(DESTTY, DESTCTY, Pointer) 521 522 #define IMPLEMENT_CAST_CASE_FP_IMP(DESTTY, DESTCTY) \ 523 IMPLEMENT_CAST(DESTTY, DESTCTY, Float); \ 524 IMPLEMENT_CAST(DESTTY, DESTCTY, Double) 525 526 #define IMPLEMENT_CAST_CASE_END() \ 527 default: cout << "Unhandled cast: " << SrcTy << " to " << Ty << endl; \ 528 break; \ 529 } \ 530 break 531 532 #define IMPLEMENT_CAST_CASE(DESTTY, DESTCTY) \ 533 IMPLEMENT_CAST_CASE_START(DESTTY, DESTCTY); \ 534 IMPLEMENT_CAST_CASE_FP_IMP(DESTTY, DESTCTY); \ 535 IMPLEMENT_CAST_CASE_PTR_IMP(DESTTY, DESTCTY); \ 536 IMPLEMENT_CAST_CASE_END() 537 538 #define IMPLEMENT_CAST_CASE_FP(DESTTY, DESTCTY) \ 539 IMPLEMENT_CAST_CASE_START(DESTTY, DESTCTY); \ 540 IMPLEMENT_CAST_CASE_FP_IMP(DESTTY, DESTCTY); \ 541 IMPLEMENT_CAST_CASE_END() 542 543 #define IMPLEMENT_CAST_CASE_PTR(DESTTY, DESTCTY) \ 544 IMPLEMENT_CAST_CASE_START(DESTTY, DESTCTY); \ 545 IMPLEMENT_CAST_CASE_PTR_IMP(DESTTY, DESTCTY); \ 546 IMPLEMENT_CAST_CASE_END() 547 548 static void executeCastInst(CastInst *I, ExecutionContext &SF) { 549 const Type *Ty = I->getType(); 550 const Type *SrcTy = I->getOperand(0)->getType(); 551 GenericValue Src = getOperandValue(I->getOperand(0), SF); 552 GenericValue Dest; 553 554 switch (Ty->getPrimitiveID()) { 555 IMPLEMENT_CAST_CASE(UByte , unsigned char); 556 IMPLEMENT_CAST_CASE(SByte , signed char); 557 IMPLEMENT_CAST_CASE(UShort, unsigned short); 558 IMPLEMENT_CAST_CASE(Short , signed char); 559 IMPLEMENT_CAST_CASE(UInt , unsigned int ); 560 IMPLEMENT_CAST_CASE(Int , signed int ); 561 IMPLEMENT_CAST_CASE_FP(Float , float); 562 IMPLEMENT_CAST_CASE_FP(Double, double); 563 IMPLEMENT_CAST_CASE_PTR(Pointer, GenericValue *); 564 case Type::ULongTyID: 565 case Type::LongTyID: 566 default: 567 cout << "Unhandled dest type for cast instruction: " << Ty << endl; 568 } 569 SetValue(I, Dest, SF); 570 } 571 572 573 574 575 //===----------------------------------------------------------------------===// 576 // Dispatch and Execution Code 577 //===----------------------------------------------------------------------===// 578 579 MethodInfo::MethodInfo(Method *M) : Annotation(MethodInfoAID) { 580 // Assign slot numbers to the method arguments... 581 const Method::ArgumentListType &ArgList = M->getArgumentList(); 582 for (Method::ArgumentListType::const_iterator AI = ArgList.begin(), 583 AE = ArgList.end(); AI != AE; ++AI) { 584 MethodArgument *MA = *AI; 585 MA->addAnnotation(new SlotNumber(getValueSlot(MA))); 586 } 587 588 // Iterate over all of the instructions... 589 unsigned InstNum = 0; 590 for (Method::inst_iterator MI = M->inst_begin(), ME = M->inst_end(); 591 MI != ME; ++MI) { 592 Instruction *I = *MI; // For each instruction... 593 I->addAnnotation(new InstNumber(++InstNum, getValueSlot(I))); // Add Annote 594 } 595 } 596 597 unsigned MethodInfo::getValueSlot(const Value *V) { 598 unsigned Plane = V->getType()->getUniqueID(); 599 if (Plane >= NumPlaneElements.size()) 600 NumPlaneElements.resize(Plane+1, 0); 601 return NumPlaneElements[Plane]++; 602 } 603 604 605 void Interpreter::initializeExecutionEngine() { 606 AnnotationManager::registerAnnotationFactory(MethodInfoAID, CreateMethodInfo); 607 } 608 609 //===----------------------------------------------------------------------===// 610 // callMethod - Execute the specified method... 611 // 612 void Interpreter::callMethod(Method *M, const vector<GenericValue> &ArgVals) { 613 assert((ECStack.empty() || ECStack.back().Caller == 0 || 614 ECStack.back().Caller->getNumOperands()-1 == ArgVals.size()) && 615 "Incorrect number of arguments passed into function call!"); 616 if (M->isExternal()) { 617 callExternalMethod(M, ArgVals); 618 return; 619 } 620 621 // Process the method, assigning instruction numbers to the instructions in 622 // the method. Also calculate the number of values for each type slot active. 623 // 624 MethodInfo *MethInfo = (MethodInfo*)M->getOrCreateAnnotation(MethodInfoAID); 625 ECStack.push_back(ExecutionContext()); // Make a new stack frame... 626 627 ExecutionContext &StackFrame = ECStack.back(); // Fill it in... 628 StackFrame.CurMethod = M; 629 StackFrame.CurBB = M->front(); 630 StackFrame.CurInst = StackFrame.CurBB->begin(); 631 StackFrame.MethInfo = MethInfo; 632 633 // Initialize the values to nothing... 634 StackFrame.Values.resize(MethInfo->NumPlaneElements.size()); 635 for (unsigned i = 0; i < MethInfo->NumPlaneElements.size(); ++i) 636 StackFrame.Values[i].resize(MethInfo->NumPlaneElements[i]); 637 638 StackFrame.PrevBB = 0; // No previous BB for PHI nodes... 639 640 641 // Run through the method arguments and initialize their values... 642 unsigned i = 0; 643 for (Method::ArgumentListType::iterator MI = M->getArgumentList().begin(), 644 ME = M->getArgumentList().end(); MI != ME; ++MI, ++i) { 645 SetValue(*MI, ArgVals[i], StackFrame); 646 } 647 } 648 649 // executeInstruction - Interpret a single instruction, increment the "PC", and 650 // return true if the next instruction is a breakpoint... 651 // 652 bool Interpreter::executeInstruction() { 653 assert(!ECStack.empty() && "No program running, cannot execute inst!"); 654 655 ExecutionContext &SF = ECStack.back(); // Current stack frame 656 Instruction *I = *SF.CurInst++; // Increment before execute 657 658 if (I->isBinaryOp()) { 659 executeBinaryInst((BinaryOperator*)I, SF); 660 } else { 661 switch (I->getOpcode()) { 662 // Terminators 663 case Instruction::Ret: executeRetInst ((ReturnInst*)I, SF); break; 664 case Instruction::Br: executeBrInst ((BranchInst*)I, SF); break; 665 // Memory Instructions 666 case Instruction::Alloca: 667 case Instruction::Malloc: executeAllocInst ((AllocationInst*)I, SF); break; 668 case Instruction::Free: executeFreeInst ((FreeInst*) I, SF); break; 669 case Instruction::Load: executeLoadInst ((LoadInst*) I, SF); break; 670 case Instruction::Store: executeStoreInst ((StoreInst*) I, SF); break; 671 672 // Miscellaneous Instructions 673 case Instruction::Call: executeCallInst ((CallInst*) I, SF); break; 674 case Instruction::PHINode: executePHINode ((PHINode*) I, SF); break; 675 case Instruction::Shl: executeShlInst ((ShiftInst*) I, SF); break; 676 case Instruction::Shr: executeShrInst ((ShiftInst*) I, SF); break; 677 case Instruction::Cast: executeCastInst ((CastInst*) I, SF); break; 678 default: 679 cout << "Don't know how to execute this instruction!\n-->" << I; 680 } 681 } 682 683 // Reset the current frame location to the top of stack 684 CurFrame = ECStack.size()-1; 685 686 if (CurFrame == -1) return false; // No breakpoint if no code 687 688 // Return true if there is a breakpoint annotation on the instruction... 689 return (*ECStack[CurFrame].CurInst)->getAnnotation(BreakpointAID) != 0; 690 } 691 692 void Interpreter::stepInstruction() { // Do the 'step' command 693 if (ECStack.empty()) { 694 cout << "Error: no program running, cannot step!\n"; 695 return; 696 } 697 698 // Run an instruction... 699 executeInstruction(); 700 701 // Print the next instruction to execute... 702 printCurrentInstruction(); 703 } 704 705 // --- UI Stuff... 706 707 708 709 void Interpreter::nextInstruction() { // Do the 'next' command 710 if (ECStack.empty()) { 711 cout << "Error: no program running, cannot 'next'!\n"; 712 return; 713 } 714 715 // If this is a call instruction, step over the call instruction... 716 // TODO: ICALL, CALL WITH, ... 717 if ((*ECStack.back().CurInst)->getOpcode() == Instruction::Call) { 718 // Step into the function... 719 if (executeInstruction()) { 720 // Hit a breakpoint, print current instruction, then return to user... 721 cout << "Breakpoint hit!\n"; 722 printCurrentInstruction(); 723 return; 724 } 725 726 // Finish executing the function... 727 finish(); 728 } else { 729 // Normal instruction, just step... 730 stepInstruction(); 731 } 732 } 733 734 void Interpreter::run() { 735 if (ECStack.empty()) { 736 cout << "Error: no program running, cannot run!\n"; 737 return; 738 } 739 740 bool HitBreakpoint = false; 741 while (!ECStack.empty() && !HitBreakpoint) { 742 // Run an instruction... 743 HitBreakpoint = executeInstruction(); 744 } 745 746 if (HitBreakpoint) { 747 cout << "Breakpoint hit!\n"; 748 } 749 750 // Print the next instruction to execute... 751 printCurrentInstruction(); 752 } 753 754 void Interpreter::finish() { 755 if (ECStack.empty()) { 756 cout << "Error: no program running, cannot run!\n"; 757 return; 758 } 759 760 unsigned StackSize = ECStack.size(); 761 bool HitBreakpoint = false; 762 while (ECStack.size() >= StackSize && !HitBreakpoint) { 763 // Run an instruction... 764 HitBreakpoint = executeInstruction(); 765 } 766 767 if (HitBreakpoint) { 768 cout << "Breakpoint hit!\n"; 769 } 770 771 // Print the next instruction to execute... 772 printCurrentInstruction(); 773 } 774 775 776 777 // printCurrentInstruction - Print out the instruction that the virtual PC is 778 // at, or fail silently if no program is running. 779 // 780 void Interpreter::printCurrentInstruction() { 781 if (!ECStack.empty()) { 782 Instruction *I = *ECStack.back().CurInst; 783 InstNumber *IN = (InstNumber*)I->getAnnotation(SlotNumberAID); 784 assert(IN && "Instruction has no numbering annotation!"); 785 cout << "#" << IN->InstNum << I; 786 } 787 } 788 789 void Interpreter::printValue(const Type *Ty, GenericValue V) { 790 cout << Ty << " "; 791 792 switch (Ty->getPrimitiveID()) { 793 case Type::BoolTyID: cout << (V.BoolVal?"true":"false"); break; 794 case Type::SByteTyID: cout << V.SByteVal; break; 795 case Type::UByteTyID: cout << V.UByteVal; break; 796 case Type::ShortTyID: cout << V.ShortVal; break; 797 case Type::UShortTyID: cout << V.UShortVal; break; 798 case Type::IntTyID: cout << V.IntVal; break; 799 case Type::UIntTyID: cout << V.UIntVal; break; 800 case Type::FloatTyID: cout << V.FloatVal; break; 801 case Type::DoubleTyID: cout << V.DoubleVal; break; 802 case Type::PointerTyID:cout << V.PointerVal; break; 803 default: 804 cout << "- Don't know how to print value of this type!"; 805 break; 806 } 807 } 808 809 void Interpreter::printValue(const string &Name) { 810 Value *PickedVal = ChooseOneOption(Name, LookupMatchingNames(Name)); 811 if (!PickedVal) return; 812 813 if (const Method *M = PickedVal->castMethod()) { 814 cout << M; // Print the method 815 } else { // Otherwise there should be an annotation for the slot# 816 printValue(PickedVal->getType(), 817 getOperandValue(PickedVal, ECStack[CurFrame])); 818 cout << endl; 819 } 820 821 } 822 823 void Interpreter::infoValue(const string &Name) { 824 Value *PickedVal = ChooseOneOption(Name, LookupMatchingNames(Name)); 825 if (!PickedVal) return; 826 827 cout << "Value: "; 828 printValue(PickedVal->getType(), 829 getOperandValue(PickedVal, ECStack[CurFrame])); 830 cout << endl; 831 printOperandInfo(PickedVal, ECStack[CurFrame]); 832 } 833 834 void Interpreter::list() { 835 if (ECStack.empty()) 836 cout << "Error: No program executing!\n"; 837 else 838 cout << ECStack[CurFrame].CurMethod; // Just print the method out... 839 } 840 841 void Interpreter::printStackTrace() { 842 if (ECStack.empty()) cout << "No program executing!\n"; 843 844 for (unsigned i = 0; i < ECStack.size(); ++i) { 845 cout << (((int)i == CurFrame) ? '>' : '-'); 846 cout << "#" << i << ". " << ECStack[i].CurMethod->getType() << " \"" 847 << ECStack[i].CurMethod->getName() << "\"("; 848 // TODO: Print Args 849 cout << ")" << endl; 850 cout << *ECStack[i].CurInst; 851 } 852 } 853