[llvm-commits] [llvm-gcc-4.2] r40679 - in /llvm-gcc-4.2/trunk/gcc: llvm-backend.cpp llvm-convert.cpp llvm-internal.h llvm-types.cpp
Christopher Lamb
christopher.lamb at gmail.com
Wed Aug 1 11:19:14 PDT 2007
Author: clamb
Date: Wed Aug 1 13:19:14 2007
New Revision: 40679
URL: http://llvm.org/viewvc/llvm-project?rev=40679&view=rev
Log:
Bring across restrict handling from llvm-gcc-4.0. This should fix PR1582 on both llvm-gcc projects.
Modified:
llvm-gcc-4.2/trunk/gcc/llvm-backend.cpp
llvm-gcc-4.2/trunk/gcc/llvm-convert.cpp
llvm-gcc-4.2/trunk/gcc/llvm-internal.h
llvm-gcc-4.2/trunk/gcc/llvm-types.cpp
Modified: llvm-gcc-4.2/trunk/gcc/llvm-backend.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm-gcc-4.2/trunk/gcc/llvm-backend.cpp?rev=40679&r1=40678&r2=40679&view=diff
==============================================================================
--- llvm-gcc-4.2/trunk/gcc/llvm-backend.cpp (original)
+++ llvm-gcc-4.2/trunk/gcc/llvm-backend.cpp Wed Aug 1 13:19:14 2007
@@ -1004,7 +1004,7 @@
if (FnEntry == 0) {
unsigned CC;
const FunctionType *Ty =
- TheTypeConverter->ConvertFunctionType(TREE_TYPE(decl), NULL, CC);
+ TheTypeConverter->ConvertFunctionType(TREE_TYPE(decl), decl, NULL, CC);
FnEntry = new Function(Ty, Function::ExternalLinkage, Name, TheModule);
FnEntry->setCallingConv(CC);
Modified: llvm-gcc-4.2/trunk/gcc/llvm-convert.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm-gcc-4.2/trunk/gcc/llvm-convert.cpp?rev=40679&r1=40678&r2=40679&view=diff
==============================================================================
--- llvm-gcc-4.2/trunk/gcc/llvm-convert.cpp (original)
+++ llvm-gcc-4.2/trunk/gcc/llvm-convert.cpp Wed Aug 1 13:19:14 2007
@@ -530,6 +530,7 @@
} else {
// Otherwise, just get the type from the function itself.
FTy = TheTypeConverter->ConvertFunctionType(TREE_TYPE(FnDecl),
+ FnDecl,
static_chain,
CallingConv);
}
@@ -2597,6 +2598,7 @@
unsigned CallingConv;
const Type *Ty = TheTypeConverter->ConvertFunctionType(function_type,
+ fndecl,
static_chain,
CallingConv);
Callee = CastToType(Instruction::BitCast, Callee, PointerType::get(Ty));
Modified: llvm-gcc-4.2/trunk/gcc/llvm-internal.h
URL: http://llvm.org/viewvc/llvm-project/llvm-gcc-4.2/trunk/gcc/llvm-internal.h?rev=40679&r1=40678&r2=40679&view=diff
==============================================================================
--- llvm-gcc-4.2/trunk/gcc/llvm-internal.h (original)
+++ llvm-gcc-4.2/trunk/gcc/llvm-internal.h Wed Aug 1 13:19:14 2007
@@ -147,6 +147,7 @@
/// tree to an LLVM type. This does the same thing that ConvertType does, but
/// it also returns the function's LLVM calling convention.
const FunctionType *ConvertFunctionType(tree_node *type,
+ tree_node *decl,
tree_node *static_chain,
unsigned &CallingConv);
Modified: llvm-gcc-4.2/trunk/gcc/llvm-types.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm-gcc-4.2/trunk/gcc/llvm-types.cpp?rev=40679&r1=40678&r2=40679&view=diff
==============================================================================
--- llvm-gcc-4.2/trunk/gcc/llvm-types.cpp (original)
+++ llvm-gcc-4.2/trunk/gcc/llvm-types.cpp Wed Aug 1 13:19:14 2007
@@ -804,9 +804,13 @@
case FUNCTION_TYPE: {
if (const Type *Ty = GET_TYPE_LLVM(type))
return Ty;
-
+
+ // No declaration to pass through, passing NULL.
unsigned CallingConv;
- return TypeDB.setType(type, ConvertFunctionType(type, NULL, CallingConv));
+ return TypeDB.setType(type, ConvertFunctionType(type,
+ NULL,
+ NULL,
+ CallingConv));
}
case ARRAY_TYPE: {
if (const Type *Ty = GET_TYPE_LLVM(type))
@@ -948,6 +952,7 @@
}
const FunctionType *TypeConverter::ConvertFunctionType(tree type,
+ tree decl,
tree static_chain,
unsigned &CallingConv) {
const Type *RetTy = 0;
@@ -998,6 +1003,8 @@
LLVM_TARGET_INIT_REGPARM(local_regparam, type);
#endif // LLVM_TARGET_ENABLE_REGPARM
+ // Check if we have a corresponding decl to inspect.
+ tree DeclArgs = (decl) ? DECL_ARGUMENTS(decl) : NULL;
// Loop over all of the arguments, adding them as we go.
tree Args = TYPE_ARG_TYPES(type);
for (; Args && TREE_VALUE(Args) != void_type_node; Args = TREE_CHAIN(Args)){
@@ -1032,10 +1039,15 @@
Attributes |= ParamAttr::SExt;
}
- // Compute noalias attributes.
- if (TREE_CODE(ArgTy) == POINTER_TYPE || TREE_CODE(ArgTy) == REFERENCE_TYPE)
- if (TYPE_RESTRICT(ArgTy))
+ // Compute noalias attributes. If we have a decl for the function
+ // inspect it for restrict qualifiers, otherwise try the argument
+ // types.
+ tree RestrictArgTy = (DeclArgs) ? TREE_TYPE(DeclArgs) : ArgTy;
+ if (TREE_CODE(RestrictArgTy) == POINTER_TYPE ||
+ TREE_CODE(RestrictArgTy) == REFERENCE_TYPE) {
+ if (TYPE_RESTRICT(RestrictArgTy))
Attributes |= ParamAttr::NoAlias;
+ }
#ifdef LLVM_TARGET_ENABLE_REGPARM
// Allow the target to mark this as inreg.
@@ -1047,6 +1059,9 @@
if (Attributes != ParamAttr::None)
Attrs.push_back(ParamAttrsWithIndex::get(ArgTypes.size(), Attributes));
+
+ if (DeclArgs)
+ DeclArgs = TREE_CHAIN(DeclArgs);
}
// If the argument list ends with a void type node, it isn't vararg.
More information about the llvm-commits
mailing list