ExternalFunctions.cpp revision 665ee88504ae8e4440fd1609f3d88c3481cebe12
17720c8e1a7a252e983e3f3e7f841d7901dfea80cChris Lattner//===-- ExternalMethods.cpp - Implement External Methods ------------------===// 27720c8e1a7a252e983e3f3e7f841d7901dfea80cChris Lattner// 37720c8e1a7a252e983e3f3e7f841d7901dfea80cChris Lattner// This file contains both code to deal with invoking "external" methods, but 47720c8e1a7a252e983e3f3e7f841d7901dfea80cChris Lattner// also contains code that implements "exported" external methods. 57720c8e1a7a252e983e3f3e7f841d7901dfea80cChris Lattner// 67720c8e1a7a252e983e3f3e7f841d7901dfea80cChris Lattner// External methods in LLI are implemented by dlopen'ing the lli executable and 77720c8e1a7a252e983e3f3e7f841d7901dfea80cChris Lattner// using dlsym to look op the methods that we want to invoke. If a method is 87720c8e1a7a252e983e3f3e7f841d7901dfea80cChris Lattner// found, then the arguments are mangled and passed in to the function call. 97720c8e1a7a252e983e3f3e7f841d7901dfea80cChris Lattner// 107720c8e1a7a252e983e3f3e7f841d7901dfea80cChris Lattner//===----------------------------------------------------------------------===// 117720c8e1a7a252e983e3f3e7f841d7901dfea80cChris Lattner 127720c8e1a7a252e983e3f3e7f841d7901dfea80cChris Lattner#include "Interpreter.h" 137720c8e1a7a252e983e3f3e7f841d7901dfea80cChris Lattner#include "llvm/DerivedTypes.h" 147720c8e1a7a252e983e3f3e7f841d7901dfea80cChris Lattner#include <map> 157720c8e1a7a252e983e3f3e7f841d7901dfea80cChris Lattner#include <dlfcn.h> 16697954c15da58bd8b186dbafdedd8b06db770201Chris Lattner#include <iostream> 177720c8e1a7a252e983e3f3e7f841d7901dfea80cChris Lattner#include <link.h> 18c25931673092b1dae646aeeac1d18f75d9640ec7Chris Lattner#include <math.h> 19c063d385fa4d7255639ef0db5c506190e7cabcb4Chris Lattner#include <stdio.h> 20697954c15da58bd8b186dbafdedd8b06db770201Chris Lattnerusing std::vector; 21697954c15da58bd8b186dbafdedd8b06db770201Chris Lattnerusing std::cout; 227720c8e1a7a252e983e3f3e7f841d7901dfea80cChris Lattner 237720c8e1a7a252e983e3f3e7f841d7901dfea80cChris Lattnertypedef GenericValue (*ExFunc)(MethodType *, const vector<GenericValue> &); 24697954c15da58bd8b186dbafdedd8b06db770201Chris Lattnerstatic std::map<const Method *, ExFunc> Functions; 25697954c15da58bd8b186dbafdedd8b06db770201Chris Lattnerstatic std::map<std::string, ExFunc> FuncNames; 267720c8e1a7a252e983e3f3e7f841d7901dfea80cChris Lattner 27e43db88b2d12f2aebbe62aca8465a46c92292fceChris Lattnerstatic Interpreter *TheInterpreter; 28e43db88b2d12f2aebbe62aca8465a46c92292fceChris Lattner 29e43db88b2d12f2aebbe62aca8465a46c92292fceChris Lattner// getCurrentExecutablePath() - Return the directory that the lli executable 30e43db88b2d12f2aebbe62aca8465a46c92292fceChris Lattner// lives in. 31e43db88b2d12f2aebbe62aca8465a46c92292fceChris Lattner// 32697954c15da58bd8b186dbafdedd8b06db770201Chris Lattnerstd::string Interpreter::getCurrentExecutablePath() const { 33e43db88b2d12f2aebbe62aca8465a46c92292fceChris Lattner Dl_info Info; 34e43db88b2d12f2aebbe62aca8465a46c92292fceChris Lattner if (dladdr(&TheInterpreter, &Info) == 0) return ""; 35e43db88b2d12f2aebbe62aca8465a46c92292fceChris Lattner 36697954c15da58bd8b186dbafdedd8b06db770201Chris Lattner std::string LinkAddr(Info.dli_fname); 37e43db88b2d12f2aebbe62aca8465a46c92292fceChris Lattner unsigned SlashPos = LinkAddr.rfind('/'); 38697954c15da58bd8b186dbafdedd8b06db770201Chris Lattner if (SlashPos != std::string::npos) 39e43db88b2d12f2aebbe62aca8465a46c92292fceChris Lattner LinkAddr.resize(SlashPos); // Trim the executable name off... 40e43db88b2d12f2aebbe62aca8465a46c92292fceChris Lattner 41e43db88b2d12f2aebbe62aca8465a46c92292fceChris Lattner return LinkAddr; 42e43db88b2d12f2aebbe62aca8465a46c92292fceChris Lattner} 43e43db88b2d12f2aebbe62aca8465a46c92292fceChris Lattner 44e43db88b2d12f2aebbe62aca8465a46c92292fceChris Lattner 457720c8e1a7a252e983e3f3e7f841d7901dfea80cChris Lattnerstatic char getTypeID(const Type *Ty) { 467720c8e1a7a252e983e3f3e7f841d7901dfea80cChris Lattner switch (Ty->getPrimitiveID()) { 477720c8e1a7a252e983e3f3e7f841d7901dfea80cChris Lattner case Type::VoidTyID: return 'V'; 487720c8e1a7a252e983e3f3e7f841d7901dfea80cChris Lattner case Type::BoolTyID: return 'o'; 497720c8e1a7a252e983e3f3e7f841d7901dfea80cChris Lattner case Type::UByteTyID: return 'B'; 507720c8e1a7a252e983e3f3e7f841d7901dfea80cChris Lattner case Type::SByteTyID: return 'b'; 517720c8e1a7a252e983e3f3e7f841d7901dfea80cChris Lattner case Type::UShortTyID: return 'S'; 527720c8e1a7a252e983e3f3e7f841d7901dfea80cChris Lattner case Type::ShortTyID: return 's'; 537720c8e1a7a252e983e3f3e7f841d7901dfea80cChris Lattner case Type::UIntTyID: return 'I'; 547720c8e1a7a252e983e3f3e7f841d7901dfea80cChris Lattner case Type::IntTyID: return 'i'; 557720c8e1a7a252e983e3f3e7f841d7901dfea80cChris Lattner case Type::ULongTyID: return 'L'; 567720c8e1a7a252e983e3f3e7f841d7901dfea80cChris Lattner case Type::LongTyID: return 'l'; 577720c8e1a7a252e983e3f3e7f841d7901dfea80cChris Lattner case Type::FloatTyID: return 'F'; 587720c8e1a7a252e983e3f3e7f841d7901dfea80cChris Lattner case Type::DoubleTyID: return 'D'; 597720c8e1a7a252e983e3f3e7f841d7901dfea80cChris Lattner case Type::PointerTyID: return 'P'; 607720c8e1a7a252e983e3f3e7f841d7901dfea80cChris Lattner case Type::MethodTyID: return 'M'; 617720c8e1a7a252e983e3f3e7f841d7901dfea80cChris Lattner case Type::StructTyID: return 'T'; 627720c8e1a7a252e983e3f3e7f841d7901dfea80cChris Lattner case Type::ArrayTyID: return 'A'; 637720c8e1a7a252e983e3f3e7f841d7901dfea80cChris Lattner case Type::OpaqueTyID: return 'O'; 647720c8e1a7a252e983e3f3e7f841d7901dfea80cChris Lattner default: return 'U'; 657720c8e1a7a252e983e3f3e7f841d7901dfea80cChris Lattner } 667720c8e1a7a252e983e3f3e7f841d7901dfea80cChris Lattner} 677720c8e1a7a252e983e3f3e7f841d7901dfea80cChris Lattner 687720c8e1a7a252e983e3f3e7f841d7901dfea80cChris Lattnerstatic ExFunc lookupMethod(const Method *M) { 697720c8e1a7a252e983e3f3e7f841d7901dfea80cChris Lattner // Function not found, look it up... start by figuring out what the 707720c8e1a7a252e983e3f3e7f841d7901dfea80cChris Lattner // composite function name should be. 71697954c15da58bd8b186dbafdedd8b06db770201Chris Lattner std::string ExtName = "lle_"; 72ef9c23f2812322ae5c5f3140bfbcf92629d7ff47Chris Lattner const MethodType *MT = M->getMethodType(); 737720c8e1a7a252e983e3f3e7f841d7901dfea80cChris Lattner for (unsigned i = 0; const Type *Ty = MT->getContainedType(i); ++i) 747720c8e1a7a252e983e3f3e7f841d7901dfea80cChris Lattner ExtName += getTypeID(Ty); 757720c8e1a7a252e983e3f3e7f841d7901dfea80cChris Lattner ExtName += "_" + M->getName(); 767720c8e1a7a252e983e3f3e7f841d7901dfea80cChris Lattner 777720c8e1a7a252e983e3f3e7f841d7901dfea80cChris Lattner //cout << "Tried: '" << ExtName << "'\n"; 784721f1304f3d49e44c78c9eed882a34ad7388be0Chris Lattner ExFunc FnPtr = FuncNames[ExtName]; 794721f1304f3d49e44c78c9eed882a34ad7388be0Chris Lattner if (FnPtr == 0) 804721f1304f3d49e44c78c9eed882a34ad7388be0Chris Lattner FnPtr = (ExFunc)dlsym(RTLD_DEFAULT, ExtName.c_str()); 814721f1304f3d49e44c78c9eed882a34ad7388be0Chris Lattner if (FnPtr == 0) 824721f1304f3d49e44c78c9eed882a34ad7388be0Chris Lattner FnPtr = FuncNames["lle_X_"+M->getName()]; 837720c8e1a7a252e983e3f3e7f841d7901dfea80cChris Lattner if (FnPtr == 0) // Try calling a generic function... if it exists... 847720c8e1a7a252e983e3f3e7f841d7901dfea80cChris Lattner FnPtr = (ExFunc)dlsym(RTLD_DEFAULT, ("lle_X_"+M->getName()).c_str()); 857720c8e1a7a252e983e3f3e7f841d7901dfea80cChris Lattner if (FnPtr != 0) 86697954c15da58bd8b186dbafdedd8b06db770201Chris Lattner Functions.insert(std::make_pair(M, FnPtr)); // Cache for later 877720c8e1a7a252e983e3f3e7f841d7901dfea80cChris Lattner return FnPtr; 887720c8e1a7a252e983e3f3e7f841d7901dfea80cChris Lattner} 897720c8e1a7a252e983e3f3e7f841d7901dfea80cChris Lattner 904721f1304f3d49e44c78c9eed882a34ad7388be0Chris LattnerGenericValue Interpreter::callExternalMethod(Method *M, 914721f1304f3d49e44c78c9eed882a34ad7388be0Chris Lattner const vector<GenericValue> &ArgVals) { 92e43db88b2d12f2aebbe62aca8465a46c92292fceChris Lattner TheInterpreter = this; 93e43db88b2d12f2aebbe62aca8465a46c92292fceChris Lattner 947720c8e1a7a252e983e3f3e7f841d7901dfea80cChris Lattner // Do a lookup to see if the method is in our cache... this should just be a 957720c8e1a7a252e983e3f3e7f841d7901dfea80cChris Lattner // defered annotation! 96697954c15da58bd8b186dbafdedd8b06db770201Chris Lattner std::map<const Method *, ExFunc>::iterator FI = Functions.find(M); 977720c8e1a7a252e983e3f3e7f841d7901dfea80cChris Lattner ExFunc Fn = (FI == Functions.end()) ? lookupMethod(M) : FI->second; 987720c8e1a7a252e983e3f3e7f841d7901dfea80cChris Lattner if (Fn == 0) { 997720c8e1a7a252e983e3f3e7f841d7901dfea80cChris Lattner cout << "Tried to execute an unknown external method: " 100697954c15da58bd8b186dbafdedd8b06db770201Chris Lattner << M->getType()->getDescription() << " " << M->getName() << "\n"; 1014721f1304f3d49e44c78c9eed882a34ad7388be0Chris Lattner return GenericValue(); 1027720c8e1a7a252e983e3f3e7f841d7901dfea80cChris Lattner } 1037720c8e1a7a252e983e3f3e7f841d7901dfea80cChris Lattner 1047720c8e1a7a252e983e3f3e7f841d7901dfea80cChris Lattner // TODO: FIXME when types are not const! 105ef9c23f2812322ae5c5f3140bfbcf92629d7ff47Chris Lattner GenericValue Result = Fn(const_cast<MethodType*>(M->getMethodType()),ArgVals); 1064721f1304f3d49e44c78c9eed882a34ad7388be0Chris Lattner return Result; 1077720c8e1a7a252e983e3f3e7f841d7901dfea80cChris Lattner} 1087720c8e1a7a252e983e3f3e7f841d7901dfea80cChris Lattner 1097720c8e1a7a252e983e3f3e7f841d7901dfea80cChris Lattner 1107720c8e1a7a252e983e3f3e7f841d7901dfea80cChris Lattner//===----------------------------------------------------------------------===// 1117720c8e1a7a252e983e3f3e7f841d7901dfea80cChris Lattner// Methods "exported" to the running application... 1127720c8e1a7a252e983e3f3e7f841d7901dfea80cChris Lattner// 1137720c8e1a7a252e983e3f3e7f841d7901dfea80cChris Lattnerextern "C" { // Don't add C++ manglings to llvm mangling :) 1147720c8e1a7a252e983e3f3e7f841d7901dfea80cChris Lattner 1152e42d3a3060ff0c3d4c419f17493bc6a7683e9d0Chris Lattner// Implement void printstr([ubyte {x N}] *) 1162e42d3a3060ff0c3d4c419f17493bc6a7683e9d0Chris LattnerGenericValue lle_VP_printstr(MethodType *M, const vector<GenericValue> &ArgVal){ 1172e42d3a3060ff0c3d4c419f17493bc6a7683e9d0Chris Lattner assert(ArgVal.size() == 1 && "printstr only takes one argument!"); 1182e42d3a3060ff0c3d4c419f17493bc6a7683e9d0Chris Lattner cout << (char*)ArgVal[0].PointerVal; 1192e42d3a3060ff0c3d4c419f17493bc6a7683e9d0Chris Lattner return GenericValue(); 1202e42d3a3060ff0c3d4c419f17493bc6a7683e9d0Chris Lattner} 1212e42d3a3060ff0c3d4c419f17493bc6a7683e9d0Chris Lattner 1227720c8e1a7a252e983e3f3e7f841d7901dfea80cChris Lattner// Implement 'void print(X)' for every type... 1237720c8e1a7a252e983e3f3e7f841d7901dfea80cChris LattnerGenericValue lle_X_print(MethodType *M, const vector<GenericValue> &ArgVals) { 1247720c8e1a7a252e983e3f3e7f841d7901dfea80cChris Lattner assert(ArgVals.size() == 1 && "generic print only takes one argument!"); 1252e42d3a3060ff0c3d4c419f17493bc6a7683e9d0Chris Lattner 1262e42d3a3060ff0c3d4c419f17493bc6a7683e9d0Chris Lattner Interpreter::print(M->getParamTypes()[0], ArgVals[0]); 1272e42d3a3060ff0c3d4c419f17493bc6a7683e9d0Chris Lattner return GenericValue(); 1282e42d3a3060ff0c3d4c419f17493bc6a7683e9d0Chris Lattner} 1292e42d3a3060ff0c3d4c419f17493bc6a7683e9d0Chris Lattner 1302e42d3a3060ff0c3d4c419f17493bc6a7683e9d0Chris Lattner// Implement 'void printVal(X)' for every type... 1312e42d3a3060ff0c3d4c419f17493bc6a7683e9d0Chris LattnerGenericValue lle_X_printVal(MethodType *M, const vector<GenericValue> &ArgVal) { 1322e42d3a3060ff0c3d4c419f17493bc6a7683e9d0Chris Lattner assert(ArgVal.size() == 1 && "generic print only takes one argument!"); 1332e42d3a3060ff0c3d4c419f17493bc6a7683e9d0Chris Lattner 134f8f2afb8cc5f080b291faad678e0a256ea44d15fChris Lattner // Specialize print([ubyte {x N} ] *) and print(sbyte *) 1352e42d3a3060ff0c3d4c419f17493bc6a7683e9d0Chris Lattner if (PointerType *PTy = dyn_cast<PointerType>(M->getParamTypes()[0].get())) 1367a1767520611d9ff6face702068de858e1cadf2cChris Lattner if (PTy->getElementType() == Type::SByteTy || 1377a1767520611d9ff6face702068de858e1cadf2cChris Lattner isa<ArrayType>(PTy->getElementType())) { 1382e42d3a3060ff0c3d4c419f17493bc6a7683e9d0Chris Lattner return lle_VP_printstr(M, ArgVal); 1392e42d3a3060ff0c3d4c419f17493bc6a7683e9d0Chris Lattner } 1402e42d3a3060ff0c3d4c419f17493bc6a7683e9d0Chris Lattner 1412e42d3a3060ff0c3d4c419f17493bc6a7683e9d0Chris Lattner Interpreter::printValue(M->getParamTypes()[0], ArgVal[0]); 1427720c8e1a7a252e983e3f3e7f841d7901dfea80cChris Lattner return GenericValue(); 1437720c8e1a7a252e983e3f3e7f841d7901dfea80cChris Lattner} 1447720c8e1a7a252e983e3f3e7f841d7901dfea80cChris Lattner 1453eb60f8775941422a7f04c0e16bd3a7fac9b73f5Vikram S. Adve// Implement 'void printString(X)' 1463eb60f8775941422a7f04c0e16bd3a7fac9b73f5Vikram S. Adve// Argument must be [ubyte {x N} ] * or sbyte * 1473eb60f8775941422a7f04c0e16bd3a7fac9b73f5Vikram S. AdveGenericValue lle_X_printString(MethodType *M, const vector<GenericValue> &ArgVal) { 1483eb60f8775941422a7f04c0e16bd3a7fac9b73f5Vikram S. Adve assert(ArgVal.size() == 1 && "generic print only takes one argument!"); 1493eb60f8775941422a7f04c0e16bd3a7fac9b73f5Vikram S. Adve return lle_VP_printstr(M, ArgVal); 1503eb60f8775941422a7f04c0e16bd3a7fac9b73f5Vikram S. Adve} 1513eb60f8775941422a7f04c0e16bd3a7fac9b73f5Vikram S. Adve 1523eb60f8775941422a7f04c0e16bd3a7fac9b73f5Vikram S. Adve// Implement 'void print<TYPE>(X)' for each primitive type or pointer type 1533eb60f8775941422a7f04c0e16bd3a7fac9b73f5Vikram S. Adve#define PRINT_TYPE_FUNC(TYPENAME,TYPEID) \ 154316a65bda996a5b22bf5e8dacadee848d51f6cbeChris Lattner GenericValue lle_X_print##TYPENAME(MethodType *M,\ 155316a65bda996a5b22bf5e8dacadee848d51f6cbeChris Lattner const vector<GenericValue> &ArgVal) {\ 1563eb60f8775941422a7f04c0e16bd3a7fac9b73f5Vikram S. Adve assert(ArgVal.size() == 1 && "generic print only takes one argument!");\ 15769b5ce90dcd2043f5a6913665c357442b174fdd2Chris Lattner assert(M->getParamTypes()[0].get()->getPrimitiveID() == Type::TYPEID);\ 1583eb60f8775941422a7f04c0e16bd3a7fac9b73f5Vikram S. Adve Interpreter::printValue(M->getParamTypes()[0], ArgVal[0]);\ 1593eb60f8775941422a7f04c0e16bd3a7fac9b73f5Vikram S. Adve return GenericValue();\ 1603eb60f8775941422a7f04c0e16bd3a7fac9b73f5Vikram S. Adve } 1613eb60f8775941422a7f04c0e16bd3a7fac9b73f5Vikram S. Adve 1624721f1304f3d49e44c78c9eed882a34ad7388be0Chris LattnerPRINT_TYPE_FUNC(SByte, SByteTyID) 1633eb60f8775941422a7f04c0e16bd3a7fac9b73f5Vikram S. AdvePRINT_TYPE_FUNC(UByte, UByteTyID) 1643eb60f8775941422a7f04c0e16bd3a7fac9b73f5Vikram S. AdvePRINT_TYPE_FUNC(Short, ShortTyID) 1653eb60f8775941422a7f04c0e16bd3a7fac9b73f5Vikram S. AdvePRINT_TYPE_FUNC(UShort, UShortTyID) 1663eb60f8775941422a7f04c0e16bd3a7fac9b73f5Vikram S. AdvePRINT_TYPE_FUNC(Int, IntTyID) 1673eb60f8775941422a7f04c0e16bd3a7fac9b73f5Vikram S. AdvePRINT_TYPE_FUNC(UInt, UIntTyID) 1683eb60f8775941422a7f04c0e16bd3a7fac9b73f5Vikram S. AdvePRINT_TYPE_FUNC(Long, LongTyID) 1693eb60f8775941422a7f04c0e16bd3a7fac9b73f5Vikram S. AdvePRINT_TYPE_FUNC(ULong, ULongTyID) 1703eb60f8775941422a7f04c0e16bd3a7fac9b73f5Vikram S. AdvePRINT_TYPE_FUNC(Float, FloatTyID) 1713eb60f8775941422a7f04c0e16bd3a7fac9b73f5Vikram S. AdvePRINT_TYPE_FUNC(Double, DoubleTyID) 1723eb60f8775941422a7f04c0e16bd3a7fac9b73f5Vikram S. AdvePRINT_TYPE_FUNC(Pointer, PointerTyID) 1733eb60f8775941422a7f04c0e16bd3a7fac9b73f5Vikram S. Adve 1743eb60f8775941422a7f04c0e16bd3a7fac9b73f5Vikram S. Adve 1757720c8e1a7a252e983e3f3e7f841d7901dfea80cChris Lattner// void "putchar"(sbyte) 1767720c8e1a7a252e983e3f3e7f841d7901dfea80cChris LattnerGenericValue lle_Vb_putchar(MethodType *M, const vector<GenericValue> &Args) { 1777720c8e1a7a252e983e3f3e7f841d7901dfea80cChris Lattner cout << Args[0].SByteVal; 1787720c8e1a7a252e983e3f3e7f841d7901dfea80cChris Lattner return GenericValue(); 1797720c8e1a7a252e983e3f3e7f841d7901dfea80cChris Lattner} 1807720c8e1a7a252e983e3f3e7f841d7901dfea80cChris Lattner 181e43db88b2d12f2aebbe62aca8465a46c92292fceChris Lattner// int "putchar"(int) 182e43db88b2d12f2aebbe62aca8465a46c92292fceChris LattnerGenericValue lle_ii_putchar(MethodType *M, const vector<GenericValue> &Args) { 183697954c15da58bd8b186dbafdedd8b06db770201Chris Lattner cout << ((char)Args[0].IntVal) << std::flush; 184e43db88b2d12f2aebbe62aca8465a46c92292fceChris Lattner return Args[0]; 185e43db88b2d12f2aebbe62aca8465a46c92292fceChris Lattner} 186e43db88b2d12f2aebbe62aca8465a46c92292fceChris Lattner 1872e42d3a3060ff0c3d4c419f17493bc6a7683e9d0Chris Lattner// void "putchar"(ubyte) 1882e42d3a3060ff0c3d4c419f17493bc6a7683e9d0Chris LattnerGenericValue lle_VB_putchar(MethodType *M, const vector<GenericValue> &Args) { 189697954c15da58bd8b186dbafdedd8b06db770201Chris Lattner cout << Args[0].SByteVal << std::flush; 190e43db88b2d12f2aebbe62aca8465a46c92292fceChris Lattner return Args[0]; 1912e42d3a3060ff0c3d4c419f17493bc6a7683e9d0Chris Lattner} 1922e42d3a3060ff0c3d4c419f17493bc6a7683e9d0Chris Lattner 193f8f2afb8cc5f080b291faad678e0a256ea44d15fChris Lattner// void "__main"() 194f8f2afb8cc5f080b291faad678e0a256ea44d15fChris LattnerGenericValue lle_V___main(MethodType *M, const vector<GenericValue> &Args) { 195f8f2afb8cc5f080b291faad678e0a256ea44d15fChris Lattner return GenericValue(); 196f8f2afb8cc5f080b291faad678e0a256ea44d15fChris Lattner} 197f8f2afb8cc5f080b291faad678e0a256ea44d15fChris Lattner 198e43db88b2d12f2aebbe62aca8465a46c92292fceChris Lattner// void "exit"(int) 1990f279b245dc5f84a6b7c89900fd0d48e324452e7Chris LattnerGenericValue lle_X_exit(MethodType *M, const vector<GenericValue> &Args) { 200e43db88b2d12f2aebbe62aca8465a46c92292fceChris Lattner TheInterpreter->exitCalled(Args[0]); 201e43db88b2d12f2aebbe62aca8465a46c92292fceChris Lattner return GenericValue(); 202e43db88b2d12f2aebbe62aca8465a46c92292fceChris Lattner} 203e43db88b2d12f2aebbe62aca8465a46c92292fceChris Lattner 204c25931673092b1dae646aeeac1d18f75d9640ec7Chris Lattner// void *malloc(uint) 2050f279b245dc5f84a6b7c89900fd0d48e324452e7Chris LattnerGenericValue lle_X_malloc(MethodType *M, const vector<GenericValue> &Args) { 2064721f1304f3d49e44c78c9eed882a34ad7388be0Chris Lattner assert(Args.size() == 1 && "Malloc expects one argument!"); 207c25931673092b1dae646aeeac1d18f75d9640ec7Chris Lattner GenericValue GV; 208ea38c0e85c29783fdaf3b6c25fe7e3aa43688521Chris Lattner GV.PointerVal = (PointerTy)malloc(Args[0].UIntVal); 209c25931673092b1dae646aeeac1d18f75d9640ec7Chris Lattner return GV; 210c25931673092b1dae646aeeac1d18f75d9640ec7Chris Lattner} 211c25931673092b1dae646aeeac1d18f75d9640ec7Chris Lattner 212c25931673092b1dae646aeeac1d18f75d9640ec7Chris Lattner// void free(void *) 2130f279b245dc5f84a6b7c89900fd0d48e324452e7Chris LattnerGenericValue lle_X_free(MethodType *M, const vector<GenericValue> &Args) { 214c063d385fa4d7255639ef0db5c506190e7cabcb4Chris Lattner assert(Args.size() == 1); 2154721f1304f3d49e44c78c9eed882a34ad7388be0Chris Lattner free((void*)Args[0].PointerVal); 216c25931673092b1dae646aeeac1d18f75d9640ec7Chris Lattner return GenericValue(); 217c25931673092b1dae646aeeac1d18f75d9640ec7Chris Lattner} 218c25931673092b1dae646aeeac1d18f75d9640ec7Chris Lattner 219782b939db105c1ead1ee9420d95fae8c341dbf47Chris Lattner// int atoi(char *) 220782b939db105c1ead1ee9420d95fae8c341dbf47Chris LattnerGenericValue lle_X_atoi(MethodType *M, const vector<GenericValue> &Args) { 221782b939db105c1ead1ee9420d95fae8c341dbf47Chris Lattner assert(Args.size() == 1); 222782b939db105c1ead1ee9420d95fae8c341dbf47Chris Lattner GenericValue GV; 223782b939db105c1ead1ee9420d95fae8c341dbf47Chris Lattner GV.IntVal = atoi((char*)Args[0].PointerVal); 224782b939db105c1ead1ee9420d95fae8c341dbf47Chris Lattner return GV; 225782b939db105c1ead1ee9420d95fae8c341dbf47Chris Lattner} 226782b939db105c1ead1ee9420d95fae8c341dbf47Chris Lattner 227c25931673092b1dae646aeeac1d18f75d9640ec7Chris Lattner// double pow(double, double) 2280f279b245dc5f84a6b7c89900fd0d48e324452e7Chris LattnerGenericValue lle_X_pow(MethodType *M, const vector<GenericValue> &Args) { 229c063d385fa4d7255639ef0db5c506190e7cabcb4Chris Lattner assert(Args.size() == 2); 230c25931673092b1dae646aeeac1d18f75d9640ec7Chris Lattner GenericValue GV; 23108845a242c574d695566cbc61e46da1c86c810acChris Lattner GV.DoubleVal = pow(Args[0].DoubleVal, Args[1].DoubleVal); 232c25931673092b1dae646aeeac1d18f75d9640ec7Chris Lattner return GV; 233c25931673092b1dae646aeeac1d18f75d9640ec7Chris Lattner} 234c25931673092b1dae646aeeac1d18f75d9640ec7Chris Lattner 23534dd24b0b83885a3992c02ce91fe02c244e83e97Chris Lattner// double exp(double) 23634dd24b0b83885a3992c02ce91fe02c244e83e97Chris LattnerGenericValue lle_X_exp(MethodType *M, const vector<GenericValue> &Args) { 23734dd24b0b83885a3992c02ce91fe02c244e83e97Chris Lattner assert(Args.size() == 1); 23834dd24b0b83885a3992c02ce91fe02c244e83e97Chris Lattner GenericValue GV; 23934dd24b0b83885a3992c02ce91fe02c244e83e97Chris Lattner GV.DoubleVal = exp(Args[0].DoubleVal); 24034dd24b0b83885a3992c02ce91fe02c244e83e97Chris Lattner return GV; 24134dd24b0b83885a3992c02ce91fe02c244e83e97Chris Lattner} 24234dd24b0b83885a3992c02ce91fe02c244e83e97Chris Lattner 243c063d385fa4d7255639ef0db5c506190e7cabcb4Chris Lattner// double sqrt(double) 244c063d385fa4d7255639ef0db5c506190e7cabcb4Chris LattnerGenericValue lle_X_sqrt(MethodType *M, const vector<GenericValue> &Args) { 245c063d385fa4d7255639ef0db5c506190e7cabcb4Chris Lattner assert(Args.size() == 1); 246c063d385fa4d7255639ef0db5c506190e7cabcb4Chris Lattner GenericValue GV; 247c063d385fa4d7255639ef0db5c506190e7cabcb4Chris Lattner GV.DoubleVal = sqrt(Args[0].DoubleVal); 248c063d385fa4d7255639ef0db5c506190e7cabcb4Chris Lattner return GV; 249c063d385fa4d7255639ef0db5c506190e7cabcb4Chris Lattner} 250c25931673092b1dae646aeeac1d18f75d9640ec7Chris Lattner 2518679005193a8a3f8c0eb975a321bd08dec4793d7Chris Lattner// double log(double) 2528679005193a8a3f8c0eb975a321bd08dec4793d7Chris LattnerGenericValue lle_X_log(MethodType *M, const vector<GenericValue> &Args) { 2538679005193a8a3f8c0eb975a321bd08dec4793d7Chris Lattner assert(Args.size() == 1); 2548679005193a8a3f8c0eb975a321bd08dec4793d7Chris Lattner GenericValue GV; 2558679005193a8a3f8c0eb975a321bd08dec4793d7Chris Lattner GV.DoubleVal = log(Args[0].DoubleVal); 2568679005193a8a3f8c0eb975a321bd08dec4793d7Chris Lattner return GV; 2578679005193a8a3f8c0eb975a321bd08dec4793d7Chris Lattner} 2588679005193a8a3f8c0eb975a321bd08dec4793d7Chris Lattner 259782b939db105c1ead1ee9420d95fae8c341dbf47Chris Lattner// double floor(double) 260782b939db105c1ead1ee9420d95fae8c341dbf47Chris LattnerGenericValue lle_X_floor(MethodType *M, const vector<GenericValue> &Args) { 261782b939db105c1ead1ee9420d95fae8c341dbf47Chris Lattner assert(Args.size() == 1); 262782b939db105c1ead1ee9420d95fae8c341dbf47Chris Lattner GenericValue GV; 263782b939db105c1ead1ee9420d95fae8c341dbf47Chris Lattner GV.DoubleVal = floor(Args[0].DoubleVal); 264782b939db105c1ead1ee9420d95fae8c341dbf47Chris Lattner return GV; 265782b939db105c1ead1ee9420d95fae8c341dbf47Chris Lattner} 266782b939db105c1ead1ee9420d95fae8c341dbf47Chris Lattner 2678679005193a8a3f8c0eb975a321bd08dec4793d7Chris Lattner// double drand48() 2688679005193a8a3f8c0eb975a321bd08dec4793d7Chris LattnerGenericValue lle_X_drand48(MethodType *M, const vector<GenericValue> &Args) { 2698679005193a8a3f8c0eb975a321bd08dec4793d7Chris Lattner assert(Args.size() == 0); 2708679005193a8a3f8c0eb975a321bd08dec4793d7Chris Lattner GenericValue GV; 2718679005193a8a3f8c0eb975a321bd08dec4793d7Chris Lattner GV.DoubleVal = drand48(); 2728679005193a8a3f8c0eb975a321bd08dec4793d7Chris Lattner return GV; 2738679005193a8a3f8c0eb975a321bd08dec4793d7Chris Lattner} 2748679005193a8a3f8c0eb975a321bd08dec4793d7Chris Lattner 2751b600144bda9717804ae3b998c95223947200075Chris Lattner// long lrand48() 2761b600144bda9717804ae3b998c95223947200075Chris LattnerGenericValue lle_X_lrand48(MethodType *M, const vector<GenericValue> &Args) { 2771b600144bda9717804ae3b998c95223947200075Chris Lattner assert(Args.size() == 0); 2781b600144bda9717804ae3b998c95223947200075Chris Lattner GenericValue GV; 2791b600144bda9717804ae3b998c95223947200075Chris Lattner GV.IntVal = lrand48(); 2801b600144bda9717804ae3b998c95223947200075Chris Lattner return GV; 2811b600144bda9717804ae3b998c95223947200075Chris Lattner} 2821b600144bda9717804ae3b998c95223947200075Chris Lattner 2831b600144bda9717804ae3b998c95223947200075Chris Lattner// void srand48(long) 2841b600144bda9717804ae3b998c95223947200075Chris LattnerGenericValue lle_X_srand48(MethodType *M, const vector<GenericValue> &Args) { 2851b600144bda9717804ae3b998c95223947200075Chris Lattner assert(Args.size() == 1); 2861b600144bda9717804ae3b998c95223947200075Chris Lattner srand48(Args[0].IntVal); 2871b600144bda9717804ae3b998c95223947200075Chris Lattner return GenericValue(); 2881b600144bda9717804ae3b998c95223947200075Chris Lattner} 2891b600144bda9717804ae3b998c95223947200075Chris Lattner 290782b939db105c1ead1ee9420d95fae8c341dbf47Chris Lattner// void srand(uint) 291782b939db105c1ead1ee9420d95fae8c341dbf47Chris LattnerGenericValue lle_X_srand(MethodType *M, const vector<GenericValue> &Args) { 292782b939db105c1ead1ee9420d95fae8c341dbf47Chris Lattner assert(Args.size() == 1); 293782b939db105c1ead1ee9420d95fae8c341dbf47Chris Lattner srand(Args[0].UIntVal); 294782b939db105c1ead1ee9420d95fae8c341dbf47Chris Lattner return GenericValue(); 295782b939db105c1ead1ee9420d95fae8c341dbf47Chris Lattner} 2968679005193a8a3f8c0eb975a321bd08dec4793d7Chris Lattner 297e7c6f726c8d18ff8803d9b3dc3a8443496002044Chris Lattner// int sprintf(sbyte *, sbyte *, ...) - a very rough implementation to make 298e7c6f726c8d18ff8803d9b3dc3a8443496002044Chris Lattner// output useful. 299e7c6f726c8d18ff8803d9b3dc3a8443496002044Chris LattnerGenericValue lle_X_sprintf(MethodType *M, const vector<GenericValue> &Args) { 300e7c6f726c8d18ff8803d9b3dc3a8443496002044Chris Lattner char *OutputBuffer = (char *)Args[0].PointerVal; 301e7c6f726c8d18ff8803d9b3dc3a8443496002044Chris Lattner const char *FmtStr = (const char *)Args[1].PointerVal; 302e7c6f726c8d18ff8803d9b3dc3a8443496002044Chris Lattner unsigned ArgNo = 2; 30308845a242c574d695566cbc61e46da1c86c810acChris Lattner 30408845a242c574d695566cbc61e46da1c86c810acChris Lattner // printf should return # chars printed. This is completely incorrect, but 30508845a242c574d695566cbc61e46da1c86c810acChris Lattner // close enough for now. 30608845a242c574d695566cbc61e46da1c86c810acChris Lattner GenericValue GV; GV.IntVal = strlen(FmtStr); 30708845a242c574d695566cbc61e46da1c86c810acChris Lattner while (1) { 30808845a242c574d695566cbc61e46da1c86c810acChris Lattner switch (*FmtStr) { 30908845a242c574d695566cbc61e46da1c86c810acChris Lattner case 0: return GV; // Null terminator... 31008845a242c574d695566cbc61e46da1c86c810acChris Lattner default: // Normal nonspecial character 311e7c6f726c8d18ff8803d9b3dc3a8443496002044Chris Lattner sprintf(OutputBuffer++, "%c", *FmtStr++); 31208845a242c574d695566cbc61e46da1c86c810acChris Lattner break; 31308845a242c574d695566cbc61e46da1c86c810acChris Lattner case '\\': { // Handle escape codes 314e7c6f726c8d18ff8803d9b3dc3a8443496002044Chris Lattner sprintf(OutputBuffer, "%c%c", *FmtStr, *(FmtStr+1)); 315e7c6f726c8d18ff8803d9b3dc3a8443496002044Chris Lattner FmtStr += 2; OutputBuffer += 2; 31608845a242c574d695566cbc61e46da1c86c810acChris Lattner break; 31708845a242c574d695566cbc61e46da1c86c810acChris Lattner } 31808845a242c574d695566cbc61e46da1c86c810acChris Lattner case '%': { // Handle format specifiers 319ea38c0e85c29783fdaf3b6c25fe7e3aa43688521Chris Lattner char FmtBuf[100] = "", Buffer[1000] = ""; 320ea38c0e85c29783fdaf3b6c25fe7e3aa43688521Chris Lattner char *FB = FmtBuf; 321ea38c0e85c29783fdaf3b6c25fe7e3aa43688521Chris Lattner *FB++ = *FmtStr++; 322ea38c0e85c29783fdaf3b6c25fe7e3aa43688521Chris Lattner char Last = *FB++ = *FmtStr++; 323ea38c0e85c29783fdaf3b6c25fe7e3aa43688521Chris Lattner unsigned HowLong = 0; 324ea38c0e85c29783fdaf3b6c25fe7e3aa43688521Chris Lattner while (Last != 'c' && Last != 'd' && Last != 'i' && Last != 'u' && 325ea38c0e85c29783fdaf3b6c25fe7e3aa43688521Chris Lattner Last != 'o' && Last != 'x' && Last != 'X' && Last != 'e' && 326ea38c0e85c29783fdaf3b6c25fe7e3aa43688521Chris Lattner Last != 'E' && Last != 'g' && Last != 'G' && Last != 'f' && 327ea38c0e85c29783fdaf3b6c25fe7e3aa43688521Chris Lattner Last != 'p' && Last != 's' && Last != '%') { 328ea38c0e85c29783fdaf3b6c25fe7e3aa43688521Chris Lattner if (Last == 'l' || Last == 'L') HowLong++; // Keep track of l's 329ea38c0e85c29783fdaf3b6c25fe7e3aa43688521Chris Lattner Last = *FB++ = *FmtStr++; 33008845a242c574d695566cbc61e46da1c86c810acChris Lattner } 331ea38c0e85c29783fdaf3b6c25fe7e3aa43688521Chris Lattner *FB = 0; 332ea38c0e85c29783fdaf3b6c25fe7e3aa43688521Chris Lattner 333ea38c0e85c29783fdaf3b6c25fe7e3aa43688521Chris Lattner switch (Last) { 334ea38c0e85c29783fdaf3b6c25fe7e3aa43688521Chris Lattner case '%': 335ea38c0e85c29783fdaf3b6c25fe7e3aa43688521Chris Lattner sprintf(Buffer, FmtBuf); break; 336ea38c0e85c29783fdaf3b6c25fe7e3aa43688521Chris Lattner case 'c': 337ea38c0e85c29783fdaf3b6c25fe7e3aa43688521Chris Lattner sprintf(Buffer, FmtBuf, Args[ArgNo++].SByteVal); break; 338ea38c0e85c29783fdaf3b6c25fe7e3aa43688521Chris Lattner case 'd': case 'i': 339ea38c0e85c29783fdaf3b6c25fe7e3aa43688521Chris Lattner case 'u': case 'o': 340ea38c0e85c29783fdaf3b6c25fe7e3aa43688521Chris Lattner case 'x': case 'X': 341ea38c0e85c29783fdaf3b6c25fe7e3aa43688521Chris Lattner if (HowLong == 2) 342ea38c0e85c29783fdaf3b6c25fe7e3aa43688521Chris Lattner sprintf(Buffer, FmtBuf, Args[ArgNo++].ULongVal); 343ea38c0e85c29783fdaf3b6c25fe7e3aa43688521Chris Lattner else 344ea38c0e85c29783fdaf3b6c25fe7e3aa43688521Chris Lattner sprintf(Buffer, FmtBuf, Args[ArgNo++].IntVal); break; 345ea38c0e85c29783fdaf3b6c25fe7e3aa43688521Chris Lattner case 'e': case 'E': case 'g': case 'G': case 'f': 346ea38c0e85c29783fdaf3b6c25fe7e3aa43688521Chris Lattner sprintf(Buffer, FmtBuf, Args[ArgNo++].DoubleVal); break; 347ea38c0e85c29783fdaf3b6c25fe7e3aa43688521Chris Lattner case 'p': 348ea38c0e85c29783fdaf3b6c25fe7e3aa43688521Chris Lattner sprintf(Buffer, FmtBuf, (void*)Args[ArgNo++].PointerVal); break; 349ea38c0e85c29783fdaf3b6c25fe7e3aa43688521Chris Lattner case 's': 350ea38c0e85c29783fdaf3b6c25fe7e3aa43688521Chris Lattner sprintf(Buffer, FmtBuf, (char*)Args[ArgNo++].PointerVal); break; 351ea38c0e85c29783fdaf3b6c25fe7e3aa43688521Chris Lattner default: cout << "<unknown printf code '" << *FmtStr << "'!>"; 352ea38c0e85c29783fdaf3b6c25fe7e3aa43688521Chris Lattner ArgNo++; break; 353ea38c0e85c29783fdaf3b6c25fe7e3aa43688521Chris Lattner } 354e7c6f726c8d18ff8803d9b3dc3a8443496002044Chris Lattner strcpy(OutputBuffer, Buffer); 355e7c6f726c8d18ff8803d9b3dc3a8443496002044Chris Lattner OutputBuffer += strlen(Buffer); 35608845a242c574d695566cbc61e46da1c86c810acChris Lattner } 35708845a242c574d695566cbc61e46da1c86c810acChris Lattner break; 35808845a242c574d695566cbc61e46da1c86c810acChris Lattner } 35908845a242c574d695566cbc61e46da1c86c810acChris Lattner } 36008845a242c574d695566cbc61e46da1c86c810acChris Lattner} 36108845a242c574d695566cbc61e46da1c86c810acChris Lattner 362e7c6f726c8d18ff8803d9b3dc3a8443496002044Chris Lattner// int printf(sbyte *, ...) - a very rough implementation to make output useful. 363e7c6f726c8d18ff8803d9b3dc3a8443496002044Chris LattnerGenericValue lle_X_printf(MethodType *M, const vector<GenericValue> &Args) { 364e7c6f726c8d18ff8803d9b3dc3a8443496002044Chris Lattner char Buffer[10000]; 365e7c6f726c8d18ff8803d9b3dc3a8443496002044Chris Lattner vector<GenericValue> NewArgs; 366e7c6f726c8d18ff8803d9b3dc3a8443496002044Chris Lattner GenericValue GV; GV.PointerVal = (PointerTy)Buffer; 367e7c6f726c8d18ff8803d9b3dc3a8443496002044Chris Lattner NewArgs.push_back(GV); 368e7c6f726c8d18ff8803d9b3dc3a8443496002044Chris Lattner NewArgs.insert(NewArgs.end(), Args.begin(), Args.end()); 369e7c6f726c8d18ff8803d9b3dc3a8443496002044Chris Lattner GV = lle_X_sprintf(M, NewArgs); 370e7c6f726c8d18ff8803d9b3dc3a8443496002044Chris Lattner cout << Buffer; 371e7c6f726c8d18ff8803d9b3dc3a8443496002044Chris Lattner return GV; 372e7c6f726c8d18ff8803d9b3dc3a8443496002044Chris Lattner} 373e7c6f726c8d18ff8803d9b3dc3a8443496002044Chris Lattner 374665ee88504ae8e4440fd1609f3d88c3481cebe12Chris Lattner// int sscanf(const char *format, ...); 375665ee88504ae8e4440fd1609f3d88c3481cebe12Chris LattnerGenericValue lle_X_sscanf(MethodType *M, const vector<GenericValue> &args) { 376665ee88504ae8e4440fd1609f3d88c3481cebe12Chris Lattner assert(args.size() < 10 && "Only handle up to 10 args to sscanf right now!"); 377665ee88504ae8e4440fd1609f3d88c3481cebe12Chris Lattner 378665ee88504ae8e4440fd1609f3d88c3481cebe12Chris Lattner const char *Args[10]; 379665ee88504ae8e4440fd1609f3d88c3481cebe12Chris Lattner for (unsigned i = 0; i < args.size(); ++i) 380665ee88504ae8e4440fd1609f3d88c3481cebe12Chris Lattner Args[i] = (const char*)args[i].PointerVal; 381665ee88504ae8e4440fd1609f3d88c3481cebe12Chris Lattner 382665ee88504ae8e4440fd1609f3d88c3481cebe12Chris Lattner GenericValue GV; 383665ee88504ae8e4440fd1609f3d88c3481cebe12Chris Lattner GV.IntVal = sscanf(Args[0], Args[1], Args[2], Args[3], Args[4], 384665ee88504ae8e4440fd1609f3d88c3481cebe12Chris Lattner Args[5], Args[6], Args[7], Args[8], Args[9]); 385665ee88504ae8e4440fd1609f3d88c3481cebe12Chris Lattner return GV; 386665ee88504ae8e4440fd1609f3d88c3481cebe12Chris Lattner} 387665ee88504ae8e4440fd1609f3d88c3481cebe12Chris Lattner 388665ee88504ae8e4440fd1609f3d88c3481cebe12Chris Lattner 389295fe670596ed0f80850fa289f9bedd74d391b2dChris Lattner// int clock(void) - Profiling implementation 390295fe670596ed0f80850fa289f9bedd74d391b2dChris LattnerGenericValue lle_i_clock(MethodType *M, const vector<GenericValue> &Args) { 391295fe670596ed0f80850fa289f9bedd74d391b2dChris Lattner extern int clock(void); 392295fe670596ed0f80850fa289f9bedd74d391b2dChris Lattner GenericValue GV; GV.IntVal = clock(); 393295fe670596ed0f80850fa289f9bedd74d391b2dChris Lattner return GV; 394295fe670596ed0f80850fa289f9bedd74d391b2dChris Lattner} 395e7c6f726c8d18ff8803d9b3dc3a8443496002044Chris Lattner 396665ee88504ae8e4440fd1609f3d88c3481cebe12Chris Lattner//===----------------------------------------------------------------------===// 397665ee88504ae8e4440fd1609f3d88c3481cebe12Chris Lattner// IO Functions... 398665ee88504ae8e4440fd1609f3d88c3481cebe12Chris Lattner//===----------------------------------------------------------------------===// 399665ee88504ae8e4440fd1609f3d88c3481cebe12Chris Lattner 400665ee88504ae8e4440fd1609f3d88c3481cebe12Chris Lattner// FILE *fopen(const char *filename, const char *mode); 401665ee88504ae8e4440fd1609f3d88c3481cebe12Chris LattnerGenericValue lle_X_fopen(MethodType *M, const vector<GenericValue> &Args) { 402665ee88504ae8e4440fd1609f3d88c3481cebe12Chris Lattner assert(Args.size() == 2); 403665ee88504ae8e4440fd1609f3d88c3481cebe12Chris Lattner GenericValue GV; 404665ee88504ae8e4440fd1609f3d88c3481cebe12Chris Lattner 405665ee88504ae8e4440fd1609f3d88c3481cebe12Chris Lattner GV.PointerVal = (PointerTy)fopen((const char *)Args[0].PointerVal, 406665ee88504ae8e4440fd1609f3d88c3481cebe12Chris Lattner (const char *)Args[1].PointerVal); 407665ee88504ae8e4440fd1609f3d88c3481cebe12Chris Lattner return GV; 408665ee88504ae8e4440fd1609f3d88c3481cebe12Chris Lattner} 409665ee88504ae8e4440fd1609f3d88c3481cebe12Chris Lattner 410665ee88504ae8e4440fd1609f3d88c3481cebe12Chris Lattner// int fclose(FILE *F); 411665ee88504ae8e4440fd1609f3d88c3481cebe12Chris LattnerGenericValue lle_X_fclose(MethodType *M, const vector<GenericValue> &Args) { 412665ee88504ae8e4440fd1609f3d88c3481cebe12Chris Lattner assert(Args.size() == 1); 413665ee88504ae8e4440fd1609f3d88c3481cebe12Chris Lattner GenericValue GV; 414665ee88504ae8e4440fd1609f3d88c3481cebe12Chris Lattner 415665ee88504ae8e4440fd1609f3d88c3481cebe12Chris Lattner GV.IntVal = fclose((FILE *)Args[0].PointerVal); 416665ee88504ae8e4440fd1609f3d88c3481cebe12Chris Lattner return GV; 417665ee88504ae8e4440fd1609f3d88c3481cebe12Chris Lattner} 418665ee88504ae8e4440fd1609f3d88c3481cebe12Chris Lattner 419665ee88504ae8e4440fd1609f3d88c3481cebe12Chris Lattner// size_t fread(void *ptr, size_t size, size_t nitems, FILE *stream); 420665ee88504ae8e4440fd1609f3d88c3481cebe12Chris LattnerGenericValue lle_X_fread(MethodType *M, const vector<GenericValue> &Args) { 421665ee88504ae8e4440fd1609f3d88c3481cebe12Chris Lattner assert(Args.size() == 4); 422665ee88504ae8e4440fd1609f3d88c3481cebe12Chris Lattner GenericValue GV; 423665ee88504ae8e4440fd1609f3d88c3481cebe12Chris Lattner 424665ee88504ae8e4440fd1609f3d88c3481cebe12Chris Lattner GV.UIntVal = fread((void*)Args[0].PointerVal, Args[1].UIntVal, 425665ee88504ae8e4440fd1609f3d88c3481cebe12Chris Lattner Args[2].UIntVal, (FILE*)Args[3].PointerVal); 426665ee88504ae8e4440fd1609f3d88c3481cebe12Chris Lattner return GV; 427665ee88504ae8e4440fd1609f3d88c3481cebe12Chris Lattner} 428665ee88504ae8e4440fd1609f3d88c3481cebe12Chris Lattner 429665ee88504ae8e4440fd1609f3d88c3481cebe12Chris Lattner// size_t fwrite(const void *ptr, size_t size, size_t nitems, FILE *stream); 430665ee88504ae8e4440fd1609f3d88c3481cebe12Chris LattnerGenericValue lle_X_fwrite(MethodType *M, const vector<GenericValue> &Args) { 431665ee88504ae8e4440fd1609f3d88c3481cebe12Chris Lattner assert(Args.size() == 4); 432665ee88504ae8e4440fd1609f3d88c3481cebe12Chris Lattner GenericValue GV; 433665ee88504ae8e4440fd1609f3d88c3481cebe12Chris Lattner 434665ee88504ae8e4440fd1609f3d88c3481cebe12Chris Lattner GV.UIntVal = fwrite((void*)Args[0].PointerVal, Args[1].UIntVal, 435665ee88504ae8e4440fd1609f3d88c3481cebe12Chris Lattner Args[2].UIntVal, (FILE*)Args[3].PointerVal); 436665ee88504ae8e4440fd1609f3d88c3481cebe12Chris Lattner return GV; 437665ee88504ae8e4440fd1609f3d88c3481cebe12Chris Lattner} 438665ee88504ae8e4440fd1609f3d88c3481cebe12Chris Lattner 439665ee88504ae8e4440fd1609f3d88c3481cebe12Chris Lattner// char *fgets(char *s, int n, FILE *stream); 440665ee88504ae8e4440fd1609f3d88c3481cebe12Chris LattnerGenericValue lle_X_fgets(MethodType *M, const vector<GenericValue> &Args) { 441665ee88504ae8e4440fd1609f3d88c3481cebe12Chris Lattner assert(Args.size() == 3); 442665ee88504ae8e4440fd1609f3d88c3481cebe12Chris Lattner GenericValue GV; 443665ee88504ae8e4440fd1609f3d88c3481cebe12Chris Lattner 444665ee88504ae8e4440fd1609f3d88c3481cebe12Chris Lattner GV.PointerVal = (PointerTy)fgets((char*)Args[0].PointerVal, Args[1].IntVal, 445665ee88504ae8e4440fd1609f3d88c3481cebe12Chris Lattner (FILE*)Args[2].PointerVal); 446665ee88504ae8e4440fd1609f3d88c3481cebe12Chris Lattner return GV; 447665ee88504ae8e4440fd1609f3d88c3481cebe12Chris Lattner} 448665ee88504ae8e4440fd1609f3d88c3481cebe12Chris Lattner 449665ee88504ae8e4440fd1609f3d88c3481cebe12Chris Lattner// int fflush(FILE *stream); 450665ee88504ae8e4440fd1609f3d88c3481cebe12Chris LattnerGenericValue lle_X_fflush(MethodType *M, const vector<GenericValue> &Args) { 451665ee88504ae8e4440fd1609f3d88c3481cebe12Chris Lattner assert(Args.size() == 1); 452665ee88504ae8e4440fd1609f3d88c3481cebe12Chris Lattner GenericValue GV; 453665ee88504ae8e4440fd1609f3d88c3481cebe12Chris Lattner 454665ee88504ae8e4440fd1609f3d88c3481cebe12Chris Lattner GV.IntVal = fflush((FILE*)Args[0].PointerVal); 455665ee88504ae8e4440fd1609f3d88c3481cebe12Chris Lattner return GV; 456665ee88504ae8e4440fd1609f3d88c3481cebe12Chris Lattner} 457665ee88504ae8e4440fd1609f3d88c3481cebe12Chris Lattner 4587720c8e1a7a252e983e3f3e7f841d7901dfea80cChris Lattner} // End extern "C" 4594721f1304f3d49e44c78c9eed882a34ad7388be0Chris Lattner 4604721f1304f3d49e44c78c9eed882a34ad7388be0Chris Lattner 4614721f1304f3d49e44c78c9eed882a34ad7388be0Chris Lattnervoid Interpreter::initializeExternalMethods() { 4624721f1304f3d49e44c78c9eed882a34ad7388be0Chris Lattner FuncNames["lle_VP_printstr"] = lle_VP_printstr; 4634721f1304f3d49e44c78c9eed882a34ad7388be0Chris Lattner FuncNames["lle_X_print"] = lle_X_print; 4644721f1304f3d49e44c78c9eed882a34ad7388be0Chris Lattner FuncNames["lle_X_printVal"] = lle_X_printVal; 4654721f1304f3d49e44c78c9eed882a34ad7388be0Chris Lattner FuncNames["lle_X_printString"] = lle_X_printString; 4664721f1304f3d49e44c78c9eed882a34ad7388be0Chris Lattner FuncNames["lle_X_printUByte"] = lle_X_printUByte; 4674721f1304f3d49e44c78c9eed882a34ad7388be0Chris Lattner FuncNames["lle_X_printSByte"] = lle_X_printSByte; 4684721f1304f3d49e44c78c9eed882a34ad7388be0Chris Lattner FuncNames["lle_X_printUShort"] = lle_X_printUShort; 4694721f1304f3d49e44c78c9eed882a34ad7388be0Chris Lattner FuncNames["lle_X_printShort"] = lle_X_printShort; 4704721f1304f3d49e44c78c9eed882a34ad7388be0Chris Lattner FuncNames["lle_X_printInt"] = lle_X_printInt; 4714721f1304f3d49e44c78c9eed882a34ad7388be0Chris Lattner FuncNames["lle_X_printUInt"] = lle_X_printUInt; 4724721f1304f3d49e44c78c9eed882a34ad7388be0Chris Lattner FuncNames["lle_X_printLong"] = lle_X_printLong; 4734721f1304f3d49e44c78c9eed882a34ad7388be0Chris Lattner FuncNames["lle_X_printULong"] = lle_X_printULong; 4744721f1304f3d49e44c78c9eed882a34ad7388be0Chris Lattner FuncNames["lle_X_printFloat"] = lle_X_printFloat; 4754721f1304f3d49e44c78c9eed882a34ad7388be0Chris Lattner FuncNames["lle_X_printDouble"] = lle_X_printDouble; 4764721f1304f3d49e44c78c9eed882a34ad7388be0Chris Lattner FuncNames["lle_X_printPointer"] = lle_X_printPointer; 4770f279b245dc5f84a6b7c89900fd0d48e324452e7Chris Lattner FuncNames["lle_Vb_putchar"] = lle_Vb_putchar; 4780f279b245dc5f84a6b7c89900fd0d48e324452e7Chris Lattner FuncNames["lle_ii_putchar"] = lle_ii_putchar; 4790f279b245dc5f84a6b7c89900fd0d48e324452e7Chris Lattner FuncNames["lle_VB_putchar"] = lle_VB_putchar; 4800f279b245dc5f84a6b7c89900fd0d48e324452e7Chris Lattner FuncNames["lle_V___main"] = lle_V___main; 4810f279b245dc5f84a6b7c89900fd0d48e324452e7Chris Lattner FuncNames["lle_X_exit"] = lle_X_exit; 4820f279b245dc5f84a6b7c89900fd0d48e324452e7Chris Lattner FuncNames["lle_X_malloc"] = lle_X_malloc; 4830f279b245dc5f84a6b7c89900fd0d48e324452e7Chris Lattner FuncNames["lle_X_free"] = lle_X_free; 484782b939db105c1ead1ee9420d95fae8c341dbf47Chris Lattner FuncNames["lle_X_atoi"] = lle_X_atoi; 4850f279b245dc5f84a6b7c89900fd0d48e324452e7Chris Lattner FuncNames["lle_X_pow"] = lle_X_pow; 48634dd24b0b83885a3992c02ce91fe02c244e83e97Chris Lattner FuncNames["lle_X_exp"] = lle_X_exp; 4871b600144bda9717804ae3b998c95223947200075Chris Lattner FuncNames["lle_X_log"] = lle_X_log; 488782b939db105c1ead1ee9420d95fae8c341dbf47Chris Lattner FuncNames["lle_X_floor"] = lle_X_floor; 489782b939db105c1ead1ee9420d95fae8c341dbf47Chris Lattner FuncNames["lle_X_srand"] = lle_X_srand; 4901b600144bda9717804ae3b998c95223947200075Chris Lattner FuncNames["lle_X_drand48"] = lle_X_drand48; 4911b600144bda9717804ae3b998c95223947200075Chris Lattner FuncNames["lle_X_srand48"] = lle_X_srand48; 4921b600144bda9717804ae3b998c95223947200075Chris Lattner FuncNames["lle_X_lrand48"] = lle_X_lrand48; 493c063d385fa4d7255639ef0db5c506190e7cabcb4Chris Lattner FuncNames["lle_X_sqrt"] = lle_X_sqrt; 4940f279b245dc5f84a6b7c89900fd0d48e324452e7Chris Lattner FuncNames["lle_X_printf"] = lle_X_printf; 495e7c6f726c8d18ff8803d9b3dc3a8443496002044Chris Lattner FuncNames["lle_X_sprintf"] = lle_X_sprintf; 496665ee88504ae8e4440fd1609f3d88c3481cebe12Chris Lattner FuncNames["lle_X_sscanf"] = lle_X_sscanf; 497295fe670596ed0f80850fa289f9bedd74d391b2dChris Lattner FuncNames["lle_i_clock"] = lle_i_clock; 498665ee88504ae8e4440fd1609f3d88c3481cebe12Chris Lattner FuncNames["lle_X_fopen"] = lle_X_fopen; 499665ee88504ae8e4440fd1609f3d88c3481cebe12Chris Lattner FuncNames["lle_X_fclose"] = lle_X_fclose; 500665ee88504ae8e4440fd1609f3d88c3481cebe12Chris Lattner FuncNames["lle_X_fread"] = lle_X_fread; 501665ee88504ae8e4440fd1609f3d88c3481cebe12Chris Lattner FuncNames["lle_X_fwrite"] = lle_X_fwrite; 502665ee88504ae8e4440fd1609f3d88c3481cebe12Chris Lattner FuncNames["lle_X_fgets"] = lle_X_fgets; 503665ee88504ae8e4440fd1609f3d88c3481cebe12Chris Lattner FuncNames["lle_X_fflush"] = lle_X_fflush; 5044721f1304f3d49e44c78c9eed882a34ad7388be0Chris Lattner} 505