Name,
&CGM.getModule());
+ CGM.SetInternalFunctionAttributes(BD, Fn, FI);
+
StartFunction(BD, ResultType, Fn, Args,
BExpr->getBody()->getLocEnd());
CurFuncDecl = OuterFuncDecl;
FunctionArgList Args;
llvm::Function *Fn = CGM.getObjCRuntime().GenerateMethod(OMD, CD);
- CGM.SetMethodAttributes(OMD, Fn);
+ const CGFunctionInfo &FI = CGM.getTypes().getFunctionInfo(OMD);
+ CGM.SetInternalFunctionAttributes(OMD, Fn, FI);
Args.push_back(std::make_pair(OMD->getSelfDecl(),
OMD->getSelfDecl()->getType()));
GV->setSection(SA->getName());
}
-void CodeGenModule::SetMethodAttributes(const ObjCMethodDecl *MD,
- llvm::Function *F) {
- SetLLVMFunctionAttributes(MD, getTypes().getFunctionInfo(MD), F);
- SetLLVMFunctionAttributesForDefinition(MD, F);
+void CodeGenModule::SetInternalFunctionAttributes(const Decl *D,
+ llvm::Function *F,
+ const CGFunctionInfo &FI) {
+ SetLLVMFunctionAttributes(D, FI, F);
+ SetLLVMFunctionAttributesForDefinition(D, F);
F->setLinkage(llvm::Function::InternalLinkage);
- SetCommonAttributes(MD, F);
+ SetCommonAttributes(D, F);
}
void CodeGenModule::SetFunctionAttributes(const FunctionDecl *FD,
void ErrorUnsupported(const Decl *D, const char *Type,
bool OmitOnError=false);
- void SetMethodAttributes(const ObjCMethodDecl *MD,
- llvm::Function *F);
+ /// SetInternalFunctionAttributes - Set the attributes on the LLVM
+ /// function for the given decl and function info. This applies
+ /// attributes necessary for handling the ABI as well as user
+ /// specified attributes like section.
+ void SetInternalFunctionAttributes(const Decl *D, llvm::Function *F,
+ const CGFunctionInfo &FI);
/// SetLLVMFunctionAttributes - Set the LLVM function attributes
/// (sext, zext, etc).
-// RUN: clang-cc %s -emit-llvm -o %t -fblocks
+// RUN: clang-cc -triple i386-unknown-unknown %s -emit-llvm -o %t -fblocks &&
void (^f)(void) = ^{};
// rdar://6768379
int f0(int (^a0)()) {
return a0(1, 2, 3);
}
+
+// Verify that attributes on blocks are set correctly.
+typedef struct s0 T;
+struct s0 {
+ int a[64];
+};
+
+// RUN: grep 'internal void @__f2_block_invoke_(.struct.s0\* noalias sret .*, .*, .* byval .*)' %t &&
+struct s0 f2(struct s0 a0) {
+ return ^(struct s0 a1){ return a1; }(a0);
+}
+
+// RUN: true