forked from OSchip/llvm-project
parent
7e215ea165
commit
dc3fcfc0d0
|
@ -419,82 +419,6 @@ GenericValue lle_X_printf(const FunctionType *FT,
|
||||||
return GV;
|
return GV;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void ByteswapSCANFResults(LLVMContext &C,
|
|
||||||
const char *Fmt, void *Arg0, void *Arg1,
|
|
||||||
void *Arg2, void *Arg3, void *Arg4, void *Arg5,
|
|
||||||
void *Arg6, void *Arg7, void *Arg8) {
|
|
||||||
void *Args[] = { Arg0, Arg1, Arg2, Arg3, Arg4, Arg5, Arg6, Arg7, Arg8, 0 };
|
|
||||||
|
|
||||||
// Loop over the format string, munging read values as appropriate (performs
|
|
||||||
// byteswaps as necessary).
|
|
||||||
unsigned ArgNo = 0;
|
|
||||||
while (*Fmt) {
|
|
||||||
if (*Fmt++ == '%') {
|
|
||||||
// Read any flag characters that may be present...
|
|
||||||
bool Suppress = false;
|
|
||||||
bool Half = false;
|
|
||||||
bool Long = false;
|
|
||||||
bool LongLong = false; // long long or long double
|
|
||||||
|
|
||||||
while (1) {
|
|
||||||
switch (*Fmt++) {
|
|
||||||
case '*': Suppress = true; break;
|
|
||||||
case 'a': /*Allocate = true;*/ break; // We don't need to track this
|
|
||||||
case 'h': Half = true; break;
|
|
||||||
case 'l': Long = true; break;
|
|
||||||
case 'q':
|
|
||||||
case 'L': LongLong = true; break;
|
|
||||||
default:
|
|
||||||
if (Fmt[-1] > '9' || Fmt[-1] < '0') // Ignore field width specs
|
|
||||||
goto Out;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Out:
|
|
||||||
|
|
||||||
// Read the conversion character
|
|
||||||
if (!Suppress && Fmt[-1] != '%') { // Nothing to do?
|
|
||||||
unsigned Size = 0;
|
|
||||||
const Type *Ty = 0;
|
|
||||||
|
|
||||||
switch (Fmt[-1]) {
|
|
||||||
case 'i': case 'o': case 'u': case 'x': case 'X': case 'n': case 'p':
|
|
||||||
case 'd':
|
|
||||||
if (Long || LongLong) {
|
|
||||||
Size = 8; Ty = Type::getInt64Ty(C);
|
|
||||||
} else if (Half) {
|
|
||||||
Size = 4; Ty = Type::getInt16Ty(C);
|
|
||||||
} else {
|
|
||||||
Size = 4; Ty = Type::getInt32Ty(C);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 'e': case 'g': case 'E': case 'f':
|
|
||||||
if (Long || LongLong) {
|
|
||||||
Size = 8; Ty = Type::getDoubleTy(C);
|
|
||||||
} else {
|
|
||||||
Size = 4; Ty = Type::getFloatTy(C);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 's': case 'c': case '[': // No byteswap needed
|
|
||||||
Size = 1;
|
|
||||||
Ty = Type::getInt8Ty(C);
|
|
||||||
break;
|
|
||||||
|
|
||||||
default: break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (Size) {
|
|
||||||
GenericValue GV;
|
|
||||||
void *Arg = Args[ArgNo++];
|
|
||||||
memcpy(&GV, Arg, Size);
|
|
||||||
TheInterpreter->StoreValueToMemory(GV, (GenericValue*)Arg, Ty);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// int sscanf(const char *format, ...);
|
// int sscanf(const char *format, ...);
|
||||||
GenericValue lle_X_sscanf(const FunctionType *FT,
|
GenericValue lle_X_sscanf(const FunctionType *FT,
|
||||||
const std::vector<GenericValue> &args) {
|
const std::vector<GenericValue> &args) {
|
||||||
|
|
Loading…
Reference in New Issue