1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-10-23 13:02:52 +02:00

Implement va_start.

llvm-svn: 18011
This commit is contained in:
Brian Gaeke 2004-11-19 20:57:24 +00:00
parent 0c79788bc4
commit 6224830c11

View File

@ -34,6 +34,7 @@ namespace {
TargetMachine &TM; TargetMachine &TM;
MachineFunction *F; // The function we are compiling into MachineFunction *F; // The function we are compiling into
MachineBasicBlock *BB; // The current MBB we are compiling MachineBasicBlock *BB; // The current MBB we are compiling
int VarArgsOffset; // Offset from fp for start of varargs area
std::map<Value*, unsigned> RegMap; // Mapping between Val's and SSA Regs std::map<Value*, unsigned> RegMap; // Mapping between Val's and SSA Regs
@ -445,6 +446,12 @@ void V8ISel::LoadArgumentsToVirtualRegs (Function *LF) {
assert (0 && "Unknown class?!"); assert (0 && "Unknown class?!");
} }
} }
// If the function takes variable number of arguments, remember the fp
// offset for the start of the first vararg value... this is used to expand
// llvm.va_start.
if (LF->getFunctionType ()->isVarArg ())
VarArgsOffset = ArgOffset;
} }
void V8ISel::SelectPHINodes() { void V8ISel::SelectPHINodes() {
@ -1341,6 +1348,10 @@ void V8ISel::LowerUnknownIntrinsicFunctionCalls(Function &F) {
if (CallInst *CI = dyn_cast<CallInst>(I++)) if (CallInst *CI = dyn_cast<CallInst>(I++))
if (Function *F = CI->getCalledFunction()) if (Function *F = CI->getCalledFunction())
switch (F->getIntrinsicID()) { switch (F->getIntrinsicID()) {
case Intrinsic::vastart:
case Intrinsic::vacopy:
case Intrinsic::vaend:
// We directly implement these intrinsics
case Intrinsic::not_intrinsic: break; case Intrinsic::not_intrinsic: break;
default: default:
// All other intrinsic calls we must lower. // All other intrinsic calls we must lower.
@ -1360,8 +1371,11 @@ void V8ISel::visitIntrinsicCall(Intrinsic::ID ID, CallInst &CI) {
default: default:
std::cerr << "Sorry, unknown intrinsic function call:\n" << CI; abort (); std::cerr << "Sorry, unknown intrinsic function call:\n" << CI; abort ();
case Intrinsic::vastart: case Intrinsic::vastart: {
std::cerr << "Sorry, va_start intrinsic still unsupported:\n" << CI; abort (); unsigned DestReg = getReg (CI);
BuildMI (BB, V8::ADDri, 2, DestReg).addReg (V8::FP).addSImm (VarArgsOffset);
return;
}
case Intrinsic::vaend: case Intrinsic::vaend:
// va_end is a no-op on SparcV8. // va_end is a no-op on SparcV8.