diff options
author | Chris Lattner <sabre@nondot.org> | 2001-11-07 19:46:27 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2001-11-07 19:46:27 +0000 |
commit | ea38c0e85c29783fdaf3b6c25fe7e3aa43688521 (patch) | |
tree | 57a35601ab9aaf85b0146a6e0e835e1c5c354a2b /lib/ExecutionEngine/Interpreter/ExternalFunctions.cpp | |
parent | aa6ec735cf519c0cd023a5a920081bf161a328cd (diff) |
* Switch to operation on pointers with PointerTy more consistently
* Fix misspeling
* Catch SIGFPE for traps
* info XXX now prints the raw contents of the GenericValue
* Switch to calloc instead of malloc (temporarily I hope) to bandaid Olden benchmarks
* Implement binary And & Or
* Convert expressions like this:
PointerTy SrcPtr = getOperandValue(I->getPtrOperand(), SF).PointerVal;
to:
GenericValue SRC = getOperandValue(I->getPtrOperand(), SF);
PointerTy SrcPtr = SRC.PointerVal;
because the prior way confuses purify.
* Taint the initial values of the value planes
* Handling 'print bb4' in the interpreter without crashing
* Print nicer stack frames with concise return type
* printf doesn't suck nearly as badly as it used to
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@1177 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/ExecutionEngine/Interpreter/ExternalFunctions.cpp')
-rw-r--r-- | lib/ExecutionEngine/Interpreter/ExternalFunctions.cpp | 67 |
1 files changed, 36 insertions, 31 deletions
diff --git a/lib/ExecutionEngine/Interpreter/ExternalFunctions.cpp b/lib/ExecutionEngine/Interpreter/ExternalFunctions.cpp index 80bfb7c5c6..8dd7c36326 100644 --- a/lib/ExecutionEngine/Interpreter/ExternalFunctions.cpp +++ b/lib/ExecutionEngine/Interpreter/ExternalFunctions.cpp @@ -202,7 +202,7 @@ GenericValue lle_X_exit(MethodType *M, const vector<GenericValue> &Args) { GenericValue lle_X_malloc(MethodType *M, const vector<GenericValue> &Args) { assert(Args.size() == 1 && "Malloc expects one argument!"); GenericValue GV; - GV.PointerVal = (uint64_t)malloc(Args[0].UIntVal); + GV.PointerVal = (PointerTy)malloc(Args[0].UIntVal); return GV; } @@ -269,40 +269,45 @@ GenericValue lle_X_printf(MethodType *M, const vector<GenericValue> &Args) { break; } case '%': { // Handle format specifiers - bool isLong = false; - ++FmtStr; - if (*FmtStr == 'l') { - isLong = true; - FmtStr++; + char FmtBuf[100] = "", Buffer[1000] = ""; + char *FB = FmtBuf; + *FB++ = *FmtStr++; + char Last = *FB++ = *FmtStr++; + unsigned HowLong = 0; + while (Last != 'c' && Last != 'd' && Last != 'i' && Last != 'u' && + Last != 'o' && Last != 'x' && Last != 'X' && Last != 'e' && + Last != 'E' && Last != 'g' && Last != 'G' && Last != 'f' && + Last != 'p' && Last != 's' && Last != '%') { + if (Last == 'l' || Last == 'L') HowLong++; // Keep track of l's + Last = *FB++ = *FmtStr++; } - - if (*FmtStr == '%') - cout << *FmtStr; // %% - else { - char Fmt[] = "%d", Buffer[1000] = ""; - Fmt[1] = *FmtStr; - - switch (*FmtStr) { - case 'c': - sprintf(Buffer, Fmt, Args[ArgNo++].SByteVal); break; - case 'd': case 'i': - case 'u': case 'o': - case 'x': case 'X': - sprintf(Buffer, Fmt, Args[ArgNo++].IntVal); break; - case 'e': case 'E': case 'g': case 'G': case 'f': - sprintf(Buffer, Fmt, Args[ArgNo++].DoubleVal); break; - case 'p': - sprintf(Buffer, Fmt, (void*)Args[ArgNo++].PointerVal); break; - case 's': cout << (char*)Args[ArgNo++].PointerVal; break; // %s - default: cout << "<unknown printf code '" << *FmtStr << "'!>"; - ArgNo++; break; - } - cout << Buffer; + *FB = 0; + + switch (Last) { + case '%': + sprintf(Buffer, FmtBuf); break; + case 'c': + sprintf(Buffer, FmtBuf, Args[ArgNo++].SByteVal); break; + case 'd': case 'i': + case 'u': case 'o': + case 'x': case 'X': + if (HowLong == 2) + sprintf(Buffer, FmtBuf, Args[ArgNo++].ULongVal); + else + sprintf(Buffer, FmtBuf, Args[ArgNo++].IntVal); break; + case 'e': case 'E': case 'g': case 'G': case 'f': + sprintf(Buffer, FmtBuf, Args[ArgNo++].DoubleVal); break; + case 'p': + sprintf(Buffer, FmtBuf, (void*)Args[ArgNo++].PointerVal); break; + case 's': + sprintf(Buffer, FmtBuf, (char*)Args[ArgNo++].PointerVal); break; + default: cout << "<unknown printf code '" << *FmtStr << "'!>"; + ArgNo++; break; + } + cout << Buffer; } - ++FmtStr; break; } - } } } |