1 //===-- ExternalFunctions.cpp - Implement External Functions --------------===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 // This file contains both code to deal with invoking "external" functions, but
11 // also contains code that implements "exported" external functions.
13 // There are currently two mechanisms for handling external functions in the
14 // Interpreter. The first is to implement lle_* wrapper functions that are
15 // specific to well-known library functions which manually translate the
16 // arguments from GenericValues and make the call. If such a wrapper does
17 // not exist, and libffi is available, then the Interpreter will attempt to
18 // invoke the function using libffi, after finding its address.
20 //===----------------------------------------------------------------------===//
22 #include "Interpreter.h"
23 #include "llvm/DerivedTypes.h"
24 #include "llvm/Module.h"
25 #include "llvm/Config/config.h" // Detect libffi
26 #include "llvm/Support/ErrorHandling.h"
27 #include "llvm/System/DynamicLibrary.h"
28 #include "llvm/Target/TargetData.h"
29 #include "llvm/Support/ManagedStatic.h"
30 #include "llvm/System/Mutex.h"
49 static ManagedStatic
<sys::Mutex
> FunctionsLock
;
51 typedef GenericValue (*ExFunc
)(const FunctionType
*,
52 const std::vector
<GenericValue
> &);
53 static ManagedStatic
<std::map
<const Function
*, ExFunc
> > ExportedFunctions
;
54 static std::map
<std::string
, ExFunc
> FuncNames
;
57 typedef void (*RawFunc
)();
58 static ManagedStatic
<std::map
<const Function
*, RawFunc
> > RawFunctions
;
61 static Interpreter
*TheInterpreter
;
63 static char getTypeID(const Type
*Ty
) {
64 switch (Ty
->getTypeID()) {
65 case Type::VoidTyID
: return 'V';
66 case Type::IntegerTyID
:
67 switch (cast
<IntegerType
>(Ty
)->getBitWidth()) {
75 case Type::FloatTyID
: return 'F';
76 case Type::DoubleTyID
: return 'D';
77 case Type::PointerTyID
: return 'P';
78 case Type::FunctionTyID
:return 'M';
79 case Type::StructTyID
: return 'T';
80 case Type::ArrayTyID
: return 'A';
81 case Type::OpaqueTyID
: return 'O';
86 // Try to find address of external function given a Function object.
87 // Please note, that interpreter doesn't know how to assemble a
88 // real call in general case (this is JIT job), that's why it assumes,
89 // that all external functions has the same (and pretty "general") signature.
90 // The typical example of such functions are "lle_X_" ones.
91 static ExFunc
lookupFunction(const Function
*F
) {
92 // Function not found, look it up... start by figuring out what the
93 // composite function name should be.
94 std::string ExtName
= "lle_";
95 const FunctionType
*FT
= F
->getFunctionType();
96 for (unsigned i
= 0, e
= FT
->getNumContainedTypes(); i
!= e
; ++i
)
97 ExtName
+= getTypeID(FT
->getContainedType(i
));
98 ExtName
+ "_" + F
->getNameStr();
100 sys::ScopedLock
Writer(*FunctionsLock
);
101 ExFunc FnPtr
= FuncNames
[ExtName
];
103 FnPtr
= FuncNames
["lle_X_" + F
->getNameStr()];
104 if (FnPtr
== 0) // Try calling a generic function... if it exists...
105 FnPtr
= (ExFunc
)(intptr_t)
106 sys::DynamicLibrary::SearchForAddressOfSymbol("lle_X_"+F
->getNameStr());
108 ExportedFunctions
->insert(std::make_pair(F
, FnPtr
)); // Cache for later
113 static ffi_type
*ffiTypeFor(const Type
*Ty
) {
114 switch (Ty
->getTypeID()) {
115 case Type::VoidTyID
: return &ffi_type_void
;
116 case Type::IntegerTyID
:
117 switch (cast
<IntegerType
>(Ty
)->getBitWidth()) {
118 case 8: return &ffi_type_sint8
;
119 case 16: return &ffi_type_sint16
;
120 case 32: return &ffi_type_sint32
;
121 case 64: return &ffi_type_sint64
;
123 case Type::FloatTyID
: return &ffi_type_float
;
124 case Type::DoubleTyID
: return &ffi_type_double
;
125 case Type::PointerTyID
: return &ffi_type_pointer
;
128 // TODO: Support other types such as StructTyID, ArrayTyID, OpaqueTyID, etc.
129 llvm_report_error("Type could not be mapped for use with libffi.");
133 static void *ffiValueFor(const Type
*Ty
, const GenericValue
&AV
,
135 switch (Ty
->getTypeID()) {
136 case Type::IntegerTyID
:
137 switch (cast
<IntegerType
>(Ty
)->getBitWidth()) {
139 int8_t *I8Ptr
= (int8_t *) ArgDataPtr
;
140 *I8Ptr
= (int8_t) AV
.IntVal
.getZExtValue();
144 int16_t *I16Ptr
= (int16_t *) ArgDataPtr
;
145 *I16Ptr
= (int16_t) AV
.IntVal
.getZExtValue();
149 int32_t *I32Ptr
= (int32_t *) ArgDataPtr
;
150 *I32Ptr
= (int32_t) AV
.IntVal
.getZExtValue();
154 int64_t *I64Ptr
= (int64_t *) ArgDataPtr
;
155 *I64Ptr
= (int64_t) AV
.IntVal
.getZExtValue();
159 case Type::FloatTyID
: {
160 float *FloatPtr
= (float *) ArgDataPtr
;
161 *FloatPtr
= AV
.DoubleVal
;
164 case Type::DoubleTyID
: {
165 double *DoublePtr
= (double *) ArgDataPtr
;
166 *DoublePtr
= AV
.DoubleVal
;
169 case Type::PointerTyID
: {
170 void **PtrPtr
= (void **) ArgDataPtr
;
176 // TODO: Support other types such as StructTyID, ArrayTyID, OpaqueTyID, etc.
177 llvm_report_error("Type value could not be mapped for use with libffi.");
181 static bool ffiInvoke(RawFunc Fn
, Function
*F
,
182 const std::vector
<GenericValue
> &ArgVals
,
183 const TargetData
*TD
, GenericValue
&Result
) {
185 const FunctionType
*FTy
= F
->getFunctionType();
186 const unsigned NumArgs
= F
->arg_size();
188 // TODO: We don't have type information about the remaining arguments, because
189 // this information is never passed into ExecutionEngine::runFunction().
190 if (ArgVals
.size() > NumArgs
&& F
->isVarArg()) {
191 llvm_report_error("Calling external var arg function '" + F
->getName()
192 + "' is not supported by the Interpreter.");
195 unsigned ArgBytes
= 0;
197 std::vector
<ffi_type
*> args(NumArgs
);
198 for (Function::const_arg_iterator A
= F
->arg_begin(), E
= F
->arg_end();
200 const unsigned ArgNo
= A
->getArgNo();
201 const Type
*ArgTy
= FTy
->getParamType(ArgNo
);
202 args
[ArgNo
] = ffiTypeFor(ArgTy
);
203 ArgBytes
+= TD
->getTypeStoreSize(ArgTy
);
206 uint8_t *ArgData
= (uint8_t*) alloca(ArgBytes
);
207 uint8_t *ArgDataPtr
= ArgData
;
208 std::vector
<void*> values(NumArgs
);
209 for (Function::const_arg_iterator A
= F
->arg_begin(), E
= F
->arg_end();
211 const unsigned ArgNo
= A
->getArgNo();
212 const Type
*ArgTy
= FTy
->getParamType(ArgNo
);
213 values
[ArgNo
] = ffiValueFor(ArgTy
, ArgVals
[ArgNo
], ArgDataPtr
);
214 ArgDataPtr
+= TD
->getTypeStoreSize(ArgTy
);
217 const Type
*RetTy
= FTy
->getReturnType();
218 ffi_type
*rtype
= ffiTypeFor(RetTy
);
220 if (ffi_prep_cif(&cif
, FFI_DEFAULT_ABI
, NumArgs
, rtype
, &args
[0]) == FFI_OK
) {
222 if (RetTy
->getTypeID() != Type::VoidTyID
)
223 ret
= alloca(TD
->getTypeStoreSize(RetTy
));
224 ffi_call(&cif
, Fn
, ret
, &values
[0]);
225 switch (RetTy
->getTypeID()) {
226 case Type::IntegerTyID
:
227 switch (cast
<IntegerType
>(RetTy
)->getBitWidth()) {
228 case 8: Result
.IntVal
= APInt(8 , *(int8_t *) ret
); break;
229 case 16: Result
.IntVal
= APInt(16, *(int16_t*) ret
); break;
230 case 32: Result
.IntVal
= APInt(32, *(int32_t*) ret
); break;
231 case 64: Result
.IntVal
= APInt(64, *(int64_t*) ret
); break;
234 case Type::FloatTyID
: Result
.FloatVal
= *(float *) ret
; break;
235 case Type::DoubleTyID
: Result
.DoubleVal
= *(double*) ret
; break;
236 case Type::PointerTyID
: Result
.PointerVal
= *(void **) ret
; break;
246 GenericValue
Interpreter::callExternalFunction(Function
*F
,
247 const std::vector
<GenericValue
> &ArgVals
) {
248 TheInterpreter
= this;
250 FunctionsLock
->acquire();
252 // Do a lookup to see if the function is in our cache... this should just be a
253 // deferred annotation!
254 std::map
<const Function
*, ExFunc
>::iterator FI
= ExportedFunctions
->find(F
);
255 if (ExFunc Fn
= (FI
== ExportedFunctions
->end()) ? lookupFunction(F
)
257 FunctionsLock
->release();
258 return Fn(F
->getFunctionType(), ArgVals
);
262 std::map
<const Function
*, RawFunc
>::iterator RF
= RawFunctions
->find(F
);
264 if (RF
== RawFunctions
->end()) {
265 RawFn
= (RawFunc
)(intptr_t)
266 sys::DynamicLibrary::SearchForAddressOfSymbol(F
->getName());
268 RawFunctions
->insert(std::make_pair(F
, RawFn
)); // Cache for later
273 FunctionsLock
->release();
276 if (RawFn
!= 0 && ffiInvoke(RawFn
, F
, ArgVals
, getTargetData(), Result
))
280 if (F
->getName() == "__main")
281 errs() << "Tried to execute an unknown external function: "
282 << F
->getType()->getDescription() << " __main\n";
284 llvm_report_error("Tried to execute an unknown external function: " +
285 F
->getType()->getDescription() + " " +F
->getName());
286 return GenericValue();
290 //===----------------------------------------------------------------------===//
291 // Functions "exported" to the running application...
294 // Visual Studio warns about returning GenericValue in extern "C" linkage
296 #pragma warning(disable : 4190)
299 extern "C" { // Don't add C++ manglings to llvm mangling :)
301 // void atexit(Function*)
302 GenericValue
lle_X_atexit(const FunctionType
*FT
,
303 const std::vector
<GenericValue
> &Args
) {
304 assert(Args
.size() == 1);
305 TheInterpreter
->addAtExitHandler((Function
*)GVTOP(Args
[0]));
312 GenericValue
lle_X_exit(const FunctionType
*FT
,
313 const std::vector
<GenericValue
> &Args
) {
314 TheInterpreter
->exitCalled(Args
[0]);
315 return GenericValue();
319 GenericValue
lle_X_abort(const FunctionType
*FT
,
320 const std::vector
<GenericValue
> &Args
) {
321 //FIXME: should we report or raise here?
322 //llvm_report_error("Interpreted program raised SIGABRT");
324 return GenericValue();
327 // int sprintf(char *, const char *, ...) - a very rough implementation to make
329 GenericValue
lle_X_sprintf(const FunctionType
*FT
,
330 const std::vector
<GenericValue
> &Args
) {
331 char *OutputBuffer
= (char *)GVTOP(Args
[0]);
332 const char *FmtStr
= (const char *)GVTOP(Args
[1]);
335 // printf should return # chars printed. This is completely incorrect, but
336 // close enough for now.
338 GV
.IntVal
= APInt(32, strlen(FmtStr
));
341 case 0: return GV
; // Null terminator...
342 default: // Normal nonspecial character
343 sprintf(OutputBuffer
++, "%c", *FmtStr
++);
345 case '\\': { // Handle escape codes
346 sprintf(OutputBuffer
, "%c%c", *FmtStr
, *(FmtStr
+1));
347 FmtStr
+= 2; OutputBuffer
+= 2;
350 case '%': { // Handle format specifiers
351 char FmtBuf
[100] = "", Buffer
[1000] = "";
354 char Last
= *FB
++ = *FmtStr
++;
355 unsigned HowLong
= 0;
356 while (Last
!= 'c' && Last
!= 'd' && Last
!= 'i' && Last
!= 'u' &&
357 Last
!= 'o' && Last
!= 'x' && Last
!= 'X' && Last
!= 'e' &&
358 Last
!= 'E' && Last
!= 'g' && Last
!= 'G' && Last
!= 'f' &&
359 Last
!= 'p' && Last
!= 's' && Last
!= '%') {
360 if (Last
== 'l' || Last
== 'L') HowLong
++; // Keep track of l's
361 Last
= *FB
++ = *FmtStr
++;
367 strcpy(Buffer
, "%"); break;
369 sprintf(Buffer
, FmtBuf
, uint32_t(Args
[ArgNo
++].IntVal
.getZExtValue()));
376 TheInterpreter
->getTargetData()->getPointerSizeInBits() == 64 &&
377 sizeof(long) < sizeof(int64_t)) {
378 // Make sure we use %lld with a 64 bit argument because we might be
379 // compiling LLI on a 32 bit compiler.
380 unsigned Size
= strlen(FmtBuf
);
381 FmtBuf
[Size
] = FmtBuf
[Size
-1];
383 FmtBuf
[Size
-1] = 'l';
385 sprintf(Buffer
, FmtBuf
, Args
[ArgNo
++].IntVal
.getZExtValue());
387 sprintf(Buffer
, FmtBuf
,uint32_t(Args
[ArgNo
++].IntVal
.getZExtValue()));
389 case 'e': case 'E': case 'g': case 'G': case 'f':
390 sprintf(Buffer
, FmtBuf
, Args
[ArgNo
++].DoubleVal
); break;
392 sprintf(Buffer
, FmtBuf
, (void*)GVTOP(Args
[ArgNo
++])); break;
394 sprintf(Buffer
, FmtBuf
, (char*)GVTOP(Args
[ArgNo
++])); break;
396 errs() << "<unknown printf code '" << *FmtStr
<< "'!>";
399 strcpy(OutputBuffer
, Buffer
);
400 OutputBuffer
+= strlen(Buffer
);
408 // int printf(const char *, ...) - a very rough implementation to make output
410 GenericValue
lle_X_printf(const FunctionType
*FT
,
411 const std::vector
<GenericValue
> &Args
) {
413 std::vector
<GenericValue
> NewArgs
;
414 NewArgs
.push_back(PTOGV((void*)&Buffer
[0]));
415 NewArgs
.insert(NewArgs
.end(), Args
.begin(), Args
.end());
416 GenericValue GV
= lle_X_sprintf(FT
, NewArgs
);
421 static void ByteswapSCANFResults(LLVMContext
&C
,
422 const char *Fmt
, void *Arg0
, void *Arg1
,
423 void *Arg2
, void *Arg3
, void *Arg4
, void *Arg5
,
424 void *Arg6
, void *Arg7
, void *Arg8
) {
425 void *Args
[] = { Arg0
, Arg1
, Arg2
, Arg3
, Arg4
, Arg5
, Arg6
, Arg7
, Arg8
, 0 };
427 // Loop over the format string, munging read values as appropriate (performs
428 // byteswaps as necessary).
432 // Read any flag characters that may be present...
433 bool Suppress
= false;
436 bool LongLong
= false; // long long or long double
440 case '*': Suppress
= true; break;
441 case 'a': /*Allocate = true;*/ break; // We don't need to track this
442 case 'h': Half
= true; break;
443 case 'l': Long
= true; break;
445 case 'L': LongLong
= true; break;
447 if (Fmt
[-1] > '9' || Fmt
[-1] < '0') // Ignore field width specs
453 // Read the conversion character
454 if (!Suppress
&& Fmt
[-1] != '%') { // Nothing to do?
459 case 'i': case 'o': case 'u': case 'x': case 'X': case 'n': case 'p':
461 if (Long
|| LongLong
) {
462 Size
= 8; Ty
= Type::getInt64Ty(C
);
464 Size
= 4; Ty
= Type::getInt16Ty(C
);
466 Size
= 4; Ty
= Type::getInt32Ty(C
);
470 case 'e': case 'g': case 'E':
472 if (Long
|| LongLong
) {
473 Size
= 8; Ty
= Type::getDoubleTy(C
);
475 Size
= 4; Ty
= Type::getFloatTy(C
);
479 case 's': case 'c': case '[': // No byteswap needed
481 Ty
= Type::getInt8Ty(C
);
489 void *Arg
= Args
[ArgNo
++];
490 memcpy(&GV
, Arg
, Size
);
491 TheInterpreter
->StoreValueToMemory(GV
, (GenericValue
*)Arg
, Ty
);
498 // int sscanf(const char *format, ...);
499 GenericValue
lle_X_sscanf(const FunctionType
*FT
,
500 const std::vector
<GenericValue
> &args
) {
501 assert(args
.size() < 10 && "Only handle up to 10 args to sscanf right now!");
504 for (unsigned i
= 0; i
< args
.size(); ++i
)
505 Args
[i
] = (char*)GVTOP(args
[i
]);
508 GV
.IntVal
= APInt(32, sscanf(Args
[0], Args
[1], Args
[2], Args
[3], Args
[4],
509 Args
[5], Args
[6], Args
[7], Args
[8], Args
[9]));
510 ByteswapSCANFResults(FT
->getContext(),
511 Args
[1], Args
[2], Args
[3], Args
[4],
512 Args
[5], Args
[6], Args
[7], Args
[8], Args
[9], 0);
516 // int scanf(const char *format, ...);
517 GenericValue
lle_X_scanf(const FunctionType
*FT
,
518 const std::vector
<GenericValue
> &args
) {
519 assert(args
.size() < 10 && "Only handle up to 10 args to scanf right now!");
522 for (unsigned i
= 0; i
< args
.size(); ++i
)
523 Args
[i
] = (char*)GVTOP(args
[i
]);
526 GV
.IntVal
= APInt(32, scanf( Args
[0], Args
[1], Args
[2], Args
[3], Args
[4],
527 Args
[5], Args
[6], Args
[7], Args
[8], Args
[9]));
528 ByteswapSCANFResults(FT
->getContext(),
529 Args
[0], Args
[1], Args
[2], Args
[3], Args
[4],
530 Args
[5], Args
[6], Args
[7], Args
[8], Args
[9]);
534 // int fprintf(FILE *, const char *, ...) - a very rough implementation to make
536 GenericValue
lle_X_fprintf(const FunctionType
*FT
,
537 const std::vector
<GenericValue
> &Args
) {
538 assert(Args
.size() >= 2);
540 std::vector
<GenericValue
> NewArgs
;
541 NewArgs
.push_back(PTOGV(Buffer
));
542 NewArgs
.insert(NewArgs
.end(), Args
.begin()+1, Args
.end());
543 GenericValue GV
= lle_X_sprintf(FT
, NewArgs
);
545 fputs(Buffer
, (FILE *) GVTOP(Args
[0]));
551 // Done with externals; turn the warning back on
553 #pragma warning(default: 4190)
557 void Interpreter::initializeExternalFunctions() {
558 sys::ScopedLock
Writer(*FunctionsLock
);
559 FuncNames
["lle_X_atexit"] = lle_X_atexit
;
560 FuncNames
["lle_X_exit"] = lle_X_exit
;
561 FuncNames
["lle_X_abort"] = lle_X_abort
;
563 FuncNames
["lle_X_printf"] = lle_X_printf
;
564 FuncNames
["lle_X_sprintf"] = lle_X_sprintf
;
565 FuncNames
["lle_X_sscanf"] = lle_X_sscanf
;
566 FuncNames
["lle_X_scanf"] = lle_X_scanf
;
567 FuncNames
["lle_X_fprintf"] = lle_X_fprintf
;