diff options
Diffstat (limited to 'lib/CodeGen/CGCall.cpp')
-rw-r--r-- | lib/CodeGen/CGCall.cpp | 12 |
1 files changed, 8 insertions, 4 deletions
diff --git a/lib/CodeGen/CGCall.cpp b/lib/CodeGen/CGCall.cpp index 7069fee460..a1c3c33462 100644 --- a/lib/CodeGen/CGCall.cpp +++ b/lib/CodeGen/CGCall.cpp @@ -513,6 +513,7 @@ void CodeGenModule::ConstructAttributeList(const Decl *TargetDecl, ArgTypeIterator end, AttributeListType &PAL) { unsigned FuncAttrs = 0; + unsigned RetAttrs = 0; if (TargetDecl) { if (TargetDecl->getAttr<NoThrowAttr>()) @@ -528,9 +529,9 @@ void CodeGenModule::ConstructAttributeList(const Decl *TargetDecl, case ABIArgInfo::Default: if (RetTy->isPromotableIntegerType()) { if (RetTy->isSignedIntegerType()) { - FuncAttrs |= llvm::Attribute::SExt; + RetAttrs |= llvm::Attribute::SExt; } else if (RetTy->isUnsignedIntegerType()) { - FuncAttrs |= llvm::Attribute::ZExt; + RetAttrs |= llvm::Attribute::ZExt; } } break; @@ -550,8 +551,8 @@ void CodeGenModule::ConstructAttributeList(const Decl *TargetDecl, assert(0 && "Invalid ABI kind for return argument"); } - if (FuncAttrs) - PAL.push_back(llvm::AttributeWithIndex::get(0, FuncAttrs)); + if (RetAttrs) + PAL.push_back(llvm::AttributeWithIndex::get(0, RetAttrs)); for (++begin; begin != end; ++begin) { QualType ParamType = *begin; unsigned Attributes = 0; @@ -592,6 +593,9 @@ void CodeGenModule::ConstructAttributeList(const Decl *TargetDecl, PAL.push_back(llvm::AttributeWithIndex::get(Index, Attributes)); ++Index; } + if (FuncAttrs) + PAL.push_back(llvm::AttributeWithIndex::get(~0, FuncAttrs)); + } void CodeGenFunction::EmitFunctionProlog(llvm::Function *Fn, |