mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-07-25 13:24:46 +00:00
Changes to build successfully with GCC 3.02
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@1503 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -19,6 +19,10 @@
|
||||
#include <math.h> // For fmod
|
||||
#include <signal.h>
|
||||
#include <setjmp.h>
|
||||
#include <iostream>
|
||||
using std::vector;
|
||||
using std::cout;
|
||||
using std::cerr;
|
||||
|
||||
cl::Flag QuietMode ("quiet" , "Do not emit any non-program output");
|
||||
cl::Alias QuietModeA("q" , "Alias for -quiet", cl::NoFlags, QuietMode);
|
||||
@@ -35,7 +39,7 @@ CachedWriter CW; // Object to accelerate printing of LLVM
|
||||
static cl::Flag ProfileStructureFields("profilestructfields",
|
||||
"Profile Structure Field Accesses");
|
||||
#include <map>
|
||||
static map<const StructType *, vector<unsigned> > FieldAccessCounts;
|
||||
static std::map<const StructType *, vector<unsigned> > FieldAccessCounts;
|
||||
#endif
|
||||
|
||||
sigjmp_buf SignalRecoverBuffer;
|
||||
@@ -91,14 +95,14 @@ static GenericValue getOperandValue(Value *V, ExecutionContext &SF) {
|
||||
case Type::PointerTyID:
|
||||
if (isa<ConstantPointerNull>(CPV)) {
|
||||
Result.PointerVal = 0;
|
||||
} else if (ConstantPointerRef *CPR =dyn_cast<ConstantPointerRef>(CPV)) {
|
||||
} else if (isa<ConstantPointerRef>(CPV)) {
|
||||
assert(0 && "Not implemented!");
|
||||
} else {
|
||||
assert(0 && "Unknown constant pointer type!");
|
||||
}
|
||||
break;
|
||||
default:
|
||||
cout << "ERROR: Constant unimp for type: " << CPV->getType() << endl;
|
||||
cout << "ERROR: Constant unimp for type: " << CPV->getType() << "\n";
|
||||
}
|
||||
return Result;
|
||||
} else if (GlobalValue *GV = dyn_cast<GlobalValue>(V)) {
|
||||
@@ -134,7 +138,7 @@ static void printOperandInfo(Value *V, ExecutionContext &SF) {
|
||||
cout << ( Cur >= 160? char((Cur>>4)+'A'-10) : char((Cur>>4) + '0'))
|
||||
<< ((Cur&15) >= 10? char((Cur&15)+'A'-10) : char((Cur&15) + '0'));
|
||||
}
|
||||
cout << endl;
|
||||
cout << "\n";
|
||||
}
|
||||
}
|
||||
|
||||
@@ -143,7 +147,7 @@ static void printOperandInfo(Value *V, ExecutionContext &SF) {
|
||||
static void SetValue(Value *V, GenericValue Val, ExecutionContext &SF) {
|
||||
unsigned TyP = V->getType()->getUniqueID(); // TypePlane for value
|
||||
|
||||
//cout << "Setting value: " << &SF.Values[TyP][getOperandSlot(V)] << endl;
|
||||
//cout << "Setting value: " << &SF.Values[TyP][getOperandSlot(V)] << "\n";
|
||||
SF.Values[TyP][getOperandSlot(V)] = Val;
|
||||
}
|
||||
|
||||
@@ -217,7 +221,7 @@ static void InitializeMemory(Constant *Init, char *Addr) {
|
||||
return;
|
||||
|
||||
default:
|
||||
CW << "Bad Type: " << Init->getType() << endl;
|
||||
CW << "Bad Type: " << Init->getType() << "\n";
|
||||
assert(0 && "Unknown constant type to initialize memory with!");
|
||||
}
|
||||
}
|
||||
@@ -277,7 +281,7 @@ static GenericValue executeAddInst(GenericValue Src1, GenericValue Src2,
|
||||
IMPLEMENT_BINARY_OPERATOR(+, Double);
|
||||
IMPLEMENT_BINARY_OPERATOR(+, Pointer);
|
||||
default:
|
||||
cout << "Unhandled type for Add instruction: " << Ty << endl;
|
||||
cout << "Unhandled type for Add instruction: " << Ty << "\n";
|
||||
}
|
||||
return Dest;
|
||||
}
|
||||
@@ -298,7 +302,7 @@ static GenericValue executeSubInst(GenericValue Src1, GenericValue Src2,
|
||||
IMPLEMENT_BINARY_OPERATOR(-, Double);
|
||||
IMPLEMENT_BINARY_OPERATOR(-, Pointer);
|
||||
default:
|
||||
cout << "Unhandled type for Sub instruction: " << Ty << endl;
|
||||
cout << "Unhandled type for Sub instruction: " << Ty << "\n";
|
||||
}
|
||||
return Dest;
|
||||
}
|
||||
@@ -319,7 +323,7 @@ static GenericValue executeMulInst(GenericValue Src1, GenericValue Src2,
|
||||
IMPLEMENT_BINARY_OPERATOR(*, Double);
|
||||
IMPLEMENT_BINARY_OPERATOR(*, Pointer);
|
||||
default:
|
||||
cout << "Unhandled type for Mul instruction: " << Ty << endl;
|
||||
cout << "Unhandled type for Mul instruction: " << Ty << "\n";
|
||||
}
|
||||
return Dest;
|
||||
}
|
||||
@@ -340,7 +344,7 @@ static GenericValue executeDivInst(GenericValue Src1, GenericValue Src2,
|
||||
IMPLEMENT_BINARY_OPERATOR(/, Double);
|
||||
IMPLEMENT_BINARY_OPERATOR(/, Pointer);
|
||||
default:
|
||||
cout << "Unhandled type for Div instruction: " << Ty << endl;
|
||||
cout << "Unhandled type for Div instruction: " << Ty << "\n";
|
||||
}
|
||||
return Dest;
|
||||
}
|
||||
@@ -365,7 +369,7 @@ static GenericValue executeRemInst(GenericValue Src1, GenericValue Src2,
|
||||
Dest.DoubleVal = fmod(Src1.DoubleVal, Src2.DoubleVal);
|
||||
break;
|
||||
default:
|
||||
cout << "Unhandled type for Rem instruction: " << Ty << endl;
|
||||
cout << "Unhandled type for Rem instruction: " << Ty << "\n";
|
||||
}
|
||||
return Dest;
|
||||
}
|
||||
@@ -384,7 +388,7 @@ static GenericValue executeAndInst(GenericValue Src1, GenericValue Src2,
|
||||
IMPLEMENT_BINARY_OPERATOR(&, Long);
|
||||
IMPLEMENT_BINARY_OPERATOR(&, Pointer);
|
||||
default:
|
||||
cout << "Unhandled type for And instruction: " << Ty << endl;
|
||||
cout << "Unhandled type for And instruction: " << Ty << "\n";
|
||||
}
|
||||
return Dest;
|
||||
}
|
||||
@@ -404,7 +408,7 @@ static GenericValue executeOrInst(GenericValue Src1, GenericValue Src2,
|
||||
IMPLEMENT_BINARY_OPERATOR(|, Long);
|
||||
IMPLEMENT_BINARY_OPERATOR(|, Pointer);
|
||||
default:
|
||||
cout << "Unhandled type for Or instruction: " << Ty << endl;
|
||||
cout << "Unhandled type for Or instruction: " << Ty << "\n";
|
||||
}
|
||||
return Dest;
|
||||
}
|
||||
@@ -424,7 +428,7 @@ static GenericValue executeXorInst(GenericValue Src1, GenericValue Src2,
|
||||
IMPLEMENT_BINARY_OPERATOR(^, Long);
|
||||
IMPLEMENT_BINARY_OPERATOR(^, Pointer);
|
||||
default:
|
||||
cout << "Unhandled type for Xor instruction: " << Ty << endl;
|
||||
cout << "Unhandled type for Xor instruction: " << Ty << "\n";
|
||||
}
|
||||
return Dest;
|
||||
}
|
||||
@@ -449,7 +453,7 @@ static GenericValue executeSetEQInst(GenericValue Src1, GenericValue Src2,
|
||||
IMPLEMENT_SETCC(==, Double);
|
||||
IMPLEMENT_SETCC(==, Pointer);
|
||||
default:
|
||||
cout << "Unhandled type for SetEQ instruction: " << Ty << endl;
|
||||
cout << "Unhandled type for SetEQ instruction: " << Ty << "\n";
|
||||
}
|
||||
return Dest;
|
||||
}
|
||||
@@ -471,7 +475,7 @@ static GenericValue executeSetNEInst(GenericValue Src1, GenericValue Src2,
|
||||
IMPLEMENT_SETCC(!=, Pointer);
|
||||
|
||||
default:
|
||||
cout << "Unhandled type for SetNE instruction: " << Ty << endl;
|
||||
cout << "Unhandled type for SetNE instruction: " << Ty << "\n";
|
||||
}
|
||||
return Dest;
|
||||
}
|
||||
@@ -492,7 +496,7 @@ static GenericValue executeSetLEInst(GenericValue Src1, GenericValue Src2,
|
||||
IMPLEMENT_SETCC(<=, Double);
|
||||
IMPLEMENT_SETCC(<=, Pointer);
|
||||
default:
|
||||
cout << "Unhandled type for SetLE instruction: " << Ty << endl;
|
||||
cout << "Unhandled type for SetLE instruction: " << Ty << "\n";
|
||||
}
|
||||
return Dest;
|
||||
}
|
||||
@@ -513,7 +517,7 @@ static GenericValue executeSetGEInst(GenericValue Src1, GenericValue Src2,
|
||||
IMPLEMENT_SETCC(>=, Double);
|
||||
IMPLEMENT_SETCC(>=, Pointer);
|
||||
default:
|
||||
cout << "Unhandled type for SetGE instruction: " << Ty << endl;
|
||||
cout << "Unhandled type for SetGE instruction: " << Ty << "\n";
|
||||
}
|
||||
return Dest;
|
||||
}
|
||||
@@ -534,7 +538,7 @@ static GenericValue executeSetLTInst(GenericValue Src1, GenericValue Src2,
|
||||
IMPLEMENT_SETCC(<, Double);
|
||||
IMPLEMENT_SETCC(<, Pointer);
|
||||
default:
|
||||
cout << "Unhandled type for SetLT instruction: " << Ty << endl;
|
||||
cout << "Unhandled type for SetLT instruction: " << Ty << "\n";
|
||||
}
|
||||
return Dest;
|
||||
}
|
||||
@@ -555,7 +559,7 @@ static GenericValue executeSetGTInst(GenericValue Src1, GenericValue Src2,
|
||||
IMPLEMENT_SETCC(>, Double);
|
||||
IMPLEMENT_SETCC(>, Pointer);
|
||||
default:
|
||||
cout << "Unhandled type for SetGT instruction: " << Ty << endl;
|
||||
cout << "Unhandled type for SetGT instruction: " << Ty << "\n";
|
||||
}
|
||||
return Dest;
|
||||
}
|
||||
@@ -598,7 +602,7 @@ static void PerformExitStuff() {
|
||||
// Print out structure field accounting information...
|
||||
if (!FieldAccessCounts.empty()) {
|
||||
CW << "Profile Field Access Counts:\n";
|
||||
map<const StructType *, vector<unsigned> >::iterator
|
||||
std::map<const StructType *, vector<unsigned> >::iterator
|
||||
I = FieldAccessCounts.begin(), E = FieldAccessCounts.end();
|
||||
for (; I != E; ++I) {
|
||||
vector<unsigned> &OfC = I->second;
|
||||
@@ -613,9 +617,9 @@ static void PerformExitStuff() {
|
||||
if (i) CW << ", ";
|
||||
CW << OfC[i];
|
||||
}
|
||||
CW << endl;
|
||||
CW << "\n";
|
||||
}
|
||||
CW << endl;
|
||||
CW << "\n";
|
||||
|
||||
CW << "Profile Field Access Percentages:\n";
|
||||
cout.precision(3);
|
||||
@@ -630,9 +634,9 @@ static void PerformExitStuff() {
|
||||
if (i) CW << ", ";
|
||||
CW << double(OfC[i])/Sum;
|
||||
}
|
||||
CW << endl;
|
||||
CW << "\n";
|
||||
}
|
||||
CW << endl;
|
||||
CW << "\n";
|
||||
|
||||
FieldAccessCounts.clear();
|
||||
}
|
||||
@@ -673,7 +677,7 @@ void Interpreter::executeRetInst(ReturnInst *I, ExecutionContext &SF) {
|
||||
CW << "Method " << M->getType() << " \"" << M->getName()
|
||||
<< "\" returned ";
|
||||
print(RetTy, Result);
|
||||
cout << endl;
|
||||
cout << "\n";
|
||||
}
|
||||
|
||||
if (RetTy->isIntegral())
|
||||
@@ -701,7 +705,7 @@ void Interpreter::executeRetInst(ReturnInst *I, ExecutionContext &SF) {
|
||||
CW << "Method " << M->getType() << " \"" << M->getName()
|
||||
<< "\" returned ";
|
||||
print(RetTy, Result);
|
||||
cout << endl;
|
||||
cout << "\n";
|
||||
}
|
||||
}
|
||||
|
||||
@@ -930,7 +934,7 @@ static void executeShlInst(ShiftInst *I, ExecutionContext &SF) {
|
||||
IMPLEMENT_SHIFT(<<, ULong);
|
||||
IMPLEMENT_SHIFT(<<, Long);
|
||||
default:
|
||||
cout << "Unhandled type for Shl instruction: " << Ty << endl;
|
||||
cout << "Unhandled type for Shl instruction: " << Ty << "\n";
|
||||
}
|
||||
SetValue(I, Dest, SF);
|
||||
}
|
||||
@@ -951,7 +955,7 @@ static void executeShrInst(ShiftInst *I, ExecutionContext &SF) {
|
||||
IMPLEMENT_SHIFT(>>, ULong);
|
||||
IMPLEMENT_SHIFT(>>, Long);
|
||||
default:
|
||||
cout << "Unhandled type for Shr instruction: " << Ty << endl;
|
||||
cout << "Unhandled type for Shr instruction: " << Ty << "\n";
|
||||
}
|
||||
SetValue(I, Dest, SF);
|
||||
}
|
||||
@@ -977,7 +981,7 @@ static void executeShrInst(ShiftInst *I, ExecutionContext &SF) {
|
||||
IMPLEMENT_CAST(DESTTY, DESTCTY, Double)
|
||||
|
||||
#define IMPLEMENT_CAST_CASE_END() \
|
||||
default: cout << "Unhandled cast: " << SrcTy << " to " << Ty << endl; \
|
||||
default: cout << "Unhandled cast: " << SrcTy << " to " << Ty << "\n"; \
|
||||
break; \
|
||||
} \
|
||||
break
|
||||
@@ -1006,7 +1010,7 @@ static void executeCastInst(CastInst *I, ExecutionContext &SF) {
|
||||
IMPLEMENT_CAST_CASE(Float , (float));
|
||||
IMPLEMENT_CAST_CASE(Double , (double));
|
||||
default:
|
||||
cout << "Unhandled dest type for cast instruction: " << Ty << endl;
|
||||
cout << "Unhandled dest type for cast instruction: " << Ty << "\n";
|
||||
}
|
||||
SetValue(I, Dest, SF);
|
||||
}
|
||||
@@ -1060,7 +1064,6 @@ void Interpreter::callMethod(Method *M, const vector<GenericValue> &ArgVals) {
|
||||
if (RetTy != Type::VoidTy) {
|
||||
if (!ECStack.empty() && ECStack.back().Caller) {
|
||||
ExecutionContext &SF = ECStack.back();
|
||||
CallInst *Caller = SF.Caller;
|
||||
SetValue(SF.Caller, Result, SF);
|
||||
|
||||
SF.Caller = 0; // We returned from the call...
|
||||
@@ -1069,7 +1072,7 @@ void Interpreter::callMethod(Method *M, const vector<GenericValue> &ArgVals) {
|
||||
CW << "Method " << M->getType() << " \"" << M->getName()
|
||||
<< "\" returned ";
|
||||
print(RetTy, Result);
|
||||
cout << endl;
|
||||
cout << "\n";
|
||||
|
||||
if (RetTy->isIntegral())
|
||||
ExitCode = Result.SByteVal; // Capture the exit code of the program
|
||||
@@ -1290,8 +1293,8 @@ void Interpreter::printValue(const Type *Ty, GenericValue V) {
|
||||
case Type::UShortTyID: cout << V.UShortVal; break;
|
||||
case Type::IntTyID: cout << V.IntVal; break;
|
||||
case Type::UIntTyID: cout << V.UIntVal; break;
|
||||
case Type::LongTyID: cout << V.LongVal; break;
|
||||
case Type::ULongTyID: cout << V.ULongVal; break;
|
||||
case Type::LongTyID: cout << (long)V.LongVal; break;
|
||||
case Type::ULongTyID: cout << (unsigned long)V.ULongVal; break;
|
||||
case Type::FloatTyID: cout << V.FloatVal; break;
|
||||
case Type::DoubleTyID: cout << V.DoubleVal; break;
|
||||
case Type::PointerTyID:cout << (void*)V.PointerVal; break;
|
||||
@@ -1306,31 +1309,31 @@ void Interpreter::print(const Type *Ty, GenericValue V) {
|
||||
printValue(Ty, V);
|
||||
}
|
||||
|
||||
void Interpreter::print(const string &Name) {
|
||||
void Interpreter::print(const std::string &Name) {
|
||||
Value *PickedVal = ChooseOneOption(Name, LookupMatchingNames(Name));
|
||||
if (!PickedVal) return;
|
||||
|
||||
if (const Method *M = dyn_cast<const Method>(PickedVal)) {
|
||||
CW << M; // Print the method
|
||||
} else if (const Type *Ty = dyn_cast<const Type>(PickedVal)) {
|
||||
CW << "type %" << Name << " = " << Ty->getDescription() << endl;
|
||||
CW << "type %" << Name << " = " << Ty->getDescription() << "\n";
|
||||
} else if (const BasicBlock *BB = dyn_cast<const BasicBlock>(PickedVal)) {
|
||||
CW << BB; // Print the basic block
|
||||
} else { // Otherwise there should be an annotation for the slot#
|
||||
print(PickedVal->getType(),
|
||||
getOperandValue(PickedVal, ECStack[CurFrame]));
|
||||
cout << endl;
|
||||
cout << "\n";
|
||||
}
|
||||
}
|
||||
|
||||
void Interpreter::infoValue(const string &Name) {
|
||||
void Interpreter::infoValue(const std::string &Name) {
|
||||
Value *PickedVal = ChooseOneOption(Name, LookupMatchingNames(Name));
|
||||
if (!PickedVal) return;
|
||||
|
||||
cout << "Value: ";
|
||||
print(PickedVal->getType(),
|
||||
getOperandValue(PickedVal, ECStack[CurFrame]));
|
||||
cout << endl;
|
||||
cout << "\n";
|
||||
printOperandInfo(PickedVal, ECStack[CurFrame]);
|
||||
}
|
||||
|
||||
@@ -1353,7 +1356,7 @@ void Interpreter::printStackFrame(int FrameNo = -1) {
|
||||
printValue(Args[i]->getType(), getOperandValue(Args[i], ECStack[FrameNo]));
|
||||
}
|
||||
|
||||
cout << ")" << endl;
|
||||
cout << ")\n";
|
||||
CW << *(ECStack[FrameNo].CurInst-(FrameNo != int(ECStack.size()-1)));
|
||||
}
|
||||
|
||||
|
@@ -23,7 +23,7 @@ static AnnotationID MethodInfoAID(
|
||||
|
||||
struct MethodInfo : public Annotation {
|
||||
MethodInfo(Method *M);
|
||||
vector<unsigned> NumPlaneElements;
|
||||
std::vector<unsigned> NumPlaneElements;
|
||||
|
||||
|
||||
// Create - Factory function to allow MethodInfo annotations to be
|
||||
|
@@ -13,26 +13,29 @@
|
||||
#include "llvm/DerivedTypes.h"
|
||||
#include <map>
|
||||
#include <dlfcn.h>
|
||||
#include <iostream>
|
||||
#include <link.h>
|
||||
#include <math.h>
|
||||
#include <stdio.h>
|
||||
using std::vector;
|
||||
using std::cout;
|
||||
|
||||
typedef GenericValue (*ExFunc)(MethodType *, const vector<GenericValue> &);
|
||||
static map<const Method *, ExFunc> Functions;
|
||||
static map<string, ExFunc> FuncNames;
|
||||
static std::map<const Method *, ExFunc> Functions;
|
||||
static std::map<std::string, ExFunc> FuncNames;
|
||||
|
||||
static Interpreter *TheInterpreter;
|
||||
|
||||
// getCurrentExecutablePath() - Return the directory that the lli executable
|
||||
// lives in.
|
||||
//
|
||||
string Interpreter::getCurrentExecutablePath() const {
|
||||
std::string Interpreter::getCurrentExecutablePath() const {
|
||||
Dl_info Info;
|
||||
if (dladdr(&TheInterpreter, &Info) == 0) return "";
|
||||
|
||||
string LinkAddr(Info.dli_fname);
|
||||
std::string LinkAddr(Info.dli_fname);
|
||||
unsigned SlashPos = LinkAddr.rfind('/');
|
||||
if (SlashPos != string::npos)
|
||||
if (SlashPos != std::string::npos)
|
||||
LinkAddr.resize(SlashPos); // Trim the executable name off...
|
||||
|
||||
return LinkAddr;
|
||||
@@ -65,7 +68,7 @@ static char getTypeID(const Type *Ty) {
|
||||
static ExFunc lookupMethod(const Method *M) {
|
||||
// Function not found, look it up... start by figuring out what the
|
||||
// composite function name should be.
|
||||
string ExtName = "lle_";
|
||||
std::string ExtName = "lle_";
|
||||
const MethodType *MT = M->getMethodType();
|
||||
for (unsigned i = 0; const Type *Ty = MT->getContainedType(i); ++i)
|
||||
ExtName += getTypeID(Ty);
|
||||
@@ -80,7 +83,7 @@ static ExFunc lookupMethod(const Method *M) {
|
||||
if (FnPtr == 0) // Try calling a generic function... if it exists...
|
||||
FnPtr = (ExFunc)dlsym(RTLD_DEFAULT, ("lle_X_"+M->getName()).c_str());
|
||||
if (FnPtr != 0)
|
||||
Functions.insert(make_pair(M, FnPtr)); // Cache for later
|
||||
Functions.insert(std::make_pair(M, FnPtr)); // Cache for later
|
||||
return FnPtr;
|
||||
}
|
||||
|
||||
@@ -90,11 +93,11 @@ GenericValue Interpreter::callExternalMethod(Method *M,
|
||||
|
||||
// Do a lookup to see if the method is in our cache... this should just be a
|
||||
// defered annotation!
|
||||
map<const Method *, ExFunc>::iterator FI = Functions.find(M);
|
||||
std::map<const Method *, ExFunc>::iterator FI = Functions.find(M);
|
||||
ExFunc Fn = (FI == Functions.end()) ? lookupMethod(M) : FI->second;
|
||||
if (Fn == 0) {
|
||||
cout << "Tried to execute an unknown external method: "
|
||||
<< M->getType()->getDescription() << " " << M->getName() << endl;
|
||||
<< M->getType()->getDescription() << " " << M->getName() << "\n";
|
||||
return GenericValue();
|
||||
}
|
||||
|
||||
@@ -177,13 +180,13 @@ GenericValue lle_Vb_putchar(MethodType *M, const vector<GenericValue> &Args) {
|
||||
|
||||
// int "putchar"(int)
|
||||
GenericValue lle_ii_putchar(MethodType *M, const vector<GenericValue> &Args) {
|
||||
cout << ((char)Args[0].IntVal) << flush;
|
||||
cout << ((char)Args[0].IntVal) << std::flush;
|
||||
return Args[0];
|
||||
}
|
||||
|
||||
// void "putchar"(ubyte)
|
||||
GenericValue lle_VB_putchar(MethodType *M, const vector<GenericValue> &Args) {
|
||||
cout << Args[0].SByteVal << flush;
|
||||
cout << Args[0].SByteVal << std::flush;
|
||||
return Args[0];
|
||||
}
|
||||
|
||||
|
@@ -41,7 +41,7 @@ union GenericValue {
|
||||
PointerTy PointerVal;
|
||||
};
|
||||
|
||||
typedef vector<GenericValue> ValuePlaneTy;
|
||||
typedef std::vector<GenericValue> ValuePlaneTy;
|
||||
|
||||
// ExecutionContext struct - This struct represents one stack frame currently
|
||||
// executing.
|
||||
@@ -51,7 +51,7 @@ struct ExecutionContext {
|
||||
BasicBlock *CurBB; // The currently executing BB
|
||||
BasicBlock::iterator CurInst; // The next instruction to execute
|
||||
MethodInfo *MethInfo; // The MethInfo annotation for the method
|
||||
vector<ValuePlaneTy> Values; // ValuePlanes for each type
|
||||
std::vector<ValuePlaneTy> Values;// ValuePlanes for each type
|
||||
|
||||
BasicBlock *PrevBB; // The previous BB or null if in first BB
|
||||
CallInst *Caller; // Holds the call that called subframes.
|
||||
@@ -69,7 +69,7 @@ class Interpreter {
|
||||
|
||||
// The runtime stack of executing code. The top of the stack is the current
|
||||
// method record.
|
||||
vector<ExecutionContext> ECStack;
|
||||
std::vector<ExecutionContext> ECStack;
|
||||
|
||||
public:
|
||||
Interpreter();
|
||||
@@ -86,24 +86,24 @@ public:
|
||||
void handleUserInput();
|
||||
|
||||
// User Interation Methods...
|
||||
void loadModule(const string &Filename);
|
||||
void loadModule(const std::string &Filename);
|
||||
bool flushModule();
|
||||
bool callMethod(const string &Name); // return true on failure
|
||||
void setBreakpoint(const string &Name);
|
||||
void infoValue(const string &Name);
|
||||
void print(const string &Name);
|
||||
bool callMethod(const std::string &Name); // return true on failure
|
||||
void setBreakpoint(const std::string &Name);
|
||||
void infoValue(const std::string &Name);
|
||||
void print(const std::string &Name);
|
||||
static void print(const Type *Ty, GenericValue V);
|
||||
static void printValue(const Type *Ty, GenericValue V);
|
||||
|
||||
// Hack until we can parse command line args...
|
||||
bool callMainMethod(const string &MainName,
|
||||
const vector<string> &InputFilename);
|
||||
bool callMainMethod(const std::string &MainName,
|
||||
const std::vector<std::string> &InputFilename);
|
||||
|
||||
void list(); // Do the 'list' command
|
||||
void printStackTrace(); // Do the 'backtrace' command
|
||||
|
||||
// Code execution methods...
|
||||
void callMethod (Method *Meth, const vector<GenericValue> &ArgVals);
|
||||
void callMethod(Method *Meth, const std::vector<GenericValue> &ArgVals);
|
||||
bool executeInstruction(); // Execute one instruction...
|
||||
|
||||
void stepInstruction(); // Do the 'step' command
|
||||
@@ -117,7 +117,7 @@ public:
|
||||
void executeBrInst(BranchInst *I, ExecutionContext &SF);
|
||||
void executeAllocInst(AllocationInst *I, ExecutionContext &SF);
|
||||
GenericValue callExternalMethod(Method *Meth,
|
||||
const vector<GenericValue> &ArgVals);
|
||||
const std::vector<GenericValue> &ArgVals);
|
||||
void exitCalled(GenericValue GV);
|
||||
|
||||
// getCurrentMethod - Return the currently executing method
|
||||
@@ -134,7 +134,7 @@ private: // Helper functions
|
||||
// getCurrentExecutablePath() - Return the directory that the lli executable
|
||||
// lives in.
|
||||
//
|
||||
string getCurrentExecutablePath() const;
|
||||
std::string getCurrentExecutablePath() const;
|
||||
|
||||
// printCurrentInstruction - Print out the instruction that the virtual PC is
|
||||
// at, or fail silently if no program is running.
|
||||
@@ -151,13 +151,14 @@ private: // Helper functions
|
||||
// matches to that name. This is obviously slow, and should only be used for
|
||||
// user interaction.
|
||||
//
|
||||
vector<Value*> LookupMatchingNames(const string &Name);
|
||||
std::vector<Value*> LookupMatchingNames(const std::string &Name);
|
||||
|
||||
// ChooseOneOption - Prompt the user to choose among the specified options to
|
||||
// pick one value. If no options are provided, emit an error. If a single
|
||||
// option is provided, just return that option.
|
||||
//
|
||||
Value *ChooseOneOption(const string &Name, const vector<Value*> &Opts);
|
||||
Value *ChooseOneOption(const std::string &Name,
|
||||
const std::vector<Value*> &Opts);
|
||||
|
||||
|
||||
void initializeExecutionEngine();
|
||||
|
@@ -7,13 +7,15 @@
|
||||
#include "Interpreter.h"
|
||||
#include "llvm/SymbolTable.h"
|
||||
#include "llvm/Assembly/Writer.h"
|
||||
#include <iostream>
|
||||
using std::cout;
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
//
|
||||
// LookupMatchingNames helper - Search a symbol table for values matching Name.
|
||||
//
|
||||
static inline void LookupMatchingNames(const string &Name, SymTabValue &STV,
|
||||
vector<Value*> &Results) {
|
||||
static inline void LookupMatchingNames(const std::string &Name,SymTabValue &STV,
|
||||
std::vector<Value*> &Results) {
|
||||
SymbolTable *SymTab = STV.getSymbolTable();
|
||||
if (SymTab == 0) return; // No symbolic values :(
|
||||
|
||||
@@ -34,8 +36,8 @@ static inline void LookupMatchingNames(const string &Name, SymTabValue &STV,
|
||||
// matches to that name. This is obviously slow, and should only be used for
|
||||
// user interaction.
|
||||
//
|
||||
vector<Value*> Interpreter::LookupMatchingNames(const string &Name) {
|
||||
vector<Value*> Results;
|
||||
std::vector<Value*> Interpreter::LookupMatchingNames(const std::string &Name) {
|
||||
std::vector<Value*> Results;
|
||||
Method *CurMeth = getCurrentMethod();
|
||||
|
||||
if (CurMeth) ::LookupMatchingNames(Name, *CurMeth, Results);
|
||||
@@ -47,8 +49,8 @@ vector<Value*> Interpreter::LookupMatchingNames(const string &Name) {
|
||||
// pick one value. If no options are provided, emit an error. If a single
|
||||
// option is provided, just return that option.
|
||||
//
|
||||
Value *Interpreter::ChooseOneOption(const string &Name,
|
||||
const vector<Value*> &Opts) {
|
||||
Value *Interpreter::ChooseOneOption(const std::string &Name,
|
||||
const std::vector<Value*> &Opts) {
|
||||
switch (Opts.size()) {
|
||||
case 1: return Opts[0];
|
||||
case 0:
|
||||
@@ -61,16 +63,16 @@ Value *Interpreter::ChooseOneOption(const string &Name,
|
||||
cout << " 0. Cancel operation\n";
|
||||
for (unsigned i = 0; i < Opts.size(); ++i) {
|
||||
cout << " " << (i+1) << ".";
|
||||
WriteAsOperand(cout, Opts[i]) << endl;
|
||||
WriteAsOperand(cout, Opts[i]) << "\n";
|
||||
}
|
||||
|
||||
unsigned Option;
|
||||
do {
|
||||
cout << "lli> " << flush;
|
||||
cin >> Option;
|
||||
cout << "lli> " << std::flush;
|
||||
std::cin >> Option;
|
||||
if (Option > Opts.size())
|
||||
cout << "Invalid selection: Please choose from 0 to " << Opts.size()
|
||||
<< endl;
|
||||
<< "\n";
|
||||
} while (Option > Opts.size());
|
||||
|
||||
if (Option == 0) return 0;
|
||||
|
@@ -10,6 +10,9 @@
|
||||
#include "llvm/DerivedTypes.h"
|
||||
#include "llvm/Transforms/Linker.h"
|
||||
#include <algorithm>
|
||||
using std::string;
|
||||
using std::cout;
|
||||
using std::cin;
|
||||
|
||||
enum CommandID {
|
||||
Quit, Help, // Basics
|
||||
@@ -69,14 +72,14 @@ void Interpreter::handleUserInput() {
|
||||
bool UserQuit = false;
|
||||
|
||||
// Sort the table...
|
||||
sort(CommandTable, CommandTableEnd);
|
||||
std::sort(CommandTable, CommandTableEnd);
|
||||
|
||||
// Print the instruction that we are stopped at...
|
||||
printCurrentInstruction();
|
||||
|
||||
do {
|
||||
string Command;
|
||||
cout << "lli> " << flush;
|
||||
cout << "lli> " << std::flush;
|
||||
cin >> Command;
|
||||
|
||||
CommandTableElement *E = find(CommandTable, CommandTableEnd, Command);
|
||||
@@ -164,11 +167,11 @@ void Interpreter::loadModule(const string &Filename) {
|
||||
|
||||
if (Module *SupportLib = ParseBytecodeFile(RuntimeLib, &ErrorMsg)) {
|
||||
if (LinkModules(CurMod, SupportLib, &ErrorMsg))
|
||||
cerr << "Error Linking runtime library into current module: "
|
||||
<< ErrorMsg << endl;
|
||||
std::cerr << "Error Linking runtime library into current module: "
|
||||
<< ErrorMsg << "\n";
|
||||
} else {
|
||||
cerr << "Error loading runtime library '"+RuntimeLib+"': "
|
||||
<< ErrorMsg << "\n";
|
||||
std::cerr << "Error loading runtime library '"+RuntimeLib+"': "
|
||||
<< ErrorMsg << "\n";
|
||||
}
|
||||
}
|
||||
|
||||
@@ -208,7 +211,7 @@ void Interpreter::setBreakpoint(const string &Name) {
|
||||
// callMethod - Enter the specified method...
|
||||
//
|
||||
bool Interpreter::callMethod(const string &Name) {
|
||||
vector<Value*> Options = LookupMatchingNames(Name);
|
||||
std::vector<Value*> Options = LookupMatchingNames(Name);
|
||||
|
||||
for (unsigned i = 0; i < Options.size(); ++i) { // Remove nonmethod matches...
|
||||
if (!isa<Method>(Options[i])) {
|
||||
@@ -223,7 +226,7 @@ bool Interpreter::callMethod(const string &Name) {
|
||||
|
||||
Method *M = cast<Method>(PickedMeth);
|
||||
|
||||
vector<GenericValue> Args;
|
||||
std::vector<GenericValue> Args;
|
||||
// TODO, get args from user...
|
||||
|
||||
callMethod(M, Args); // Start executing it...
|
||||
@@ -234,7 +237,7 @@ bool Interpreter::callMethod(const string &Name) {
|
||||
return false;
|
||||
}
|
||||
|
||||
static void *CreateArgv(const vector<string> &InputArgv) {
|
||||
static void *CreateArgv(const std::vector<string> &InputArgv) {
|
||||
// Pointers are 64 bits...
|
||||
uint64_t *Result = new PointerTy[InputArgv.size()+1];
|
||||
|
||||
@@ -255,8 +258,8 @@ static void *CreateArgv(const vector<string> &InputArgv) {
|
||||
// callMethod can parse command line options and stuff for us.
|
||||
//
|
||||
bool Interpreter::callMainMethod(const string &Name,
|
||||
const vector<string> &InputArgv) {
|
||||
vector<Value*> Options = LookupMatchingNames(Name);
|
||||
const std::vector<string> &InputArgv) {
|
||||
std::vector<Value*> Options = LookupMatchingNames(Name);
|
||||
|
||||
for (unsigned i = 0; i < Options.size(); ++i) { // Remove nonmethod matches...
|
||||
if (!isa<Method>(Options[i])) {
|
||||
@@ -272,7 +275,7 @@ bool Interpreter::callMainMethod(const string &Name,
|
||||
Method *M = cast<Method>(PickedMeth);
|
||||
const MethodType *MT = M->getMethodType();
|
||||
|
||||
vector<GenericValue> Args;
|
||||
std::vector<GenericValue> Args;
|
||||
switch (MT->getParamTypes().size()) {
|
||||
default:
|
||||
cout << "Unknown number of arguments to synthesize for '" << Name << "'!\n";
|
||||
|
Reference in New Issue
Block a user