This corrects llvm-gcc to always emit the llvm.va* intrinsics with
i8* as the valist pointer type. This fixes llvm-gcc to comply with
PR1093.
Index: llvm-convert.cpp
===================================================================
--- llvm-convert.cpp (revision 122093)
+++ llvm-convert.cpp (working copy)
@@ -3624,15 +3624,11 @@
tree fntype = TREE_TYPE(current_function_decl);
static Constant *llvm_va_start_fn = 0;
- if (!llvm_va_start_fn) {
- tree FnDecl = TREE_OPERAND(TREE_OPERAND(exp, 0), 0);
- const FunctionType *FnTy =
- cast<FunctionType>(ConvertType(TREE_TYPE(FnDecl)));
+ static const Type *VPTy = PointerType::get(Type::Int8Ty);
+
+ if (!llvm_va_start_fn)
llvm_va_start_fn = TheModule->getOrInsertFunction("llvm.va_start",
- Type::VoidTy,
- FnTy->getParamType(0),
- NULL);
- }
+ Type::VoidTy, VPTy,
NULL);
if (TYPE_ARG_TYPES(fntype) == 0 ||
(TREE_VALUE(tree_last(TYPE_ARG_TYPES(fntype))) == void_type_node)) {
@@ -3653,42 +3649,33 @@
const Type *FTy =
cast<PointerType>(llvm_va_start_fn->getType())->getElementType();
- ArgVal = CastToType(Instruction::BitCast, ArgVal,
- cast<FunctionType>(FTy)->getParamType(0));
+ ArgVal = CastToType(Instruction::BitCast, ArgVal, VPTy);
new CallInst(llvm_va_start_fn, ArgVal, "", CurBB);
return true;
}
bool TreeToLLVM::EmitBuiltinVAEnd(tree exp) {
static Constant *llvm_va_end_fn = 0;
- if (!llvm_va_end_fn) {
- tree FnDecl = TREE_OPERAND(TREE_OPERAND(exp, 0), 0);
- const FunctionType *VAEndTy =
- cast<FunctionType>(ConvertType(TREE_TYPE(FnDecl)));
- llvm_va_end_fn = TheModule->getOrInsertFunction("llvm.va_end", VAEndTy);
- }
+ static const Type *VPTy = PointerType::get(Type::Int8Ty);
+ if (!llvm_va_end_fn)
+ llvm_va_end_fn = TheModule->getOrInsertFunction("llvm.va_end",
Type::VoidTy,
+ VPTy, NULL);
+
Value *Arg = Emit(TREE_VALUE(TREE_OPERAND(exp, 1)), 0);
- const Type *FTy =
- cast<PointerType>(llvm_va_end_fn->getType())->getElementType();
- Arg = CastToType(Instruction::BitCast, Arg,
- cast<FunctionType>(FTy)->getParamType(0));
-
+ Arg = CastToType(Instruction::BitCast, Arg, VPTy);
new CallInst(llvm_va_end_fn, Arg, "", CurBB);
return true;
}
bool TreeToLLVM::EmitBuiltinVACopy(tree exp) {
static Constant *llvm_va_copy_fn = 0;
- if (!llvm_va_copy_fn) {
- tree FnDecl = TREE_OPERAND(TREE_OPERAND(exp, 0), 0);
- const FunctionType *FnTy =
- cast<FunctionType>(ConvertType(TREE_TYPE(FnDecl)));
- const Type *PtrVAListTy = FnTy->getParamType(0);
+ static const Type *VPTy = PointerType::get(Type::Int8Ty);
+
+ if (!llvm_va_copy_fn)
llvm_va_copy_fn =
TheModule->getOrInsertFunction("llvm.va_copy", Type::VoidTy,
- PtrVAListTy, PtrVAListTy, NULL);
- }
+ VPTy, VPTy, NULL);
tree Arg1T = TREE_VALUE(TREE_OPERAND(exp, 1));
tree Arg2T = TREE_VALUE(TREE_CHAIN(TREE_OPERAND(exp, 1)));
@@ -3696,7 +3683,6 @@
Value *Arg1 = Emit(Arg1T, 0); // Emit the address of the destination.
// The second arg of llvm.va_copy is a pointer to a valist.
Value *Arg2;
- const Type *VAListTy = cast<PointerType>(Arg1->getType())->getElementType();
if (!isAggregateType(TREE_TYPE(Arg2T))) {
// Emit it as a value, then store it to a temporary slot.
Value *V2 = Emit(Arg2T, 0);
@@ -3705,15 +3691,13 @@
} else {
// If the target has aggregate valists, emit the srcval directly into a
// temporary.
+ const Type *VAListTy =
cast<PointerType>(Arg1->getType())->getElementType();
Arg2 = CreateTemporary(VAListTy);
Emit(Arg2T, Arg2);
}
- const Type *FTy =
- cast<PointerType>(llvm_va_copy_fn->getType())->getElementType();
- const Type *PtrList = cast<FunctionType>(FTy)->getParamType(0);
- Arg1 = CastToType(Instruction::BitCast, Arg1, PtrList);
- Arg2 = CastToType(Instruction::BitCast, Arg2, PtrList);
+ Arg1 = CastToType(Instruction::BitCast, Arg1, VPTy);
+ Arg2 = CastToType(Instruction::BitCast, Arg2, VPTy);
new CallInst(llvm_va_copy_fn, Arg1, Arg2, "", CurBB);
return true;
-Chris
_______________________________________________
llvm-commits mailing list
llvm-commits@cs.uiuc.edu
http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits