From ea38c0e85c29783fdaf3b6c25fe7e3aa43688521 Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Wed, 7 Nov 2001 19:46:27 +0000 Subject: * 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 --- .../Interpreter/ExternalFunctions.cpp | 67 ++++++++++++---------- 1 file changed, 36 insertions(+), 31 deletions(-) (limited to 'lib/ExecutionEngine/Interpreter/ExternalFunctions.cpp') 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 &Args) { GenericValue lle_X_malloc(MethodType *M, const vector &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 &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 << ""; - 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 << ""; + ArgNo++; break; + } + cout << Buffer; } - ++FmtStr; break; } - } } } -- cgit v1.2.3-18-g5258