diff options
author | Anton Korobeynikov <asl@math.spbu.ru> | 2009-04-04 00:49:24 +0000 |
---|---|---|
committer | Anton Korobeynikov <asl@math.spbu.ru> | 2009-04-04 00:49:24 +0000 |
commit | 1102f4282ceb430dbc9fcedb9dd2ad25898a09e8 (patch) | |
tree | edcc3b899d4dae5901f2bb8121c5fb6a96ef0849 /lib/CodeGen/CGCall.cpp | |
parent | 264a76cdf382c507f4d43e64c89f1503f003ac95 (diff) |
Basic support for regparm codegen
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@68414 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen/CGCall.cpp')
-rw-r--r-- | lib/CodeGen/CGCall.cpp | 25 |
1 files changed, 22 insertions, 3 deletions
diff --git a/lib/CodeGen/CGCall.cpp b/lib/CodeGen/CGCall.cpp index 19f66b1671..e3f824fc74 100644 --- a/lib/CodeGen/CGCall.cpp +++ b/lib/CodeGen/CGCall.cpp @@ -1646,6 +1646,7 @@ void CodeGenModule::ConstructAttributeList(const CGFunctionInfo &FI, unsigned FuncAttrs = 0; unsigned RetAttrs = 0; + // FIXME: handle sseregparm someday... if (TargetDecl) { if (TargetDecl->getAttr<NoThrowAttr>()) FuncAttrs |= llvm::Attribute::NoUnwind; @@ -1691,19 +1692,29 @@ void CodeGenModule::ConstructAttributeList(const CGFunctionInfo &FI, if (RetAttrs) PAL.push_back(llvm::AttributeWithIndex::get(0, RetAttrs)); + + // FIXME: we need to honour command line settings also... + // FIXME: RegParm should be reduced in case of nested functions and/or global + // register variable. + signed RegParm = 0; + if (TargetDecl) + if (const RegparmAttr *RegParmAttr = TargetDecl->getAttr<RegparmAttr>()) + RegParm = RegParmAttr->getNumParams(); + + unsigned PointerWidth = getContext().Target.getPointerWidth(0); for (CGFunctionInfo::const_arg_iterator it = FI.arg_begin(), ie = FI.arg_end(); it != ie; ++it) { QualType ParamType = it->type; const ABIArgInfo &AI = it->info; unsigned Attributes = 0; - + switch (AI.getKind()) { case ABIArgInfo::Coerce: break; case ABIArgInfo::Indirect: Attributes |= llvm::Attribute::ByVal; - Attributes |= + Attributes |= llvm::Attribute::constructAlignmentFromInt(AI.getIndirectAlign()); // byval disables readnone and readonly. FuncAttrs &= ~(llvm::Attribute::ReadOnly | @@ -1718,8 +1729,16 @@ void CodeGenModule::ConstructAttributeList(const CGFunctionInfo &FI, Attributes |= llvm::Attribute::ZExt; } } + if (RegParm > 0 && + (ParamType->isIntegerType() || ParamType->isPointerType())) { + RegParm -= + (Context.getTypeSize(ParamType) + PointerWidth - 1) / PointerWidth; + if (RegParm >= 0) + Attributes |= llvm::Attribute::InReg; + } + // FIXME: handle sseregparm someday... break; - + case ABIArgInfo::Ignore: // Skip increment, no matching LLVM parameter. continue; |