diff options
author | Chris Lattner <sabre@nondot.org> | 2010-07-29 21:42:50 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2010-07-29 21:42:50 +0000 |
commit | 1f3a063f0035893d2befef25a6a2773ca6ad15d8 (patch) | |
tree | b23e08c365fe761066c179f6674d9876a1a23767 /clang/lib | |
parent | b9e7c0aef62310f686f56756ec54a3c1e3dd9c5c (diff) | |
download | bcm5719-llvm-1f3a063f0035893d2befef25a6a2773ca6ad15d8.tar.gz bcm5719-llvm-1f3a063f0035893d2befef25a6a2773ca6ad15d8.zip |
move the last hunk of getCoerceResult into the place
that needs it and remove getCoerceResult.
llvm-svn: 109807
Diffstat (limited to 'clang/lib')
-rw-r--r-- | clang/lib/CodeGen/ABIInfo.h | 4 | ||||
-rw-r--r-- | clang/lib/CodeGen/TargetInfo.cpp | 59 |
2 files changed, 29 insertions, 34 deletions
diff --git a/clang/lib/CodeGen/ABIInfo.h b/clang/lib/CodeGen/ABIInfo.h index ade650580c3..c059cb8baab 100644 --- a/clang/lib/CodeGen/ABIInfo.h +++ b/clang/lib/CodeGen/ABIInfo.h @@ -78,8 +78,8 @@ namespace clang { static ABIArgInfo getDirect(const llvm::Type *T = 0) { return ABIArgInfo(Direct, T); } - static ABIArgInfo getExtend() { - return ABIArgInfo(Extend); + static ABIArgInfo getExtend(const llvm::Type *T = 0) { + return ABIArgInfo(Extend, T); } static ABIArgInfo getIgnore() { return ABIArgInfo(Ignore); diff --git a/clang/lib/CodeGen/TargetInfo.cpp b/clang/lib/CodeGen/TargetInfo.cpp index 870d6dd68ee..be2e9540024 100644 --- a/clang/lib/CodeGen/TargetInfo.cpp +++ b/clang/lib/CodeGen/TargetInfo.cpp @@ -725,18 +725,6 @@ class X86_64ABIInfo : public ABIInfo { unsigned IROffset, QualType SourceTy, unsigned SourceOffset) const; - /// getCoerceResult - Given a source type \arg Ty and an LLVM type - /// to coerce to, chose the best way to pass Ty in the same place - /// that \arg CoerceTo would be passed, but while keeping the - /// emitted code as simple as possible. - /// - /// FIXME: Note, this should be cleaned up to just take an enumeration of all - /// the ways we might want to pass things, instead of constructing an LLVM - /// type. This makes this code more explicit, and it makes it clearer that we - /// are also doing this for correctness in the case of passing scalar types. - ABIArgInfo getCoerceResult(QualType Ty, - const llvm::Type *CoerceTo) const; - /// getIndirectResult - Give a source type \arg Ty, return a suitable result /// such that the argument will be returned in memory. ABIArgInfo getIndirectReturnResult(QualType Ty) const; @@ -1108,24 +1096,6 @@ void X86_64ABIInfo::classify(QualType Ty, uint64_t OffsetBase, } } -ABIArgInfo X86_64ABIInfo::getCoerceResult(QualType Ty, - const llvm::Type *CoerceTo) const { - if (isa<llvm::IntegerType>(CoerceTo)) { - // Integer and pointer types will end up in a general purpose - // register. - - // Treat an enum type as its underlying type. - if (const EnumType *EnumTy = Ty->getAs<EnumType>()) - Ty = EnumTy->getDecl()->getIntegerType(); - - if (Ty->isIntegralOrEnumerationType()) - return (Ty->isPromotableIntegerType() ? - ABIArgInfo::getExtend() : ABIArgInfo::getDirect()); - - } - return ABIArgInfo::getDirect(CoerceTo); -} - ABIArgInfo X86_64ABIInfo::getIndirectReturnResult(QualType Ty) const { // If this is a scalar LLVM value then assume LLVM will pass it in the right // place naturally. @@ -1439,6 +1409,18 @@ classifyReturnType(QualType RetTy) const { case Integer: ResType = GetINTEGERTypeAtOffset(CGT.ConvertTypeRecursive(RetTy), 0, RetTy, 0); + + // If we have a sign or zero extended integer, make sure to return Extend + // so that the parameter gets the right LLVM IR attributes. + if (Hi == NoClass && isa<llvm::IntegerType>(ResType)) { + // Treat an enum type as its underlying type. + if (const EnumType *EnumTy = RetTy->getAs<EnumType>()) + RetTy = EnumTy->getDecl()->getIntegerType(); + + if (RetTy->isIntegralOrEnumerationType() && + RetTy->isPromotableIntegerType()) + return ABIArgInfo::getExtend(); + } break; // AMD64-ABI 3.2.3p4: Rule 4. If the class is SSE, the next @@ -1513,7 +1495,7 @@ classifyReturnType(QualType RetTy) const { break; } - return getCoerceResult(RetTy, ResType); + return ABIArgInfo::getDirect(ResType); } ABIArgInfo X86_64ABIInfo::classifyArgumentType(QualType Ty, unsigned &neededInt, @@ -1556,6 +1538,19 @@ ABIArgInfo X86_64ABIInfo::classifyArgumentType(QualType Ty, unsigned &neededInt, // Pick an 8-byte type based on the preferred type. ResType = GetINTEGERTypeAtOffset(CGT.ConvertTypeRecursive(Ty), 0, Ty, 0); + + // If we have a sign or zero extended integer, make sure to return Extend + // so that the parameter gets the right LLVM IR attributes. + if (Hi == NoClass && isa<llvm::IntegerType>(ResType)) { + // Treat an enum type as its underlying type. + if (const EnumType *EnumTy = Ty->getAs<EnumType>()) + Ty = EnumTy->getDecl()->getIntegerType(); + + if (Ty->isIntegralOrEnumerationType() && + Ty->isPromotableIntegerType()) + return ABIArgInfo::getExtend(); + } + break; // AMD64-ABI 3.2.3p3: Rule 3. If the class is SSE, the next @@ -1608,7 +1603,7 @@ ABIArgInfo X86_64ABIInfo::classifyArgumentType(QualType Ty, unsigned &neededInt, break; } - return getCoerceResult(Ty, ResType); + return ABIArgInfo::getDirect(ResType); } void X86_64ABIInfo::computeInfo(CGFunctionInfo &FI) const { |