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