TargetInfo.cpp revision 2fc107f5652a526d9c2972dc3b386e5d86769e44
182d0a418c8699fc6f4a9417457ffe93d43bba1c1Anton Korobeynikov//===---- TargetInfo.cpp - Encapsulate target details -----------*- C++ -*-===// 2c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov// 3c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov// The LLVM Compiler Infrastructure 4c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov// 5c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov// This file is distributed under the University of Illinois Open Source 6c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov// License. See LICENSE.TXT for details. 7c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov// 8c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov//===----------------------------------------------------------------------===// 9c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov// 10c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov// These classes wrap the information about a call or function 11c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov// definition used to handle ABI compliancy. 12c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov// 13c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov//===----------------------------------------------------------------------===// 14c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 1582d0a418c8699fc6f4a9417457ffe93d43bba1c1Anton Korobeynikov#include "TargetInfo.h" 16c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov#include "ABIInfo.h" 17c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov#include "CodeGenFunction.h" 1819cc4abea06a9b49e0e16a50d335c064cd723572Anders Carlsson#include "clang/AST/RecordLayout.h" 1934c1af83e159cfe0f43e7a855e84783f301fc1f1Sandeep Patel#include "clang/Frontend/CodeGenOptions.h" 20c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov#include "llvm/Type.h" 219c254f0415bef9a0bafe5b5026ddb54b727597b1Chris Lattner#include "llvm/Target/TargetData.h" 222c0843f166a82f251b20370fadab57878969e7aaDaniel Dunbar#include "llvm/ADT/Triple.h" 2328df7a5813d94ff32904c31195d7f6fd74db8c53Daniel Dunbar#include "llvm/Support/raw_ostream.h" 24c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikovusing namespace clang; 25c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikovusing namespace CodeGen; 26c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 27aeeb7011a875d3dd439e9fa07dc3ac54d97785b9John McCallstatic void AssignToArrayRange(CodeGen::CGBuilderTy &Builder, 28aeeb7011a875d3dd439e9fa07dc3ac54d97785b9John McCall llvm::Value *Array, 29aeeb7011a875d3dd439e9fa07dc3ac54d97785b9John McCall llvm::Value *Value, 30aeeb7011a875d3dd439e9fa07dc3ac54d97785b9John McCall unsigned FirstIndex, 31aeeb7011a875d3dd439e9fa07dc3ac54d97785b9John McCall unsigned LastIndex) { 32aeeb7011a875d3dd439e9fa07dc3ac54d97785b9John McCall // Alternatively, we could emit this as a loop in the source. 33aeeb7011a875d3dd439e9fa07dc3ac54d97785b9John McCall for (unsigned I = FirstIndex; I <= LastIndex; ++I) { 34aeeb7011a875d3dd439e9fa07dc3ac54d97785b9John McCall llvm::Value *Cell = Builder.CreateConstInBoundsGEP1_32(Array, I); 35aeeb7011a875d3dd439e9fa07dc3ac54d97785b9John McCall Builder.CreateStore(Value, Cell); 36aeeb7011a875d3dd439e9fa07dc3ac54d97785b9John McCall } 37aeeb7011a875d3dd439e9fa07dc3ac54d97785b9John McCall} 38aeeb7011a875d3dd439e9fa07dc3ac54d97785b9John McCall 39d608cdb7c044365cf4e8764ade1e11e99c176078John McCallstatic bool isAggregateTypeForABI(QualType T) { 40d608cdb7c044365cf4e8764ade1e11e99c176078John McCall return CodeGenFunction::hasAggregateLLVMType(T) || 41d608cdb7c044365cf4e8764ade1e11e99c176078John McCall T->isMemberFunctionPointerType(); 42d608cdb7c044365cf4e8764ade1e11e99c176078John McCall} 43d608cdb7c044365cf4e8764ade1e11e99c176078John McCall 44c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton KorobeynikovABIInfo::~ABIInfo() {} 45c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 46ea0443212e7ec6ff82e2f174e8e948a6eb0e0876Chris LattnerASTContext &ABIInfo::getContext() const { 47ea0443212e7ec6ff82e2f174e8e948a6eb0e0876Chris Lattner return CGT.getContext(); 48ea0443212e7ec6ff82e2f174e8e948a6eb0e0876Chris Lattner} 49ea0443212e7ec6ff82e2f174e8e948a6eb0e0876Chris Lattner 50ea0443212e7ec6ff82e2f174e8e948a6eb0e0876Chris Lattnerllvm::LLVMContext &ABIInfo::getVMContext() const { 51ea0443212e7ec6ff82e2f174e8e948a6eb0e0876Chris Lattner return CGT.getLLVMContext(); 52ea0443212e7ec6ff82e2f174e8e948a6eb0e0876Chris Lattner} 53ea0443212e7ec6ff82e2f174e8e948a6eb0e0876Chris Lattner 54ea0443212e7ec6ff82e2f174e8e948a6eb0e0876Chris Lattnerconst llvm::TargetData &ABIInfo::getTargetData() const { 55ea0443212e7ec6ff82e2f174e8e948a6eb0e0876Chris Lattner return CGT.getTargetData(); 56ea0443212e7ec6ff82e2f174e8e948a6eb0e0876Chris Lattner} 57ea0443212e7ec6ff82e2f174e8e948a6eb0e0876Chris Lattner 58ea0443212e7ec6ff82e2f174e8e948a6eb0e0876Chris Lattner 59c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikovvoid ABIArgInfo::dump() const { 605f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner raw_ostream &OS = llvm::errs(); 6128df7a5813d94ff32904c31195d7f6fd74db8c53Daniel Dunbar OS << "(ABIArgInfo Kind="; 62c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov switch (TheKind) { 63c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov case Direct: 64800588fd230d2c37ddce8fbf4a3881352715d700Chris Lattner OS << "Direct Type="; 652acc6e3feda5e4f7d9009bdcf8b1cd777fecfe2dChris Lattner if (llvm::Type *Ty = getCoerceToType()) 66800588fd230d2c37ddce8fbf4a3881352715d700Chris Lattner Ty->print(OS); 67800588fd230d2c37ddce8fbf4a3881352715d700Chris Lattner else 68800588fd230d2c37ddce8fbf4a3881352715d700Chris Lattner OS << "null"; 69c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov break; 70cc6fa88666ca2f287df4a600eb31a4087bab9c13Anton Korobeynikov case Extend: 7128df7a5813d94ff32904c31195d7f6fd74db8c53Daniel Dunbar OS << "Extend"; 72cc6fa88666ca2f287df4a600eb31a4087bab9c13Anton Korobeynikov break; 73c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov case Ignore: 7428df7a5813d94ff32904c31195d7f6fd74db8c53Daniel Dunbar OS << "Ignore"; 75c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov break; 76c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov case Indirect: 77dc6d574155072bfb35a7a29b94ef3afa0d40fb5aDaniel Dunbar OS << "Indirect Align=" << getIndirectAlign() 78e9b5d77b7bfd3e8bba05df9914a6e8c336d68ff3Joerg Sonnenberger << " ByVal=" << getIndirectByVal() 79cf3b6f2504596812db1fcef0df8ce5b3449c4aacDaniel Dunbar << " Realign=" << getIndirectRealign(); 80c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov break; 81c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov case Expand: 8228df7a5813d94ff32904c31195d7f6fd74db8c53Daniel Dunbar OS << "Expand"; 83c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov break; 84c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov } 8528df7a5813d94ff32904c31195d7f6fd74db8c53Daniel Dunbar OS << ")\n"; 86c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov} 87c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 8882d0a418c8699fc6f4a9417457ffe93d43bba1c1Anton KorobeynikovTargetCodeGenInfo::~TargetCodeGenInfo() { delete Info; } 8982d0a418c8699fc6f4a9417457ffe93d43bba1c1Anton Korobeynikov 9049e34be6ae0c25b9843610cdd2fd6fea9cd8b870John McCall// If someone can figure out a general rule for this, that would be great. 9149e34be6ae0c25b9843610cdd2fd6fea9cd8b870John McCall// It's probably just doomed to be platform-dependent, though. 9249e34be6ae0c25b9843610cdd2fd6fea9cd8b870John McCallunsigned TargetCodeGenInfo::getSizeOfUnwindException() const { 9349e34be6ae0c25b9843610cdd2fd6fea9cd8b870John McCall // Verified for: 9449e34be6ae0c25b9843610cdd2fd6fea9cd8b870John McCall // x86-64 FreeBSD, Linux, Darwin 9549e34be6ae0c25b9843610cdd2fd6fea9cd8b870John McCall // x86-32 FreeBSD, Linux, Darwin 9649e34be6ae0c25b9843610cdd2fd6fea9cd8b870John McCall // PowerPC Linux, Darwin 9749e34be6ae0c25b9843610cdd2fd6fea9cd8b870John McCall // ARM Darwin (*not* EABI) 9849e34be6ae0c25b9843610cdd2fd6fea9cd8b870John McCall return 32; 9949e34be6ae0c25b9843610cdd2fd6fea9cd8b870John McCall} 10049e34be6ae0c25b9843610cdd2fd6fea9cd8b870John McCall 101de5d3c717684f3821b8db58037bc7140acf134aaJohn McCallbool TargetCodeGenInfo::isNoProtoCallVariadic(const CallArgList &args, 102de5d3c717684f3821b8db58037bc7140acf134aaJohn McCall const FunctionNoProtoType *fnType) const { 10301f151e0ffba72bcad770bea5f563a9b68ca050eJohn McCall // The following conventions are known to require this to be false: 10401f151e0ffba72bcad770bea5f563a9b68ca050eJohn McCall // x86_stdcall 10501f151e0ffba72bcad770bea5f563a9b68ca050eJohn McCall // MIPS 10601f151e0ffba72bcad770bea5f563a9b68ca050eJohn McCall // For everything else, we just prefer false unless we opt out. 10701f151e0ffba72bcad770bea5f563a9b68ca050eJohn McCall return false; 10801f151e0ffba72bcad770bea5f563a9b68ca050eJohn McCall} 10901f151e0ffba72bcad770bea5f563a9b68ca050eJohn McCall 11098303b93ae335bbb4731f6f1f8164d3c70648346Daniel Dunbarstatic bool isEmptyRecord(ASTContext &Context, QualType T, bool AllowArrays); 111c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 112f3477c13eeaf11b32a41f181398fb5deffd0dd73Sylvestre Ledru/// isEmptyField - Return true iff a the field is "empty", that is it 113c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov/// is an unnamed bit-field or an (array of) empty record(s). 11498303b93ae335bbb4731f6f1f8164d3c70648346Daniel Dunbarstatic bool isEmptyField(ASTContext &Context, const FieldDecl *FD, 11598303b93ae335bbb4731f6f1f8164d3c70648346Daniel Dunbar bool AllowArrays) { 116c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov if (FD->isUnnamedBitfield()) 117c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov return true; 118c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 119c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov QualType FT = FD->getType(); 120c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 1217e7ad3f8fa150de6144be332ae4bfe5d1acb5c6dEli Friedman // Constant arrays of empty records count as empty, strip them off. 1227e7ad3f8fa150de6144be332ae4bfe5d1acb5c6dEli Friedman // Constant arrays of zero length always count as empty. 12398303b93ae335bbb4731f6f1f8164d3c70648346Daniel Dunbar if (AllowArrays) 1247e7ad3f8fa150de6144be332ae4bfe5d1acb5c6dEli Friedman while (const ConstantArrayType *AT = Context.getAsConstantArrayType(FT)) { 1257e7ad3f8fa150de6144be332ae4bfe5d1acb5c6dEli Friedman if (AT->getSize() == 0) 1267e7ad3f8fa150de6144be332ae4bfe5d1acb5c6dEli Friedman return true; 12798303b93ae335bbb4731f6f1f8164d3c70648346Daniel Dunbar FT = AT->getElementType(); 1287e7ad3f8fa150de6144be332ae4bfe5d1acb5c6dEli Friedman } 12998303b93ae335bbb4731f6f1f8164d3c70648346Daniel Dunbar 1305ea68614bfe0e78b5d66339b781529038f86501fDaniel Dunbar const RecordType *RT = FT->getAs<RecordType>(); 1315ea68614bfe0e78b5d66339b781529038f86501fDaniel Dunbar if (!RT) 1325ea68614bfe0e78b5d66339b781529038f86501fDaniel Dunbar return false; 1335ea68614bfe0e78b5d66339b781529038f86501fDaniel Dunbar 1345ea68614bfe0e78b5d66339b781529038f86501fDaniel Dunbar // C++ record fields are never empty, at least in the Itanium ABI. 1355ea68614bfe0e78b5d66339b781529038f86501fDaniel Dunbar // 1365ea68614bfe0e78b5d66339b781529038f86501fDaniel Dunbar // FIXME: We should use a predicate for whether this behavior is true in the 1375ea68614bfe0e78b5d66339b781529038f86501fDaniel Dunbar // current ABI. 1385ea68614bfe0e78b5d66339b781529038f86501fDaniel Dunbar if (isa<CXXRecordDecl>(RT->getDecl())) 1395ea68614bfe0e78b5d66339b781529038f86501fDaniel Dunbar return false; 1405ea68614bfe0e78b5d66339b781529038f86501fDaniel Dunbar 14198303b93ae335bbb4731f6f1f8164d3c70648346Daniel Dunbar return isEmptyRecord(Context, FT, AllowArrays); 142c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov} 143c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 144f3477c13eeaf11b32a41f181398fb5deffd0dd73Sylvestre Ledru/// isEmptyRecord - Return true iff a structure contains only empty 145c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov/// fields. Note that a structure with a flexible array member is not 146c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov/// considered empty. 14798303b93ae335bbb4731f6f1f8164d3c70648346Daniel Dunbarstatic bool isEmptyRecord(ASTContext &Context, QualType T, bool AllowArrays) { 1486217b80b7a1379b74cced1c076338262c3c980b3Ted Kremenek const RecordType *RT = T->getAs<RecordType>(); 149c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov if (!RT) 150c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov return 0; 151c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov const RecordDecl *RD = RT->getDecl(); 152c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov if (RD->hasFlexibleArrayMember()) 153c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov return false; 1545ea68614bfe0e78b5d66339b781529038f86501fDaniel Dunbar 155c5f18f3e8c3f1e9cb25534f9a9676f112bedc2a7Argyrios Kyrtzidis // If this is a C++ record, check the bases first. 1565ea68614bfe0e78b5d66339b781529038f86501fDaniel Dunbar if (const CXXRecordDecl *CXXRD = dyn_cast<CXXRecordDecl>(RD)) 157c5f18f3e8c3f1e9cb25534f9a9676f112bedc2a7Argyrios Kyrtzidis for (CXXRecordDecl::base_class_const_iterator i = CXXRD->bases_begin(), 158c5f18f3e8c3f1e9cb25534f9a9676f112bedc2a7Argyrios Kyrtzidis e = CXXRD->bases_end(); i != e; ++i) 159c5f18f3e8c3f1e9cb25534f9a9676f112bedc2a7Argyrios Kyrtzidis if (!isEmptyRecord(Context, i->getType(), true)) 160c5f18f3e8c3f1e9cb25534f9a9676f112bedc2a7Argyrios Kyrtzidis return false; 1615ea68614bfe0e78b5d66339b781529038f86501fDaniel Dunbar 16217945a0f64fe03ff6ec0c2146005a87636e3ac12Argyrios Kyrtzidis for (RecordDecl::field_iterator i = RD->field_begin(), e = RD->field_end(); 16317945a0f64fe03ff6ec0c2146005a87636e3ac12Argyrios Kyrtzidis i != e; ++i) 164581deb3da481053c4993c7600f97acf7768caac5David Blaikie if (!isEmptyField(Context, *i, AllowArrays)) 165c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov return false; 166c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov return true; 167c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov} 168c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 1690a8f847e97f40cce51dc69051b964732333dc028Anders Carlsson/// hasNonTrivialDestructorOrCopyConstructor - Determine if a type has either 1700a8f847e97f40cce51dc69051b964732333dc028Anders Carlsson/// a non-trivial destructor or a non-trivial copy constructor. 1710a8f847e97f40cce51dc69051b964732333dc028Anders Carlssonstatic bool hasNonTrivialDestructorOrCopyConstructor(const RecordType *RT) { 1720a8f847e97f40cce51dc69051b964732333dc028Anders Carlsson const CXXRecordDecl *RD = dyn_cast<CXXRecordDecl>(RT->getDecl()); 1730a8f847e97f40cce51dc69051b964732333dc028Anders Carlsson if (!RD) 1740a8f847e97f40cce51dc69051b964732333dc028Anders Carlsson return false; 1758bea82f6699e4384ef823cdc8800ad5db271177cMichael J. Spencer 1760a8f847e97f40cce51dc69051b964732333dc028Anders Carlsson return !RD->hasTrivialDestructor() || !RD->hasTrivialCopyConstructor(); 1770a8f847e97f40cce51dc69051b964732333dc028Anders Carlsson} 1780a8f847e97f40cce51dc69051b964732333dc028Anders Carlsson 1790a8f847e97f40cce51dc69051b964732333dc028Anders Carlsson/// isRecordWithNonTrivialDestructorOrCopyConstructor - Determine if a type is 1800a8f847e97f40cce51dc69051b964732333dc028Anders Carlsson/// a record type with either a non-trivial destructor or a non-trivial copy 1810a8f847e97f40cce51dc69051b964732333dc028Anders Carlsson/// constructor. 1820a8f847e97f40cce51dc69051b964732333dc028Anders Carlssonstatic bool isRecordWithNonTrivialDestructorOrCopyConstructor(QualType T) { 1830a8f847e97f40cce51dc69051b964732333dc028Anders Carlsson const RecordType *RT = T->getAs<RecordType>(); 1840a8f847e97f40cce51dc69051b964732333dc028Anders Carlsson if (!RT) 1850a8f847e97f40cce51dc69051b964732333dc028Anders Carlsson return false; 1860a8f847e97f40cce51dc69051b964732333dc028Anders Carlsson 1870a8f847e97f40cce51dc69051b964732333dc028Anders Carlsson return hasNonTrivialDestructorOrCopyConstructor(RT); 1880a8f847e97f40cce51dc69051b964732333dc028Anders Carlsson} 1890a8f847e97f40cce51dc69051b964732333dc028Anders Carlsson 190c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov/// isSingleElementStruct - Determine if a structure is a "single 191c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov/// element struct", i.e. it has exactly one non-empty field or 192c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov/// exactly one field which is itself a single element 193c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov/// struct. Structures with flexible array members are never 194c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov/// considered single element structs. 195c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov/// 196c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov/// \return The field declaration for the single non-empty field, if 197c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov/// it exists. 198c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikovstatic const Type *isSingleElementStruct(QualType T, ASTContext &Context) { 199c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov const RecordType *RT = T->getAsStructureType(); 200c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov if (!RT) 201c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov return 0; 202c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 203c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov const RecordDecl *RD = RT->getDecl(); 204c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov if (RD->hasFlexibleArrayMember()) 205c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov return 0; 206c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 207c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov const Type *Found = 0; 2088bea82f6699e4384ef823cdc8800ad5db271177cMichael J. Spencer 2099430d5a61598c47d827e1cd05f7cf3f110eeec9eDaniel Dunbar // If this is a C++ record, check the bases first. 2109430d5a61598c47d827e1cd05f7cf3f110eeec9eDaniel Dunbar if (const CXXRecordDecl *CXXRD = dyn_cast<CXXRecordDecl>(RD)) { 2119430d5a61598c47d827e1cd05f7cf3f110eeec9eDaniel Dunbar for (CXXRecordDecl::base_class_const_iterator i = CXXRD->bases_begin(), 2129430d5a61598c47d827e1cd05f7cf3f110eeec9eDaniel Dunbar e = CXXRD->bases_end(); i != e; ++i) { 2139430d5a61598c47d827e1cd05f7cf3f110eeec9eDaniel Dunbar // Ignore empty records. 2145ea68614bfe0e78b5d66339b781529038f86501fDaniel Dunbar if (isEmptyRecord(Context, i->getType(), true)) 2159430d5a61598c47d827e1cd05f7cf3f110eeec9eDaniel Dunbar continue; 2169430d5a61598c47d827e1cd05f7cf3f110eeec9eDaniel Dunbar 2179430d5a61598c47d827e1cd05f7cf3f110eeec9eDaniel Dunbar // If we already found an element then this isn't a single-element struct. 2189430d5a61598c47d827e1cd05f7cf3f110eeec9eDaniel Dunbar if (Found) 2199430d5a61598c47d827e1cd05f7cf3f110eeec9eDaniel Dunbar return 0; 2209430d5a61598c47d827e1cd05f7cf3f110eeec9eDaniel Dunbar 2219430d5a61598c47d827e1cd05f7cf3f110eeec9eDaniel Dunbar // If this is non-empty and not a single element struct, the composite 2229430d5a61598c47d827e1cd05f7cf3f110eeec9eDaniel Dunbar // cannot be a single element struct. 2239430d5a61598c47d827e1cd05f7cf3f110eeec9eDaniel Dunbar Found = isSingleElementStruct(i->getType(), Context); 2249430d5a61598c47d827e1cd05f7cf3f110eeec9eDaniel Dunbar if (!Found) 2259430d5a61598c47d827e1cd05f7cf3f110eeec9eDaniel Dunbar return 0; 2269430d5a61598c47d827e1cd05f7cf3f110eeec9eDaniel Dunbar } 2279430d5a61598c47d827e1cd05f7cf3f110eeec9eDaniel Dunbar } 2289430d5a61598c47d827e1cd05f7cf3f110eeec9eDaniel Dunbar 2299430d5a61598c47d827e1cd05f7cf3f110eeec9eDaniel Dunbar // Check for single element. 23017945a0f64fe03ff6ec0c2146005a87636e3ac12Argyrios Kyrtzidis for (RecordDecl::field_iterator i = RD->field_begin(), e = RD->field_end(); 23117945a0f64fe03ff6ec0c2146005a87636e3ac12Argyrios Kyrtzidis i != e; ++i) { 232581deb3da481053c4993c7600f97acf7768caac5David Blaikie const FieldDecl *FD = *i; 233c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov QualType FT = FD->getType(); 234c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 235c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // Ignore empty fields. 23698303b93ae335bbb4731f6f1f8164d3c70648346Daniel Dunbar if (isEmptyField(Context, FD, true)) 237c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov continue; 238c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 239c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // If we already found an element then this isn't a single-element 240c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // struct. 241c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov if (Found) 242c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov return 0; 243c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 244c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // Treat single element arrays as the element. 245c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov while (const ConstantArrayType *AT = Context.getAsConstantArrayType(FT)) { 246c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov if (AT->getSize().getZExtValue() != 1) 247c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov break; 248c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov FT = AT->getElementType(); 249c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov } 250c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 251d608cdb7c044365cf4e8764ade1e11e99c176078John McCall if (!isAggregateTypeForABI(FT)) { 252c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov Found = FT.getTypePtr(); 253c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov } else { 254c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov Found = isSingleElementStruct(FT, Context); 255c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov if (!Found) 256c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov return 0; 257c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov } 258c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov } 259c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 260bd4d3bcd2cd64d1bba29b2a52705b97d68ebccd5Eli Friedman // We don't consider a struct a single-element struct if it has 261bd4d3bcd2cd64d1bba29b2a52705b97d68ebccd5Eli Friedman // padding beyond the element type. 262bd4d3bcd2cd64d1bba29b2a52705b97d68ebccd5Eli Friedman if (Found && Context.getTypeSize(Found) != Context.getTypeSize(T)) 263bd4d3bcd2cd64d1bba29b2a52705b97d68ebccd5Eli Friedman return 0; 264bd4d3bcd2cd64d1bba29b2a52705b97d68ebccd5Eli Friedman 265c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov return Found; 266c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov} 267c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 268c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikovstatic bool is32Or64BitBasicType(QualType Ty, ASTContext &Context) { 269a1842d32a1964712e42078e9b389dce9258c6a8cDaniel Dunbar if (!Ty->getAs<BuiltinType>() && !Ty->hasPointerRepresentation() && 27055e59e139d9ebcaae16d710472e28edbcafac98aDaniel Dunbar !Ty->isAnyComplexType() && !Ty->isEnumeralType() && 27155e59e139d9ebcaae16d710472e28edbcafac98aDaniel Dunbar !Ty->isBlockPointerType()) 272c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov return false; 273c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 274c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov uint64_t Size = Context.getTypeSize(Ty); 275c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov return Size == 32 || Size == 64; 276c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov} 277c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 27853012f447145bfd5e3a759f069a2bdf2b6705708Daniel Dunbar/// canExpandIndirectArgument - Test whether an argument type which is to be 27953012f447145bfd5e3a759f069a2bdf2b6705708Daniel Dunbar/// passed indirectly (on the stack) would have the equivalent layout if it was 28053012f447145bfd5e3a759f069a2bdf2b6705708Daniel Dunbar/// expanded into separate arguments. If so, we prefer to do the latter to avoid 28153012f447145bfd5e3a759f069a2bdf2b6705708Daniel Dunbar/// inhibiting optimizations. 28253012f447145bfd5e3a759f069a2bdf2b6705708Daniel Dunbar/// 28353012f447145bfd5e3a759f069a2bdf2b6705708Daniel Dunbar// FIXME: This predicate is missing many cases, currently it just follows 28453012f447145bfd5e3a759f069a2bdf2b6705708Daniel Dunbar// llvm-gcc (checks that all fields are 32-bit or 64-bit primitive types). We 28553012f447145bfd5e3a759f069a2bdf2b6705708Daniel Dunbar// should probably make this smarter, or better yet make the LLVM backend 28653012f447145bfd5e3a759f069a2bdf2b6705708Daniel Dunbar// capable of handling it. 28753012f447145bfd5e3a759f069a2bdf2b6705708Daniel Dunbarstatic bool canExpandIndirectArgument(QualType Ty, ASTContext &Context) { 28853012f447145bfd5e3a759f069a2bdf2b6705708Daniel Dunbar // We can only expand structure types. 28953012f447145bfd5e3a759f069a2bdf2b6705708Daniel Dunbar const RecordType *RT = Ty->getAs<RecordType>(); 29053012f447145bfd5e3a759f069a2bdf2b6705708Daniel Dunbar if (!RT) 29153012f447145bfd5e3a759f069a2bdf2b6705708Daniel Dunbar return false; 29253012f447145bfd5e3a759f069a2bdf2b6705708Daniel Dunbar 29353012f447145bfd5e3a759f069a2bdf2b6705708Daniel Dunbar // We can only expand (C) structures. 29453012f447145bfd5e3a759f069a2bdf2b6705708Daniel Dunbar // 29553012f447145bfd5e3a759f069a2bdf2b6705708Daniel Dunbar // FIXME: This needs to be generalized to handle classes as well. 29653012f447145bfd5e3a759f069a2bdf2b6705708Daniel Dunbar const RecordDecl *RD = RT->getDecl(); 29753012f447145bfd5e3a759f069a2bdf2b6705708Daniel Dunbar if (!RD->isStruct() || isa<CXXRecordDecl>(RD)) 29853012f447145bfd5e3a759f069a2bdf2b6705708Daniel Dunbar return false; 29953012f447145bfd5e3a759f069a2bdf2b6705708Daniel Dunbar 300506d4e375a6a36a49eb70578983dc4acaf2f15aeEli Friedman uint64_t Size = 0; 301506d4e375a6a36a49eb70578983dc4acaf2f15aeEli Friedman 30217945a0f64fe03ff6ec0c2146005a87636e3ac12Argyrios Kyrtzidis for (RecordDecl::field_iterator i = RD->field_begin(), e = RD->field_end(); 30317945a0f64fe03ff6ec0c2146005a87636e3ac12Argyrios Kyrtzidis i != e; ++i) { 304581deb3da481053c4993c7600f97acf7768caac5David Blaikie const FieldDecl *FD = *i; 305c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 306c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov if (!is32Or64BitBasicType(FD->getType(), Context)) 307c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov return false; 308c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 309c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // FIXME: Reject bit-fields wholesale; there are two problems, we don't know 310c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // how to expand them yet, and the predicate for telling if a bitfield still 311c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // counts as "basic" is more complicated than what we were doing previously. 312c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov if (FD->isBitField()) 313c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov return false; 314506d4e375a6a36a49eb70578983dc4acaf2f15aeEli Friedman 315506d4e375a6a36a49eb70578983dc4acaf2f15aeEli Friedman Size += Context.getTypeSize(FD->getType()); 316c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov } 317c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 318506d4e375a6a36a49eb70578983dc4acaf2f15aeEli Friedman // Make sure there are not any holes in the struct. 319506d4e375a6a36a49eb70578983dc4acaf2f15aeEli Friedman if (Size != Context.getTypeSize(Ty)) 320506d4e375a6a36a49eb70578983dc4acaf2f15aeEli Friedman return false; 321506d4e375a6a36a49eb70578983dc4acaf2f15aeEli Friedman 322c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov return true; 323c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov} 324c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 325c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikovnamespace { 326c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov/// DefaultABIInfo - The default implementation for ABI specific 327c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov/// details. This implementation provides information which results in 328c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov/// self-consistent and sensible LLVM IR generation, but does not 329c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov/// conform to any particular ABI. 330c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikovclass DefaultABIInfo : public ABIInfo { 331ea0443212e7ec6ff82e2f174e8e948a6eb0e0876Chris Lattnerpublic: 332ea0443212e7ec6ff82e2f174e8e948a6eb0e0876Chris Lattner DefaultABIInfo(CodeGen::CodeGenTypes &CGT) : ABIInfo(CGT) {} 3338bea82f6699e4384ef823cdc8800ad5db271177cMichael J. Spencer 334a3c109bbf6e198f463fbe204da4d25b40dab65c4Chris Lattner ABIArgInfo classifyReturnType(QualType RetTy) const; 335a3c109bbf6e198f463fbe204da4d25b40dab65c4Chris Lattner ABIArgInfo classifyArgumentType(QualType RetTy) const; 336c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 337ee5dcd064a811edc90f6c1fb31a837b6c961fed7Chris Lattner virtual void computeInfo(CGFunctionInfo &FI) const { 338a3c109bbf6e198f463fbe204da4d25b40dab65c4Chris Lattner FI.getReturnInfo() = classifyReturnType(FI.getReturnType()); 339c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov for (CGFunctionInfo::arg_iterator it = FI.arg_begin(), ie = FI.arg_end(); 340c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov it != ie; ++it) 341a3c109bbf6e198f463fbe204da4d25b40dab65c4Chris Lattner it->info = classifyArgumentType(it->type); 342c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov } 343c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 344c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov virtual llvm::Value *EmitVAArg(llvm::Value *VAListAddr, QualType Ty, 345c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov CodeGenFunction &CGF) const; 346c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov}; 347c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 34882d0a418c8699fc6f4a9417457ffe93d43bba1c1Anton Korobeynikovclass DefaultTargetCodeGenInfo : public TargetCodeGenInfo { 34982d0a418c8699fc6f4a9417457ffe93d43bba1c1Anton Korobeynikovpublic: 350ea0443212e7ec6ff82e2f174e8e948a6eb0e0876Chris Lattner DefaultTargetCodeGenInfo(CodeGen::CodeGenTypes &CGT) 351ea0443212e7ec6ff82e2f174e8e948a6eb0e0876Chris Lattner : TargetCodeGenInfo(new DefaultABIInfo(CGT)) {} 35282d0a418c8699fc6f4a9417457ffe93d43bba1c1Anton Korobeynikov}; 35382d0a418c8699fc6f4a9417457ffe93d43bba1c1Anton Korobeynikov 35482d0a418c8699fc6f4a9417457ffe93d43bba1c1Anton Korobeynikovllvm::Value *DefaultABIInfo::EmitVAArg(llvm::Value *VAListAddr, QualType Ty, 35582d0a418c8699fc6f4a9417457ffe93d43bba1c1Anton Korobeynikov CodeGenFunction &CGF) const { 35682d0a418c8699fc6f4a9417457ffe93d43bba1c1Anton Korobeynikov return 0; 35782d0a418c8699fc6f4a9417457ffe93d43bba1c1Anton Korobeynikov} 35882d0a418c8699fc6f4a9417457ffe93d43bba1c1Anton Korobeynikov 359a3c109bbf6e198f463fbe204da4d25b40dab65c4Chris LattnerABIArgInfo DefaultABIInfo::classifyArgumentType(QualType Ty) const { 36090306934bccaadaf2b538b3c90c3dd478aa1e7d8Jan Wen Voung if (isAggregateTypeForABI(Ty)) { 36190306934bccaadaf2b538b3c90c3dd478aa1e7d8Jan Wen Voung // Records with non trivial destructors/constructors should not be passed 36290306934bccaadaf2b538b3c90c3dd478aa1e7d8Jan Wen Voung // by value. 36390306934bccaadaf2b538b3c90c3dd478aa1e7d8Jan Wen Voung if (isRecordWithNonTrivialDestructorOrCopyConstructor(Ty)) 36490306934bccaadaf2b538b3c90c3dd478aa1e7d8Jan Wen Voung return ABIArgInfo::getIndirect(0, /*ByVal=*/false); 36590306934bccaadaf2b538b3c90c3dd478aa1e7d8Jan Wen Voung 36682d0a418c8699fc6f4a9417457ffe93d43bba1c1Anton Korobeynikov return ABIArgInfo::getIndirect(0); 36790306934bccaadaf2b538b3c90c3dd478aa1e7d8Jan Wen Voung } 368dc6d574155072bfb35a7a29b94ef3afa0d40fb5aDaniel Dunbar 369a14db75641f377ef8b033c67653cd95ac4c36fe3Chris Lattner // Treat an enum type as its underlying type. 370a14db75641f377ef8b033c67653cd95ac4c36fe3Chris Lattner if (const EnumType *EnumTy = Ty->getAs<EnumType>()) 371a14db75641f377ef8b033c67653cd95ac4c36fe3Chris Lattner Ty = EnumTy->getDecl()->getIntegerType(); 372aa74a1e49f7c4b89539830290f76fe2c3e97187fDouglas Gregor 373a14db75641f377ef8b033c67653cd95ac4c36fe3Chris Lattner return (Ty->isPromotableIntegerType() ? 374a14db75641f377ef8b033c67653cd95ac4c36fe3Chris Lattner ABIArgInfo::getExtend() : ABIArgInfo::getDirect()); 37582d0a418c8699fc6f4a9417457ffe93d43bba1c1Anton Korobeynikov} 37682d0a418c8699fc6f4a9417457ffe93d43bba1c1Anton Korobeynikov 3770024f940dd15987b8ffbe6e787dcf860a9ea1effBob WilsonABIArgInfo DefaultABIInfo::classifyReturnType(QualType RetTy) const { 3780024f940dd15987b8ffbe6e787dcf860a9ea1effBob Wilson if (RetTy->isVoidType()) 3790024f940dd15987b8ffbe6e787dcf860a9ea1effBob Wilson return ABIArgInfo::getIgnore(); 3800024f940dd15987b8ffbe6e787dcf860a9ea1effBob Wilson 3810024f940dd15987b8ffbe6e787dcf860a9ea1effBob Wilson if (isAggregateTypeForABI(RetTy)) 3820024f940dd15987b8ffbe6e787dcf860a9ea1effBob Wilson return ABIArgInfo::getIndirect(0); 3830024f940dd15987b8ffbe6e787dcf860a9ea1effBob Wilson 3840024f940dd15987b8ffbe6e787dcf860a9ea1effBob Wilson // Treat an enum type as its underlying type. 3850024f940dd15987b8ffbe6e787dcf860a9ea1effBob Wilson if (const EnumType *EnumTy = RetTy->getAs<EnumType>()) 3860024f940dd15987b8ffbe6e787dcf860a9ea1effBob Wilson RetTy = EnumTy->getDecl()->getIntegerType(); 3870024f940dd15987b8ffbe6e787dcf860a9ea1effBob Wilson 3880024f940dd15987b8ffbe6e787dcf860a9ea1effBob Wilson return (RetTy->isPromotableIntegerType() ? 3890024f940dd15987b8ffbe6e787dcf860a9ea1effBob Wilson ABIArgInfo::getExtend() : ABIArgInfo::getDirect()); 3900024f940dd15987b8ffbe6e787dcf860a9ea1effBob Wilson} 3910024f940dd15987b8ffbe6e787dcf860a9ea1effBob Wilson 3929ed63f8b87b1f7d074d21cc1210fd28d93291beaDerek Schuff//===----------------------------------------------------------------------===// 3939ed63f8b87b1f7d074d21cc1210fd28d93291beaDerek Schuff// le32/PNaCl bitcode ABI Implementation 3949ed63f8b87b1f7d074d21cc1210fd28d93291beaDerek Schuff//===----------------------------------------------------------------------===// 3959ed63f8b87b1f7d074d21cc1210fd28d93291beaDerek Schuff 3969ed63f8b87b1f7d074d21cc1210fd28d93291beaDerek Schuffclass PNaClABIInfo : public ABIInfo { 3979ed63f8b87b1f7d074d21cc1210fd28d93291beaDerek Schuff public: 3989ed63f8b87b1f7d074d21cc1210fd28d93291beaDerek Schuff PNaClABIInfo(CodeGen::CodeGenTypes &CGT) : ABIInfo(CGT) {} 3999ed63f8b87b1f7d074d21cc1210fd28d93291beaDerek Schuff 4009ed63f8b87b1f7d074d21cc1210fd28d93291beaDerek Schuff ABIArgInfo classifyReturnType(QualType RetTy) const; 4019ed63f8b87b1f7d074d21cc1210fd28d93291beaDerek Schuff ABIArgInfo classifyArgumentType(QualType RetTy, unsigned &FreeRegs) const; 4029ed63f8b87b1f7d074d21cc1210fd28d93291beaDerek Schuff 4039ed63f8b87b1f7d074d21cc1210fd28d93291beaDerek Schuff virtual void computeInfo(CGFunctionInfo &FI) const; 4049ed63f8b87b1f7d074d21cc1210fd28d93291beaDerek Schuff virtual llvm::Value *EmitVAArg(llvm::Value *VAListAddr, QualType Ty, 4059ed63f8b87b1f7d074d21cc1210fd28d93291beaDerek Schuff CodeGenFunction &CGF) const; 4069ed63f8b87b1f7d074d21cc1210fd28d93291beaDerek Schuff}; 4079ed63f8b87b1f7d074d21cc1210fd28d93291beaDerek Schuff 4089ed63f8b87b1f7d074d21cc1210fd28d93291beaDerek Schuffclass PNaClTargetCodeGenInfo : public TargetCodeGenInfo { 4099ed63f8b87b1f7d074d21cc1210fd28d93291beaDerek Schuff public: 4109ed63f8b87b1f7d074d21cc1210fd28d93291beaDerek Schuff PNaClTargetCodeGenInfo(CodeGen::CodeGenTypes &CGT) 4119ed63f8b87b1f7d074d21cc1210fd28d93291beaDerek Schuff : TargetCodeGenInfo(new PNaClABIInfo(CGT)) {} 4129ed63f8b87b1f7d074d21cc1210fd28d93291beaDerek Schuff}; 4139ed63f8b87b1f7d074d21cc1210fd28d93291beaDerek Schuff 4149ed63f8b87b1f7d074d21cc1210fd28d93291beaDerek Schuffvoid PNaClABIInfo::computeInfo(CGFunctionInfo &FI) const { 4159ed63f8b87b1f7d074d21cc1210fd28d93291beaDerek Schuff FI.getReturnInfo() = classifyReturnType(FI.getReturnType()); 4169ed63f8b87b1f7d074d21cc1210fd28d93291beaDerek Schuff 4179ed63f8b87b1f7d074d21cc1210fd28d93291beaDerek Schuff unsigned FreeRegs = FI.getHasRegParm() ? FI.getRegParm() : 0; 4189ed63f8b87b1f7d074d21cc1210fd28d93291beaDerek Schuff 4199ed63f8b87b1f7d074d21cc1210fd28d93291beaDerek Schuff for (CGFunctionInfo::arg_iterator it = FI.arg_begin(), ie = FI.arg_end(); 4209ed63f8b87b1f7d074d21cc1210fd28d93291beaDerek Schuff it != ie; ++it) 4219ed63f8b87b1f7d074d21cc1210fd28d93291beaDerek Schuff it->info = classifyArgumentType(it->type, FreeRegs); 4229ed63f8b87b1f7d074d21cc1210fd28d93291beaDerek Schuff } 4239ed63f8b87b1f7d074d21cc1210fd28d93291beaDerek Schuff 4249ed63f8b87b1f7d074d21cc1210fd28d93291beaDerek Schuffllvm::Value *PNaClABIInfo::EmitVAArg(llvm::Value *VAListAddr, QualType Ty, 4259ed63f8b87b1f7d074d21cc1210fd28d93291beaDerek Schuff CodeGenFunction &CGF) const { 4269ed63f8b87b1f7d074d21cc1210fd28d93291beaDerek Schuff return 0; 4279ed63f8b87b1f7d074d21cc1210fd28d93291beaDerek Schuff} 4289ed63f8b87b1f7d074d21cc1210fd28d93291beaDerek Schuff 4299ed63f8b87b1f7d074d21cc1210fd28d93291beaDerek SchuffABIArgInfo PNaClABIInfo::classifyArgumentType(QualType Ty, 4309ed63f8b87b1f7d074d21cc1210fd28d93291beaDerek Schuff unsigned &FreeRegs) const { 4319ed63f8b87b1f7d074d21cc1210fd28d93291beaDerek Schuff if (isAggregateTypeForABI(Ty)) { 4329ed63f8b87b1f7d074d21cc1210fd28d93291beaDerek Schuff // Records with non trivial destructors/constructors should not be passed 4339ed63f8b87b1f7d074d21cc1210fd28d93291beaDerek Schuff // by value. 4349ed63f8b87b1f7d074d21cc1210fd28d93291beaDerek Schuff FreeRegs = 0; 4359ed63f8b87b1f7d074d21cc1210fd28d93291beaDerek Schuff if (isRecordWithNonTrivialDestructorOrCopyConstructor(Ty)) 4369ed63f8b87b1f7d074d21cc1210fd28d93291beaDerek Schuff return ABIArgInfo::getIndirect(0, /*ByVal=*/false); 4379ed63f8b87b1f7d074d21cc1210fd28d93291beaDerek Schuff 4389ed63f8b87b1f7d074d21cc1210fd28d93291beaDerek Schuff return ABIArgInfo::getIndirect(0); 4399ed63f8b87b1f7d074d21cc1210fd28d93291beaDerek Schuff } 4409ed63f8b87b1f7d074d21cc1210fd28d93291beaDerek Schuff 4419ed63f8b87b1f7d074d21cc1210fd28d93291beaDerek Schuff // Treat an enum type as its underlying type. 4429ed63f8b87b1f7d074d21cc1210fd28d93291beaDerek Schuff if (const EnumType *EnumTy = Ty->getAs<EnumType>()) 4439ed63f8b87b1f7d074d21cc1210fd28d93291beaDerek Schuff Ty = EnumTy->getDecl()->getIntegerType(); 4449ed63f8b87b1f7d074d21cc1210fd28d93291beaDerek Schuff 4459ed63f8b87b1f7d074d21cc1210fd28d93291beaDerek Schuff ABIArgInfo BaseInfo = (Ty->isPromotableIntegerType() ? 4469ed63f8b87b1f7d074d21cc1210fd28d93291beaDerek Schuff ABIArgInfo::getExtend() : ABIArgInfo::getDirect()); 4479ed63f8b87b1f7d074d21cc1210fd28d93291beaDerek Schuff 4489ed63f8b87b1f7d074d21cc1210fd28d93291beaDerek Schuff // Regparm regs hold 32 bits. 4499ed63f8b87b1f7d074d21cc1210fd28d93291beaDerek Schuff unsigned SizeInRegs = (getContext().getTypeSize(Ty) + 31) / 32; 4509ed63f8b87b1f7d074d21cc1210fd28d93291beaDerek Schuff if (SizeInRegs == 0) return BaseInfo; 4519ed63f8b87b1f7d074d21cc1210fd28d93291beaDerek Schuff if (SizeInRegs > FreeRegs) { 4529ed63f8b87b1f7d074d21cc1210fd28d93291beaDerek Schuff FreeRegs = 0; 4539ed63f8b87b1f7d074d21cc1210fd28d93291beaDerek Schuff return BaseInfo; 4549ed63f8b87b1f7d074d21cc1210fd28d93291beaDerek Schuff } 4559ed63f8b87b1f7d074d21cc1210fd28d93291beaDerek Schuff FreeRegs -= SizeInRegs; 4569ed63f8b87b1f7d074d21cc1210fd28d93291beaDerek Schuff return BaseInfo.isDirect() ? 4579ed63f8b87b1f7d074d21cc1210fd28d93291beaDerek Schuff ABIArgInfo::getDirectInReg(BaseInfo.getCoerceToType()) : 4589ed63f8b87b1f7d074d21cc1210fd28d93291beaDerek Schuff ABIArgInfo::getExtendInReg(BaseInfo.getCoerceToType()); 4599ed63f8b87b1f7d074d21cc1210fd28d93291beaDerek Schuff} 4609ed63f8b87b1f7d074d21cc1210fd28d93291beaDerek Schuff 4619ed63f8b87b1f7d074d21cc1210fd28d93291beaDerek SchuffABIArgInfo PNaClABIInfo::classifyReturnType(QualType RetTy) const { 4629ed63f8b87b1f7d074d21cc1210fd28d93291beaDerek Schuff if (RetTy->isVoidType()) 4639ed63f8b87b1f7d074d21cc1210fd28d93291beaDerek Schuff return ABIArgInfo::getIgnore(); 4649ed63f8b87b1f7d074d21cc1210fd28d93291beaDerek Schuff 4659ed63f8b87b1f7d074d21cc1210fd28d93291beaDerek Schuff if (isAggregateTypeForABI(RetTy)) 4669ed63f8b87b1f7d074d21cc1210fd28d93291beaDerek Schuff return ABIArgInfo::getIndirect(0); 4679ed63f8b87b1f7d074d21cc1210fd28d93291beaDerek Schuff 4689ed63f8b87b1f7d074d21cc1210fd28d93291beaDerek Schuff // Treat an enum type as its underlying type. 4699ed63f8b87b1f7d074d21cc1210fd28d93291beaDerek Schuff if (const EnumType *EnumTy = RetTy->getAs<EnumType>()) 4709ed63f8b87b1f7d074d21cc1210fd28d93291beaDerek Schuff RetTy = EnumTy->getDecl()->getIntegerType(); 4719ed63f8b87b1f7d074d21cc1210fd28d93291beaDerek Schuff 4729ed63f8b87b1f7d074d21cc1210fd28d93291beaDerek Schuff return (RetTy->isPromotableIntegerType() ? 4739ed63f8b87b1f7d074d21cc1210fd28d93291beaDerek Schuff ABIArgInfo::getExtend() : ABIArgInfo::getDirect()); 4749ed63f8b87b1f7d074d21cc1210fd28d93291beaDerek Schuff} 4759ed63f8b87b1f7d074d21cc1210fd28d93291beaDerek Schuff 47655fc7e2b8005ba87a81664d065e9b9e2fff1b1afEli Friedman/// UseX86_MMXType - Return true if this is an MMX type that should use the 47755fc7e2b8005ba87a81664d065e9b9e2fff1b1afEli Friedman/// special x86_mmx type. 4782acc6e3feda5e4f7d9009bdcf8b1cd777fecfe2dChris Lattnerbool UseX86_MMXType(llvm::Type *IRType) { 479bb465d7d0489a6605bb1eb82dea87350066ac5e2Bill Wendling // If the type is an MMX type <2 x i32>, <4 x i16>, or <8 x i8>, use the 480bb465d7d0489a6605bb1eb82dea87350066ac5e2Bill Wendling // special x86_mmx type. 481bb465d7d0489a6605bb1eb82dea87350066ac5e2Bill Wendling return IRType->isVectorTy() && IRType->getPrimitiveSizeInBits() == 64 && 482bb465d7d0489a6605bb1eb82dea87350066ac5e2Bill Wendling cast<llvm::VectorType>(IRType)->getElementType()->isIntegerTy() && 483bb465d7d0489a6605bb1eb82dea87350066ac5e2Bill Wendling IRType->getScalarSizeInBits() != 64; 484bb465d7d0489a6605bb1eb82dea87350066ac5e2Bill Wendling} 485bb465d7d0489a6605bb1eb82dea87350066ac5e2Bill Wendling 486ef6de3da8572607f786303c07150daa6e140ab19Jay Foadstatic llvm::Type* X86AdjustInlineAsmType(CodeGen::CodeGenFunction &CGF, 4875f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner StringRef Constraint, 488ef6de3da8572607f786303c07150daa6e140ab19Jay Foad llvm::Type* Ty) { 4890507be662df482b5c67b7905ed7ca368cb5c6b69Bill Wendling if ((Constraint == "y" || Constraint == "&y") && Ty->isVectorTy()) 4904b93d660c6326ec79b5e369317d1051cf826c2f3Peter Collingbourne return llvm::Type::getX86_MMXTy(CGF.getLLVMContext()); 4914b93d660c6326ec79b5e369317d1051cf826c2f3Peter Collingbourne return Ty; 4924b93d660c6326ec79b5e369317d1051cf826c2f3Peter Collingbourne} 4934b93d660c6326ec79b5e369317d1051cf826c2f3Peter Collingbourne 494dce5ad0cf70ba74e1ecdbb5e81f1a81d97821636Chris Lattner//===----------------------------------------------------------------------===// 495dce5ad0cf70ba74e1ecdbb5e81f1a81d97821636Chris Lattner// X86-32 ABI Implementation 496dce5ad0cf70ba74e1ecdbb5e81f1a81d97821636Chris Lattner//===----------------------------------------------------------------------===// 4978bea82f6699e4384ef823cdc8800ad5db271177cMichael J. Spencer 498c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov/// X86_32ABIInfo - The X86-32 ABI information. 499c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikovclass X86_32ABIInfo : public ABIInfo { 500b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola enum Class { 501b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola Integer, 502b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola Float 503b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola }; 504b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola 505fb67d6c3814524fdd43bd2fb159f7c594eae581cDaniel Dunbar static const unsigned MinABIStackAlignInBytes = 4; 506fb67d6c3814524fdd43bd2fb159f7c594eae581cDaniel Dunbar 5071e4249c10606f706aac181e6f5e8435ea99d9603David Chisnall bool IsDarwinVectorABI; 5081e4249c10606f706aac181e6f5e8435ea99d9603David Chisnall bool IsSmallStructInRegABI; 509c3e0fb406fb6fe83566dc6d8b05362e0a2c1e191Eli Friedman bool IsMMXDisabled; 51055fc7e2b8005ba87a81664d065e9b9e2fff1b1afEli Friedman bool IsWin32FloatStructABI; 511b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola unsigned DefaultNumRegisterParameters; 512c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 513c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov static bool isRegisterSize(unsigned Size) { 514c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov return (Size == 8 || Size == 16 || Size == 32 || Size == 64); 515c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov } 516c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 5176c60c8d7466b3191602dbb8e4a81f4ee7d9a09a6Aaron Ballman static bool shouldReturnTypeInRegister(QualType Ty, ASTContext &Context, 5186c60c8d7466b3191602dbb8e4a81f4ee7d9a09a6Aaron Ballman unsigned callingConvention); 519c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 520dc6d574155072bfb35a7a29b94ef3afa0d40fb5aDaniel Dunbar /// getIndirectResult - Give a source type \arg Ty, return a suitable result 521dc6d574155072bfb35a7a29b94ef3afa0d40fb5aDaniel Dunbar /// such that the argument will be passed in memory. 522a3c109bbf6e198f463fbe204da4d25b40dab65c4Chris Lattner ABIArgInfo getIndirectResult(QualType Ty, bool ByVal = true) const; 523dc6d574155072bfb35a7a29b94ef3afa0d40fb5aDaniel Dunbar 524fb67d6c3814524fdd43bd2fb159f7c594eae581cDaniel Dunbar /// \brief Return the alignment to use for the given type on the stack. 525e59d8585bb40a8bae6b847ad258536a2c01f20eaDaniel Dunbar unsigned getTypeStackAlignInBytes(QualType Ty, unsigned Align) const; 526fb67d6c3814524fdd43bd2fb159f7c594eae581cDaniel Dunbar 527b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola Class classify(QualType Ty) const; 528b33a3c448ec669a7ef530ef8094cdfc9346468cfRafael Espindola ABIArgInfo classifyReturnType(QualType RetTy, 5296c60c8d7466b3191602dbb8e4a81f4ee7d9a09a6Aaron Ballman unsigned callingConvention) const; 530b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola ABIArgInfo classifyArgumentTypeWithReg(QualType RetTy, 531b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola unsigned &FreeRegs) const; 532a3c109bbf6e198f463fbe204da4d25b40dab65c4Chris Lattner ABIArgInfo classifyArgumentType(QualType RetTy) const; 533c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 534b33a3c448ec669a7ef530ef8094cdfc9346468cfRafael Espindolapublic: 535b33a3c448ec669a7ef530ef8094cdfc9346468cfRafael Espindola 536aa9cf8d3abd8760d78b20e9194df169bbd8b0f01Rafael Espindola virtual void computeInfo(CGFunctionInfo &FI) const; 537c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov virtual llvm::Value *EmitVAArg(llvm::Value *VAListAddr, QualType Ty, 538c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov CodeGenFunction &CGF) const; 539c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 540b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola X86_32ABIInfo(CodeGen::CodeGenTypes &CGT, bool d, bool p, bool m, bool w, 541b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola unsigned r) 542c3e0fb406fb6fe83566dc6d8b05362e0a2c1e191Eli Friedman : ABIInfo(CGT), IsDarwinVectorABI(d), IsSmallStructInRegABI(p), 543b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola IsMMXDisabled(m), IsWin32FloatStructABI(w), 544b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola DefaultNumRegisterParameters(r) {} 545c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov}; 546c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 54782d0a418c8699fc6f4a9417457ffe93d43bba1c1Anton Korobeynikovclass X86_32TargetCodeGenInfo : public TargetCodeGenInfo { 54882d0a418c8699fc6f4a9417457ffe93d43bba1c1Anton Korobeynikovpublic: 54955fc7e2b8005ba87a81664d065e9b9e2fff1b1afEli Friedman X86_32TargetCodeGenInfo(CodeGen::CodeGenTypes &CGT, 550b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola bool d, bool p, bool m, bool w, unsigned r) 551b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola :TargetCodeGenInfo(new X86_32ABIInfo(CGT, d, p, m, w, r)) {} 55274f7293eb30bf77355c20a3c2cad7b67d8ce7388Charles Davis 55374f7293eb30bf77355c20a3c2cad7b67d8ce7388Charles Davis void SetTargetAttributes(const Decl *D, llvm::GlobalValue *GV, 55474f7293eb30bf77355c20a3c2cad7b67d8ce7388Charles Davis CodeGen::CodeGenModule &CGM) const; 5556374c3307e2d73348f7b8cc73eeeb0998ad0ac94John McCall 5566374c3307e2d73348f7b8cc73eeeb0998ad0ac94John McCall int getDwarfEHStackPointer(CodeGen::CodeGenModule &CGM) const { 5576374c3307e2d73348f7b8cc73eeeb0998ad0ac94John McCall // Darwin uses different dwarf register numbers for EH. 5586374c3307e2d73348f7b8cc73eeeb0998ad0ac94John McCall if (CGM.isTargetDarwin()) return 5; 5596374c3307e2d73348f7b8cc73eeeb0998ad0ac94John McCall 5606374c3307e2d73348f7b8cc73eeeb0998ad0ac94John McCall return 4; 5616374c3307e2d73348f7b8cc73eeeb0998ad0ac94John McCall } 5626374c3307e2d73348f7b8cc73eeeb0998ad0ac94John McCall 5636374c3307e2d73348f7b8cc73eeeb0998ad0ac94John McCall bool initDwarfEHRegSizeTable(CodeGen::CodeGenFunction &CGF, 5646374c3307e2d73348f7b8cc73eeeb0998ad0ac94John McCall llvm::Value *Address) const; 5654b93d660c6326ec79b5e369317d1051cf826c2f3Peter Collingbourne 566ef6de3da8572607f786303c07150daa6e140ab19Jay Foad llvm::Type* adjustInlineAsmType(CodeGen::CodeGenFunction &CGF, 5675f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner StringRef Constraint, 568ef6de3da8572607f786303c07150daa6e140ab19Jay Foad llvm::Type* Ty) const { 5694b93d660c6326ec79b5e369317d1051cf826c2f3Peter Collingbourne return X86AdjustInlineAsmType(CGF, Constraint, Ty); 5704b93d660c6326ec79b5e369317d1051cf826c2f3Peter Collingbourne } 5714b93d660c6326ec79b5e369317d1051cf826c2f3Peter Collingbourne 57282d0a418c8699fc6f4a9417457ffe93d43bba1c1Anton Korobeynikov}; 57382d0a418c8699fc6f4a9417457ffe93d43bba1c1Anton Korobeynikov 57482d0a418c8699fc6f4a9417457ffe93d43bba1c1Anton Korobeynikov} 575c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 576c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov/// shouldReturnTypeInRegister - Determine if the given type should be 577c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov/// passed in a register (for the Darwin ABI). 578c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikovbool X86_32ABIInfo::shouldReturnTypeInRegister(QualType Ty, 5796c60c8d7466b3191602dbb8e4a81f4ee7d9a09a6Aaron Ballman ASTContext &Context, 5806c60c8d7466b3191602dbb8e4a81f4ee7d9a09a6Aaron Ballman unsigned callingConvention) { 581c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov uint64_t Size = Context.getTypeSize(Ty); 582c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 583c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // Type must be register sized. 584c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov if (!isRegisterSize(Size)) 585c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov return false; 586c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 587c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov if (Ty->isVectorType()) { 588c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // 64- and 128- bit vectors inside structures are not returned in 589c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // registers. 590c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov if (Size == 64 || Size == 128) 591c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov return false; 592c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 593c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov return true; 594c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov } 595c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 5967711523d948bbe635f690f5795ef7ea9a3289eb2Daniel Dunbar // If this is a builtin, pointer, enum, complex type, member pointer, or 5977711523d948bbe635f690f5795ef7ea9a3289eb2Daniel Dunbar // member function pointer it is ok. 598a1842d32a1964712e42078e9b389dce9258c6a8cDaniel Dunbar if (Ty->getAs<BuiltinType>() || Ty->hasPointerRepresentation() || 59955e59e139d9ebcaae16d710472e28edbcafac98aDaniel Dunbar Ty->isAnyComplexType() || Ty->isEnumeralType() || 6007711523d948bbe635f690f5795ef7ea9a3289eb2Daniel Dunbar Ty->isBlockPointerType() || Ty->isMemberPointerType()) 601c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov return true; 602c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 603c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // Arrays are treated like records. 604c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov if (const ConstantArrayType *AT = Context.getAsConstantArrayType(Ty)) 6056c60c8d7466b3191602dbb8e4a81f4ee7d9a09a6Aaron Ballman return shouldReturnTypeInRegister(AT->getElementType(), Context, 6066c60c8d7466b3191602dbb8e4a81f4ee7d9a09a6Aaron Ballman callingConvention); 607c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 608c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // Otherwise, it must be a record type. 6096217b80b7a1379b74cced1c076338262c3c980b3Ted Kremenek const RecordType *RT = Ty->getAs<RecordType>(); 610c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov if (!RT) return false; 611c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 612a887423cf580e19b2d03e3a0499c065730c96b28Anders Carlsson // FIXME: Traverse bases here too. 613a887423cf580e19b2d03e3a0499c065730c96b28Anders Carlsson 6146c60c8d7466b3191602dbb8e4a81f4ee7d9a09a6Aaron Ballman // For thiscall conventions, structures will never be returned in 6156c60c8d7466b3191602dbb8e4a81f4ee7d9a09a6Aaron Ballman // a register. This is for compatibility with the MSVC ABI 6166c60c8d7466b3191602dbb8e4a81f4ee7d9a09a6Aaron Ballman if (callingConvention == llvm::CallingConv::X86_ThisCall && 6176c60c8d7466b3191602dbb8e4a81f4ee7d9a09a6Aaron Ballman RT->isStructureType()) { 6186c60c8d7466b3191602dbb8e4a81f4ee7d9a09a6Aaron Ballman return false; 6196c60c8d7466b3191602dbb8e4a81f4ee7d9a09a6Aaron Ballman } 6206c60c8d7466b3191602dbb8e4a81f4ee7d9a09a6Aaron Ballman 621c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // Structure types are passed in register if all fields would be 622c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // passed in a register. 62317945a0f64fe03ff6ec0c2146005a87636e3ac12Argyrios Kyrtzidis for (RecordDecl::field_iterator i = RT->getDecl()->field_begin(), 62417945a0f64fe03ff6ec0c2146005a87636e3ac12Argyrios Kyrtzidis e = RT->getDecl()->field_end(); i != e; ++i) { 625581deb3da481053c4993c7600f97acf7768caac5David Blaikie const FieldDecl *FD = *i; 626c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 627c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // Empty fields are ignored. 62898303b93ae335bbb4731f6f1f8164d3c70648346Daniel Dunbar if (isEmptyField(Context, FD, true)) 629c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov continue; 630c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 631c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // Check fields recursively. 6326c60c8d7466b3191602dbb8e4a81f4ee7d9a09a6Aaron Ballman if (!shouldReturnTypeInRegister(FD->getType(), Context, 6336c60c8d7466b3191602dbb8e4a81f4ee7d9a09a6Aaron Ballman callingConvention)) 634c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov return false; 635c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov } 636c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov return true; 637c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov} 638c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 6396c60c8d7466b3191602dbb8e4a81f4ee7d9a09a6Aaron BallmanABIArgInfo X86_32ABIInfo::classifyReturnType(QualType RetTy, 6406c60c8d7466b3191602dbb8e4a81f4ee7d9a09a6Aaron Ballman unsigned callingConvention) const { 641a3c109bbf6e198f463fbe204da4d25b40dab65c4Chris Lattner if (RetTy->isVoidType()) 642c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov return ABIArgInfo::getIgnore(); 6438bea82f6699e4384ef823cdc8800ad5db271177cMichael J. Spencer 644a3c109bbf6e198f463fbe204da4d25b40dab65c4Chris Lattner if (const VectorType *VT = RetTy->getAs<VectorType>()) { 645c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // On Darwin, some vectors are returned in registers. 6461e4249c10606f706aac181e6f5e8435ea99d9603David Chisnall if (IsDarwinVectorABI) { 647a3c109bbf6e198f463fbe204da4d25b40dab65c4Chris Lattner uint64_t Size = getContext().getTypeSize(RetTy); 648c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 649c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // 128-bit vectors are a special case; they are returned in 650c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // registers and we need to make sure to pick a type the LLVM 651c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // backend will like. 652c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov if (Size == 128) 653800588fd230d2c37ddce8fbf4a3881352715d700Chris Lattner return ABIArgInfo::getDirect(llvm::VectorType::get( 654a3c109bbf6e198f463fbe204da4d25b40dab65c4Chris Lattner llvm::Type::getInt64Ty(getVMContext()), 2)); 655c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 656c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // Always return in register if it fits in a general purpose 657c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // register, or if it is 64 bits and has a single element. 658c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov if ((Size == 8 || Size == 16 || Size == 32) || 659c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov (Size == 64 && VT->getNumElements() == 1)) 660800588fd230d2c37ddce8fbf4a3881352715d700Chris Lattner return ABIArgInfo::getDirect(llvm::IntegerType::get(getVMContext(), 661a3c109bbf6e198f463fbe204da4d25b40dab65c4Chris Lattner Size)); 662c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 663c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov return ABIArgInfo::getIndirect(0); 664c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov } 665c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 666c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov return ABIArgInfo::getDirect(); 667a3c109bbf6e198f463fbe204da4d25b40dab65c4Chris Lattner } 6688bea82f6699e4384ef823cdc8800ad5db271177cMichael J. Spencer 669d608cdb7c044365cf4e8764ade1e11e99c176078John McCall if (isAggregateTypeForABI(RetTy)) { 670a887423cf580e19b2d03e3a0499c065730c96b28Anders Carlsson if (const RecordType *RT = RetTy->getAs<RecordType>()) { 67140092972b591646b47037d2b46b695a4014df413Anders Carlsson // Structures with either a non-trivial destructor or a non-trivial 67240092972b591646b47037d2b46b695a4014df413Anders Carlsson // copy constructor are always indirect. 67340092972b591646b47037d2b46b695a4014df413Anders Carlsson if (hasNonTrivialDestructorOrCopyConstructor(RT)) 67440092972b591646b47037d2b46b695a4014df413Anders Carlsson return ABIArgInfo::getIndirect(0, /*ByVal=*/false); 6758bea82f6699e4384ef823cdc8800ad5db271177cMichael J. Spencer 67640092972b591646b47037d2b46b695a4014df413Anders Carlsson // Structures with flexible arrays are always indirect. 677c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov if (RT->getDecl()->hasFlexibleArrayMember()) 678c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov return ABIArgInfo::getIndirect(0); 67940092972b591646b47037d2b46b695a4014df413Anders Carlsson } 6808bea82f6699e4384ef823cdc8800ad5db271177cMichael J. Spencer 6811e4249c10606f706aac181e6f5e8435ea99d9603David Chisnall // If specified, structs and unions are always indirect. 6821e4249c10606f706aac181e6f5e8435ea99d9603David Chisnall if (!IsSmallStructInRegABI && !RetTy->isAnyComplexType()) 683c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov return ABIArgInfo::getIndirect(0); 684c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 685c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // Small structures which are register sized are generally returned 686c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // in a register. 6876c60c8d7466b3191602dbb8e4a81f4ee7d9a09a6Aaron Ballman if (X86_32ABIInfo::shouldReturnTypeInRegister(RetTy, getContext(), 6886c60c8d7466b3191602dbb8e4a81f4ee7d9a09a6Aaron Ballman callingConvention)) { 689a3c109bbf6e198f463fbe204da4d25b40dab65c4Chris Lattner uint64_t Size = getContext().getTypeSize(RetTy); 690bd4d3bcd2cd64d1bba29b2a52705b97d68ebccd5Eli Friedman 691bd4d3bcd2cd64d1bba29b2a52705b97d68ebccd5Eli Friedman // As a special-case, if the struct is a "single-element" struct, and 692bd4d3bcd2cd64d1bba29b2a52705b97d68ebccd5Eli Friedman // the field is of type "float" or "double", return it in a 69355fc7e2b8005ba87a81664d065e9b9e2fff1b1afEli Friedman // floating-point register. (MSVC does not apply this special case.) 69455fc7e2b8005ba87a81664d065e9b9e2fff1b1afEli Friedman // We apply a similar transformation for pointer types to improve the 69555fc7e2b8005ba87a81664d065e9b9e2fff1b1afEli Friedman // quality of the generated IR. 696bd4d3bcd2cd64d1bba29b2a52705b97d68ebccd5Eli Friedman if (const Type *SeltTy = isSingleElementStruct(RetTy, getContext())) 69755fc7e2b8005ba87a81664d065e9b9e2fff1b1afEli Friedman if ((!IsWin32FloatStructABI && SeltTy->isRealFloatingType()) 69855fc7e2b8005ba87a81664d065e9b9e2fff1b1afEli Friedman || SeltTy->hasPointerRepresentation()) 699bd4d3bcd2cd64d1bba29b2a52705b97d68ebccd5Eli Friedman return ABIArgInfo::getDirect(CGT.ConvertType(QualType(SeltTy, 0))); 700bd4d3bcd2cd64d1bba29b2a52705b97d68ebccd5Eli Friedman 701bd4d3bcd2cd64d1bba29b2a52705b97d68ebccd5Eli Friedman // FIXME: We should be able to narrow this integer in cases with dead 702bd4d3bcd2cd64d1bba29b2a52705b97d68ebccd5Eli Friedman // padding. 703800588fd230d2c37ddce8fbf4a3881352715d700Chris Lattner return ABIArgInfo::getDirect(llvm::IntegerType::get(getVMContext(),Size)); 704c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov } 705c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 706c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov return ABIArgInfo::getIndirect(0); 707c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov } 7088bea82f6699e4384ef823cdc8800ad5db271177cMichael J. Spencer 709a3c109bbf6e198f463fbe204da4d25b40dab65c4Chris Lattner // Treat an enum type as its underlying type. 710a3c109bbf6e198f463fbe204da4d25b40dab65c4Chris Lattner if (const EnumType *EnumTy = RetTy->getAs<EnumType>()) 711a3c109bbf6e198f463fbe204da4d25b40dab65c4Chris Lattner RetTy = EnumTy->getDecl()->getIntegerType(); 712a3c109bbf6e198f463fbe204da4d25b40dab65c4Chris Lattner 713a3c109bbf6e198f463fbe204da4d25b40dab65c4Chris Lattner return (RetTy->isPromotableIntegerType() ? 714a3c109bbf6e198f463fbe204da4d25b40dab65c4Chris Lattner ABIArgInfo::getExtend() : ABIArgInfo::getDirect()); 715c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov} 716c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 717f4bd4d8fe029ca314c2c61edb1d2a65bc18cdbf2Eli Friedmanstatic bool isSSEVectorType(ASTContext &Context, QualType Ty) { 718f4bd4d8fe029ca314c2c61edb1d2a65bc18cdbf2Eli Friedman return Ty->getAs<VectorType>() && Context.getTypeSize(Ty) == 128; 719f4bd4d8fe029ca314c2c61edb1d2a65bc18cdbf2Eli Friedman} 720f4bd4d8fe029ca314c2c61edb1d2a65bc18cdbf2Eli Friedman 72193ae947df36133c7a26a0c7d325c0679916ed2edDaniel Dunbarstatic bool isRecordWithSSEVectorType(ASTContext &Context, QualType Ty) { 72293ae947df36133c7a26a0c7d325c0679916ed2edDaniel Dunbar const RecordType *RT = Ty->getAs<RecordType>(); 72393ae947df36133c7a26a0c7d325c0679916ed2edDaniel Dunbar if (!RT) 72493ae947df36133c7a26a0c7d325c0679916ed2edDaniel Dunbar return 0; 72593ae947df36133c7a26a0c7d325c0679916ed2edDaniel Dunbar const RecordDecl *RD = RT->getDecl(); 72693ae947df36133c7a26a0c7d325c0679916ed2edDaniel Dunbar 72793ae947df36133c7a26a0c7d325c0679916ed2edDaniel Dunbar // If this is a C++ record, check the bases first. 72893ae947df36133c7a26a0c7d325c0679916ed2edDaniel Dunbar if (const CXXRecordDecl *CXXRD = dyn_cast<CXXRecordDecl>(RD)) 72993ae947df36133c7a26a0c7d325c0679916ed2edDaniel Dunbar for (CXXRecordDecl::base_class_const_iterator i = CXXRD->bases_begin(), 73093ae947df36133c7a26a0c7d325c0679916ed2edDaniel Dunbar e = CXXRD->bases_end(); i != e; ++i) 73193ae947df36133c7a26a0c7d325c0679916ed2edDaniel Dunbar if (!isRecordWithSSEVectorType(Context, i->getType())) 73293ae947df36133c7a26a0c7d325c0679916ed2edDaniel Dunbar return false; 73393ae947df36133c7a26a0c7d325c0679916ed2edDaniel Dunbar 73493ae947df36133c7a26a0c7d325c0679916ed2edDaniel Dunbar for (RecordDecl::field_iterator i = RD->field_begin(), e = RD->field_end(); 73593ae947df36133c7a26a0c7d325c0679916ed2edDaniel Dunbar i != e; ++i) { 73693ae947df36133c7a26a0c7d325c0679916ed2edDaniel Dunbar QualType FT = i->getType(); 73793ae947df36133c7a26a0c7d325c0679916ed2edDaniel Dunbar 738f4bd4d8fe029ca314c2c61edb1d2a65bc18cdbf2Eli Friedman if (isSSEVectorType(Context, FT)) 73993ae947df36133c7a26a0c7d325c0679916ed2edDaniel Dunbar return true; 74093ae947df36133c7a26a0c7d325c0679916ed2edDaniel Dunbar 74193ae947df36133c7a26a0c7d325c0679916ed2edDaniel Dunbar if (isRecordWithSSEVectorType(Context, FT)) 74293ae947df36133c7a26a0c7d325c0679916ed2edDaniel Dunbar return true; 74393ae947df36133c7a26a0c7d325c0679916ed2edDaniel Dunbar } 74493ae947df36133c7a26a0c7d325c0679916ed2edDaniel Dunbar 74593ae947df36133c7a26a0c7d325c0679916ed2edDaniel Dunbar return false; 74693ae947df36133c7a26a0c7d325c0679916ed2edDaniel Dunbar} 74793ae947df36133c7a26a0c7d325c0679916ed2edDaniel Dunbar 748e59d8585bb40a8bae6b847ad258536a2c01f20eaDaniel Dunbarunsigned X86_32ABIInfo::getTypeStackAlignInBytes(QualType Ty, 749e59d8585bb40a8bae6b847ad258536a2c01f20eaDaniel Dunbar unsigned Align) const { 750e59d8585bb40a8bae6b847ad258536a2c01f20eaDaniel Dunbar // Otherwise, if the alignment is less than or equal to the minimum ABI 751e59d8585bb40a8bae6b847ad258536a2c01f20eaDaniel Dunbar // alignment, just use the default; the backend will handle this. 752fb67d6c3814524fdd43bd2fb159f7c594eae581cDaniel Dunbar if (Align <= MinABIStackAlignInBytes) 753e59d8585bb40a8bae6b847ad258536a2c01f20eaDaniel Dunbar return 0; // Use default alignment. 754e59d8585bb40a8bae6b847ad258536a2c01f20eaDaniel Dunbar 755e59d8585bb40a8bae6b847ad258536a2c01f20eaDaniel Dunbar // On non-Darwin, the stack type alignment is always 4. 756e59d8585bb40a8bae6b847ad258536a2c01f20eaDaniel Dunbar if (!IsDarwinVectorABI) { 757e59d8585bb40a8bae6b847ad258536a2c01f20eaDaniel Dunbar // Set explicit alignment, since we may need to realign the top. 758fb67d6c3814524fdd43bd2fb159f7c594eae581cDaniel Dunbar return MinABIStackAlignInBytes; 759e59d8585bb40a8bae6b847ad258536a2c01f20eaDaniel Dunbar } 760fb67d6c3814524fdd43bd2fb159f7c594eae581cDaniel Dunbar 76193ae947df36133c7a26a0c7d325c0679916ed2edDaniel Dunbar // Otherwise, if the type contains an SSE vector type, the alignment is 16. 762f4bd4d8fe029ca314c2c61edb1d2a65bc18cdbf2Eli Friedman if (Align >= 16 && (isSSEVectorType(getContext(), Ty) || 763f4bd4d8fe029ca314c2c61edb1d2a65bc18cdbf2Eli Friedman isRecordWithSSEVectorType(getContext(), Ty))) 76493ae947df36133c7a26a0c7d325c0679916ed2edDaniel Dunbar return 16; 76593ae947df36133c7a26a0c7d325c0679916ed2edDaniel Dunbar 76693ae947df36133c7a26a0c7d325c0679916ed2edDaniel Dunbar return MinABIStackAlignInBytes; 767fb67d6c3814524fdd43bd2fb159f7c594eae581cDaniel Dunbar} 768fb67d6c3814524fdd43bd2fb159f7c594eae581cDaniel Dunbar 769a3c109bbf6e198f463fbe204da4d25b40dab65c4Chris LattnerABIArgInfo X86_32ABIInfo::getIndirectResult(QualType Ty, bool ByVal) const { 77046c54fb8ec45765a475b7b709b9aee7f94c490c2Daniel Dunbar if (!ByVal) 77146c54fb8ec45765a475b7b709b9aee7f94c490c2Daniel Dunbar return ABIArgInfo::getIndirect(0, false); 77246c54fb8ec45765a475b7b709b9aee7f94c490c2Daniel Dunbar 773e59d8585bb40a8bae6b847ad258536a2c01f20eaDaniel Dunbar // Compute the byval alignment. 774e59d8585bb40a8bae6b847ad258536a2c01f20eaDaniel Dunbar unsigned TypeAlign = getContext().getTypeAlign(Ty) / 8; 775e59d8585bb40a8bae6b847ad258536a2c01f20eaDaniel Dunbar unsigned StackAlign = getTypeStackAlignInBytes(Ty, TypeAlign); 776e59d8585bb40a8bae6b847ad258536a2c01f20eaDaniel Dunbar if (StackAlign == 0) 777de92d739ba0ef42a5a7dcfd6e170329549d0716bChris Lattner return ABIArgInfo::getIndirect(4); 778e59d8585bb40a8bae6b847ad258536a2c01f20eaDaniel Dunbar 779e59d8585bb40a8bae6b847ad258536a2c01f20eaDaniel Dunbar // If the stack alignment is less than the type alignment, realign the 780e59d8585bb40a8bae6b847ad258536a2c01f20eaDaniel Dunbar // argument. 781e59d8585bb40a8bae6b847ad258536a2c01f20eaDaniel Dunbar if (StackAlign < TypeAlign) 782e59d8585bb40a8bae6b847ad258536a2c01f20eaDaniel Dunbar return ABIArgInfo::getIndirect(StackAlign, /*ByVal=*/true, 783e59d8585bb40a8bae6b847ad258536a2c01f20eaDaniel Dunbar /*Realign=*/true); 784e59d8585bb40a8bae6b847ad258536a2c01f20eaDaniel Dunbar 785e59d8585bb40a8bae6b847ad258536a2c01f20eaDaniel Dunbar return ABIArgInfo::getIndirect(StackAlign); 786dc6d574155072bfb35a7a29b94ef3afa0d40fb5aDaniel Dunbar} 787dc6d574155072bfb35a7a29b94ef3afa0d40fb5aDaniel Dunbar 788b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael EspindolaX86_32ABIInfo::Class X86_32ABIInfo::classify(QualType Ty) const { 789b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola const Type *T = isSingleElementStruct(Ty, getContext()); 790b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola if (!T) 791b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola T = Ty.getTypePtr(); 792b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola 793b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola if (const BuiltinType *BT = T->getAs<BuiltinType>()) { 794b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola BuiltinType::Kind K = BT->getKind(); 795b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola if (K == BuiltinType::Float || K == BuiltinType::Double) 796b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola return Float; 797b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola } 798b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola return Integer; 799b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola} 800b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola 801b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael EspindolaABIArgInfo 802b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael EspindolaX86_32ABIInfo::classifyArgumentTypeWithReg(QualType Ty, 803b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola unsigned &FreeRegs) const { 804b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola // Common case first. 805b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola if (FreeRegs == 0) 806b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola return classifyArgumentType(Ty); 807b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola 808b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola Class C = classify(Ty); 809b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola if (C == Float) 810b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola return classifyArgumentType(Ty); 811b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola 812b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola unsigned SizeInRegs = (getContext().getTypeSize(Ty) + 31) / 32; 813b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola if (SizeInRegs == 0) 814b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola return classifyArgumentType(Ty); 815b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola 816b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola if (SizeInRegs > FreeRegs) { 817b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola FreeRegs = 0; 818b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola return classifyArgumentType(Ty); 819b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola } 820b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola assert(SizeInRegs >= 1 && SizeInRegs <= 3); 821b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola FreeRegs -= SizeInRegs; 822b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola 823b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola // If it is a simple scalar, keep the type so that we produce a cleaner IR. 824b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola ABIArgInfo Foo = classifyArgumentType(Ty); 825b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola if (Foo.isDirect() && !Foo.getDirectOffset() && !Foo.getPaddingType()) 826b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola return ABIArgInfo::getDirectInReg(Foo.getCoerceToType()); 827b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola if (Foo.isExtend()) 828b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola return ABIArgInfo::getExtendInReg(Foo.getCoerceToType()); 829b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola 830b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola llvm::LLVMContext &LLVMContext = getVMContext(); 831b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola llvm::Type *Int32 = llvm::Type::getInt32Ty(LLVMContext); 832b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola SmallVector<llvm::Type*, 3> Elements; 833b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola for (unsigned I = 0; I < SizeInRegs; ++I) 834b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola Elements.push_back(Int32); 835b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola llvm::Type *Result = llvm::StructType::get(LLVMContext, Elements); 836b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola return ABIArgInfo::getDirectInReg(Result); 837b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola} 838b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola 839a3c109bbf6e198f463fbe204da4d25b40dab65c4Chris LattnerABIArgInfo X86_32ABIInfo::classifyArgumentType(QualType Ty) const { 840c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // FIXME: Set alignment on indirect arguments. 841d608cdb7c044365cf4e8764ade1e11e99c176078John McCall if (isAggregateTypeForABI(Ty)) { 842c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // Structures with flexible arrays are always indirect. 843a887423cf580e19b2d03e3a0499c065730c96b28Anders Carlsson if (const RecordType *RT = Ty->getAs<RecordType>()) { 844a887423cf580e19b2d03e3a0499c065730c96b28Anders Carlsson // Structures with either a non-trivial destructor or a non-trivial 845a887423cf580e19b2d03e3a0499c065730c96b28Anders Carlsson // copy constructor are always indirect. 846a887423cf580e19b2d03e3a0499c065730c96b28Anders Carlsson if (hasNonTrivialDestructorOrCopyConstructor(RT)) 847a3c109bbf6e198f463fbe204da4d25b40dab65c4Chris Lattner return getIndirectResult(Ty, /*ByVal=*/false); 848dc6d574155072bfb35a7a29b94ef3afa0d40fb5aDaniel Dunbar 849c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov if (RT->getDecl()->hasFlexibleArrayMember()) 850a3c109bbf6e198f463fbe204da4d25b40dab65c4Chris Lattner return getIndirectResult(Ty); 851a887423cf580e19b2d03e3a0499c065730c96b28Anders Carlsson } 852c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 8535a4d35247f55dae6dd0d5ad349ecadbbea0b4572Eli Friedman // Ignore empty structs/unions. 8545a1ac89b244940a0337ea7ae7dc371e2a9bf7c50Eli Friedman if (isEmptyRecord(getContext(), Ty, true)) 855c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov return ABIArgInfo::getIgnore(); 856c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 85753012f447145bfd5e3a759f069a2bdf2b6705708Daniel Dunbar // Expand small (<= 128-bit) record types when we know that the stack layout 85853012f447145bfd5e3a759f069a2bdf2b6705708Daniel Dunbar // of those arguments will match the struct. This is important because the 85953012f447145bfd5e3a759f069a2bdf2b6705708Daniel Dunbar // LLVM backend isn't smart enough to remove byval, which inhibits many 86053012f447145bfd5e3a759f069a2bdf2b6705708Daniel Dunbar // optimizations. 861a3c109bbf6e198f463fbe204da4d25b40dab65c4Chris Lattner if (getContext().getTypeSize(Ty) <= 4*32 && 862a3c109bbf6e198f463fbe204da4d25b40dab65c4Chris Lattner canExpandIndirectArgument(Ty, getContext())) 86353012f447145bfd5e3a759f069a2bdf2b6705708Daniel Dunbar return ABIArgInfo::getExpand(); 864c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 865a3c109bbf6e198f463fbe204da4d25b40dab65c4Chris Lattner return getIndirectResult(Ty); 8668bea82f6699e4384ef823cdc8800ad5db271177cMichael J. Spencer } 8678bea82f6699e4384ef823cdc8800ad5db271177cMichael J. Spencer 868bbae8b40cd37d5b2815f8450cb588a41da89d7e5Chris Lattner if (const VectorType *VT = Ty->getAs<VectorType>()) { 8697b733505defd34f1bb7e74d9526be0bc41e76693Chris Lattner // On Darwin, some vectors are passed in memory, we handle this by passing 8707b733505defd34f1bb7e74d9526be0bc41e76693Chris Lattner // it as an i8/i16/i32/i64. 871bbae8b40cd37d5b2815f8450cb588a41da89d7e5Chris Lattner if (IsDarwinVectorABI) { 872bbae8b40cd37d5b2815f8450cb588a41da89d7e5Chris Lattner uint64_t Size = getContext().getTypeSize(Ty); 873bbae8b40cd37d5b2815f8450cb588a41da89d7e5Chris Lattner if ((Size == 8 || Size == 16 || Size == 32) || 874bbae8b40cd37d5b2815f8450cb588a41da89d7e5Chris Lattner (Size == 64 && VT->getNumElements() == 1)) 875bbae8b40cd37d5b2815f8450cb588a41da89d7e5Chris Lattner return ABIArgInfo::getDirect(llvm::IntegerType::get(getVMContext(), 876bbae8b40cd37d5b2815f8450cb588a41da89d7e5Chris Lattner Size)); 877bbae8b40cd37d5b2815f8450cb588a41da89d7e5Chris Lattner } 878bb465d7d0489a6605bb1eb82dea87350066ac5e2Bill Wendling 8799cbe4f0ba01ec304e1e3d071c071f7bca33631c0Chris Lattner llvm::Type *IRType = CGT.ConvertType(Ty); 880bb465d7d0489a6605bb1eb82dea87350066ac5e2Bill Wendling if (UseX86_MMXType(IRType)) { 881c3e0fb406fb6fe83566dc6d8b05362e0a2c1e191Eli Friedman if (IsMMXDisabled) 882c3e0fb406fb6fe83566dc6d8b05362e0a2c1e191Eli Friedman return ABIArgInfo::getDirect(llvm::IntegerType::get(getVMContext(), 883c3e0fb406fb6fe83566dc6d8b05362e0a2c1e191Eli Friedman 64)); 884bb465d7d0489a6605bb1eb82dea87350066ac5e2Bill Wendling ABIArgInfo AAI = ABIArgInfo::getDirect(IRType); 885bb465d7d0489a6605bb1eb82dea87350066ac5e2Bill Wendling AAI.setCoerceToType(llvm::Type::getX86_MMXTy(getVMContext())); 886bb465d7d0489a6605bb1eb82dea87350066ac5e2Bill Wendling return AAI; 887bb465d7d0489a6605bb1eb82dea87350066ac5e2Bill Wendling } 8889cac4942b920d4c5514e71949e3062ed626bfbdfMichael J. Spencer 889bbae8b40cd37d5b2815f8450cb588a41da89d7e5Chris Lattner return ABIArgInfo::getDirect(); 890bbae8b40cd37d5b2815f8450cb588a41da89d7e5Chris Lattner } 8919cac4942b920d4c5514e71949e3062ed626bfbdfMichael J. Spencer 8929cac4942b920d4c5514e71949e3062ed626bfbdfMichael J. Spencer 893a3c109bbf6e198f463fbe204da4d25b40dab65c4Chris Lattner if (const EnumType *EnumTy = Ty->getAs<EnumType>()) 894a3c109bbf6e198f463fbe204da4d25b40dab65c4Chris Lattner Ty = EnumTy->getDecl()->getIntegerType(); 895aa74a1e49f7c4b89539830290f76fe2c3e97187fDouglas Gregor 896a3c109bbf6e198f463fbe204da4d25b40dab65c4Chris Lattner return (Ty->isPromotableIntegerType() ? 897a3c109bbf6e198f463fbe204da4d25b40dab65c4Chris Lattner ABIArgInfo::getExtend() : ABIArgInfo::getDirect()); 898c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov} 899c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 900aa9cf8d3abd8760d78b20e9194df169bbd8b0f01Rafael Espindolavoid X86_32ABIInfo::computeInfo(CGFunctionInfo &FI) const { 901aa9cf8d3abd8760d78b20e9194df169bbd8b0f01Rafael Espindola FI.getReturnInfo() = classifyReturnType(FI.getReturnType(), 902aa9cf8d3abd8760d78b20e9194df169bbd8b0f01Rafael Espindola FI.getCallingConvention()); 903b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola 904b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola unsigned FreeRegs = FI.getHasRegParm() ? FI.getRegParm() : 905b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola DefaultNumRegisterParameters; 906b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola 907b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola // If the return value is indirect, then the hidden argument is consuming one 908b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola // integer register. 909b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola if (FI.getReturnInfo().isIndirect() && FreeRegs) { 910b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola --FreeRegs; 911b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola ABIArgInfo &Old = FI.getReturnInfo(); 912b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola Old = ABIArgInfo::getIndirectInReg(Old.getIndirectAlign(), 913b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola Old.getIndirectByVal(), 914b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola Old.getIndirectRealign()); 915b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola } 916b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola 917aa9cf8d3abd8760d78b20e9194df169bbd8b0f01Rafael Espindola for (CGFunctionInfo::arg_iterator it = FI.arg_begin(), ie = FI.arg_end(); 918aa9cf8d3abd8760d78b20e9194df169bbd8b0f01Rafael Espindola it != ie; ++it) 919b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola it->info = classifyArgumentTypeWithReg(it->type, FreeRegs); 920aa9cf8d3abd8760d78b20e9194df169bbd8b0f01Rafael Espindola} 921aa9cf8d3abd8760d78b20e9194df169bbd8b0f01Rafael Espindola 922c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikovllvm::Value *X86_32ABIInfo::EmitVAArg(llvm::Value *VAListAddr, QualType Ty, 923c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov CodeGenFunction &CGF) const { 9248b418685e9e4f02f4eb2a76e1ec063e07552b68dChris Lattner llvm::Type *BPP = CGF.Int8PtrPtrTy; 925c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 926c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov CGBuilderTy &Builder = CGF.Builder; 927c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov llvm::Value *VAListAddrAsBPP = Builder.CreateBitCast(VAListAddr, BPP, 928c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov "ap"); 929c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov llvm::Value *Addr = Builder.CreateLoad(VAListAddrAsBPP, "ap.cur"); 9307b1fb81a512def2a20e2834b4598a7b3a740dc7fEli Friedman 9317b1fb81a512def2a20e2834b4598a7b3a740dc7fEli Friedman // Compute if the address needs to be aligned 9327b1fb81a512def2a20e2834b4598a7b3a740dc7fEli Friedman unsigned Align = CGF.getContext().getTypeAlignInChars(Ty).getQuantity(); 9337b1fb81a512def2a20e2834b4598a7b3a740dc7fEli Friedman Align = getTypeStackAlignInBytes(Ty, Align); 9347b1fb81a512def2a20e2834b4598a7b3a740dc7fEli Friedman Align = std::max(Align, 4U); 9357b1fb81a512def2a20e2834b4598a7b3a740dc7fEli Friedman if (Align > 4) { 9367b1fb81a512def2a20e2834b4598a7b3a740dc7fEli Friedman // addr = (addr + align - 1) & -align; 9377b1fb81a512def2a20e2834b4598a7b3a740dc7fEli Friedman llvm::Value *Offset = 9387b1fb81a512def2a20e2834b4598a7b3a740dc7fEli Friedman llvm::ConstantInt::get(CGF.Int32Ty, Align - 1); 9397b1fb81a512def2a20e2834b4598a7b3a740dc7fEli Friedman Addr = CGF.Builder.CreateGEP(Addr, Offset); 9407b1fb81a512def2a20e2834b4598a7b3a740dc7fEli Friedman llvm::Value *AsInt = CGF.Builder.CreatePtrToInt(Addr, 9417b1fb81a512def2a20e2834b4598a7b3a740dc7fEli Friedman CGF.Int32Ty); 9427b1fb81a512def2a20e2834b4598a7b3a740dc7fEli Friedman llvm::Value *Mask = llvm::ConstantInt::get(CGF.Int32Ty, -Align); 9437b1fb81a512def2a20e2834b4598a7b3a740dc7fEli Friedman Addr = CGF.Builder.CreateIntToPtr(CGF.Builder.CreateAnd(AsInt, Mask), 9447b1fb81a512def2a20e2834b4598a7b3a740dc7fEli Friedman Addr->getType(), 9457b1fb81a512def2a20e2834b4598a7b3a740dc7fEli Friedman "ap.cur.aligned"); 9467b1fb81a512def2a20e2834b4598a7b3a740dc7fEli Friedman } 9477b1fb81a512def2a20e2834b4598a7b3a740dc7fEli Friedman 948c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov llvm::Type *PTy = 94996e0fc726c6fe7538522c60743705d5e696b40afOwen Anderson llvm::PointerType::getUnqual(CGF.ConvertType(Ty)); 950c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov llvm::Value *AddrTyped = Builder.CreateBitCast(Addr, PTy); 951c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 952c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov uint64_t Offset = 9537b1fb81a512def2a20e2834b4598a7b3a740dc7fEli Friedman llvm::RoundUpToAlignment(CGF.getContext().getTypeSize(Ty) / 8, Align); 954c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov llvm::Value *NextAddr = 95577b89b87c3b9220fea1bc80f6d6598d2003cc8a8Chris Lattner Builder.CreateGEP(Addr, llvm::ConstantInt::get(CGF.Int32Ty, Offset), 956c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov "ap.next"); 957c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov Builder.CreateStore(NextAddr, VAListAddrAsBPP); 958c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 959c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov return AddrTyped; 960c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov} 961c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 96274f7293eb30bf77355c20a3c2cad7b67d8ce7388Charles Davisvoid X86_32TargetCodeGenInfo::SetTargetAttributes(const Decl *D, 96374f7293eb30bf77355c20a3c2cad7b67d8ce7388Charles Davis llvm::GlobalValue *GV, 96474f7293eb30bf77355c20a3c2cad7b67d8ce7388Charles Davis CodeGen::CodeGenModule &CGM) const { 96574f7293eb30bf77355c20a3c2cad7b67d8ce7388Charles Davis if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(D)) { 96674f7293eb30bf77355c20a3c2cad7b67d8ce7388Charles Davis if (FD->hasAttr<X86ForceAlignArgPointerAttr>()) { 96774f7293eb30bf77355c20a3c2cad7b67d8ce7388Charles Davis // Get the LLVM function. 96874f7293eb30bf77355c20a3c2cad7b67d8ce7388Charles Davis llvm::Function *Fn = cast<llvm::Function>(GV); 96974f7293eb30bf77355c20a3c2cad7b67d8ce7388Charles Davis 97074f7293eb30bf77355c20a3c2cad7b67d8ce7388Charles Davis // Now add the 'alignstack' attribute with a value of 16. 971db9eeb88d8e63a28f0b7d623011ec286a84f68a3Bill Wendling Fn->addFnAttr(llvm::Attributes::constructStackAlignmentFromInt(16)); 97274f7293eb30bf77355c20a3c2cad7b67d8ce7388Charles Davis } 97374f7293eb30bf77355c20a3c2cad7b67d8ce7388Charles Davis } 97474f7293eb30bf77355c20a3c2cad7b67d8ce7388Charles Davis} 97574f7293eb30bf77355c20a3c2cad7b67d8ce7388Charles Davis 9766374c3307e2d73348f7b8cc73eeeb0998ad0ac94John McCallbool X86_32TargetCodeGenInfo::initDwarfEHRegSizeTable( 9776374c3307e2d73348f7b8cc73eeeb0998ad0ac94John McCall CodeGen::CodeGenFunction &CGF, 9786374c3307e2d73348f7b8cc73eeeb0998ad0ac94John McCall llvm::Value *Address) const { 9796374c3307e2d73348f7b8cc73eeeb0998ad0ac94John McCall CodeGen::CGBuilderTy &Builder = CGF.Builder; 9806374c3307e2d73348f7b8cc73eeeb0998ad0ac94John McCall 9818b418685e9e4f02f4eb2a76e1ec063e07552b68dChris Lattner llvm::Value *Four8 = llvm::ConstantInt::get(CGF.Int8Ty, 4); 9828bea82f6699e4384ef823cdc8800ad5db271177cMichael J. Spencer 9836374c3307e2d73348f7b8cc73eeeb0998ad0ac94John McCall // 0-7 are the eight integer registers; the order is different 9846374c3307e2d73348f7b8cc73eeeb0998ad0ac94John McCall // on Darwin (for EH), but the range is the same. 9856374c3307e2d73348f7b8cc73eeeb0998ad0ac94John McCall // 8 is %eip. 986aeeb7011a875d3dd439e9fa07dc3ac54d97785b9John McCall AssignToArrayRange(Builder, Address, Four8, 0, 8); 9876374c3307e2d73348f7b8cc73eeeb0998ad0ac94John McCall 9886374c3307e2d73348f7b8cc73eeeb0998ad0ac94John McCall if (CGF.CGM.isTargetDarwin()) { 9896374c3307e2d73348f7b8cc73eeeb0998ad0ac94John McCall // 12-16 are st(0..4). Not sure why we stop at 4. 9906374c3307e2d73348f7b8cc73eeeb0998ad0ac94John McCall // These have size 16, which is sizeof(long double) on 9916374c3307e2d73348f7b8cc73eeeb0998ad0ac94John McCall // platforms with 8-byte alignment for that type. 9928b418685e9e4f02f4eb2a76e1ec063e07552b68dChris Lattner llvm::Value *Sixteen8 = llvm::ConstantInt::get(CGF.Int8Ty, 16); 993aeeb7011a875d3dd439e9fa07dc3ac54d97785b9John McCall AssignToArrayRange(Builder, Address, Sixteen8, 12, 16); 9948bea82f6699e4384ef823cdc8800ad5db271177cMichael J. Spencer 9956374c3307e2d73348f7b8cc73eeeb0998ad0ac94John McCall } else { 9966374c3307e2d73348f7b8cc73eeeb0998ad0ac94John McCall // 9 is %eflags, which doesn't get a size on Darwin for some 9976374c3307e2d73348f7b8cc73eeeb0998ad0ac94John McCall // reason. 9986374c3307e2d73348f7b8cc73eeeb0998ad0ac94John McCall Builder.CreateStore(Four8, Builder.CreateConstInBoundsGEP1_32(Address, 9)); 9996374c3307e2d73348f7b8cc73eeeb0998ad0ac94John McCall 10006374c3307e2d73348f7b8cc73eeeb0998ad0ac94John McCall // 11-16 are st(0..5). Not sure why we stop at 5. 10016374c3307e2d73348f7b8cc73eeeb0998ad0ac94John McCall // These have size 12, which is sizeof(long double) on 10026374c3307e2d73348f7b8cc73eeeb0998ad0ac94John McCall // platforms with 4-byte alignment for that type. 10038b418685e9e4f02f4eb2a76e1ec063e07552b68dChris Lattner llvm::Value *Twelve8 = llvm::ConstantInt::get(CGF.Int8Ty, 12); 1004aeeb7011a875d3dd439e9fa07dc3ac54d97785b9John McCall AssignToArrayRange(Builder, Address, Twelve8, 11, 16); 1005aeeb7011a875d3dd439e9fa07dc3ac54d97785b9John McCall } 10066374c3307e2d73348f7b8cc73eeeb0998ad0ac94John McCall 10076374c3307e2d73348f7b8cc73eeeb0998ad0ac94John McCall return false; 10086374c3307e2d73348f7b8cc73eeeb0998ad0ac94John McCall} 10096374c3307e2d73348f7b8cc73eeeb0998ad0ac94John McCall 1010dce5ad0cf70ba74e1ecdbb5e81f1a81d97821636Chris Lattner//===----------------------------------------------------------------------===// 1011dce5ad0cf70ba74e1ecdbb5e81f1a81d97821636Chris Lattner// X86-64 ABI Implementation 1012dce5ad0cf70ba74e1ecdbb5e81f1a81d97821636Chris Lattner//===----------------------------------------------------------------------===// 1013dce5ad0cf70ba74e1ecdbb5e81f1a81d97821636Chris Lattner 1014dce5ad0cf70ba74e1ecdbb5e81f1a81d97821636Chris Lattner 1015c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikovnamespace { 1016c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov/// X86_64ABIInfo - The X86_64 ABI information. 1017c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikovclass X86_64ABIInfo : public ABIInfo { 1018c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov enum Class { 1019c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov Integer = 0, 1020c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov SSE, 1021c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov SSEUp, 1022c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov X87, 1023c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov X87Up, 1024c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov ComplexX87, 1025c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov NoClass, 1026c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov Memory 1027c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov }; 1028c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 1029c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov /// merge - Implement the X86_64 ABI merging algorithm. 1030c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov /// 1031c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov /// Merge an accumulating classification \arg Accum with a field 1032c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov /// classification \arg Field. 1033c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov /// 1034c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov /// \param Accum - The accumulating classification. This should 1035c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov /// always be either NoClass or the result of a previous merge 1036c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov /// call. In addition, this should never be Memory (the caller 1037c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov /// should just return Memory for the aggregate). 10381090a9ba0902380dbd97d0a500daa4c373712df9Chris Lattner static Class merge(Class Accum, Class Field); 1039c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 10404943c15df59fdec444656a48c16e72a2077ab61fBruno Cardoso Lopes /// postMerge - Implement the X86_64 ABI post merging algorithm. 10414943c15df59fdec444656a48c16e72a2077ab61fBruno Cardoso Lopes /// 10424943c15df59fdec444656a48c16e72a2077ab61fBruno Cardoso Lopes /// Post merger cleanup, reduces a malformed Hi and Lo pair to 10434943c15df59fdec444656a48c16e72a2077ab61fBruno Cardoso Lopes /// final MEMORY or SSE classes when necessary. 10444943c15df59fdec444656a48c16e72a2077ab61fBruno Cardoso Lopes /// 10454943c15df59fdec444656a48c16e72a2077ab61fBruno Cardoso Lopes /// \param AggregateSize - The size of the current aggregate in 10464943c15df59fdec444656a48c16e72a2077ab61fBruno Cardoso Lopes /// the classification process. 10474943c15df59fdec444656a48c16e72a2077ab61fBruno Cardoso Lopes /// 10484943c15df59fdec444656a48c16e72a2077ab61fBruno Cardoso Lopes /// \param Lo - The classification for the parts of the type 10494943c15df59fdec444656a48c16e72a2077ab61fBruno Cardoso Lopes /// residing in the low word of the containing object. 10504943c15df59fdec444656a48c16e72a2077ab61fBruno Cardoso Lopes /// 10514943c15df59fdec444656a48c16e72a2077ab61fBruno Cardoso Lopes /// \param Hi - The classification for the parts of the type 10524943c15df59fdec444656a48c16e72a2077ab61fBruno Cardoso Lopes /// residing in the higher words of the containing object. 10534943c15df59fdec444656a48c16e72a2077ab61fBruno Cardoso Lopes /// 10544943c15df59fdec444656a48c16e72a2077ab61fBruno Cardoso Lopes void postMerge(unsigned AggregateSize, Class &Lo, Class &Hi) const; 10554943c15df59fdec444656a48c16e72a2077ab61fBruno Cardoso Lopes 1056c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov /// classify - Determine the x86_64 register classes in which the 1057c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov /// given type T should be passed. 1058c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov /// 1059c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov /// \param Lo - The classification for the parts of the type 1060c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov /// residing in the low word of the containing object. 1061c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov /// 1062c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov /// \param Hi - The classification for the parts of the type 1063c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov /// residing in the high word of the containing object. 1064c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov /// 1065c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov /// \param OffsetBase - The bit offset of this type in the 1066c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov /// containing object. Some parameters are classified different 1067c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov /// depending on whether they straddle an eightbyte boundary. 1068c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov /// 1069c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov /// If a word is unused its result will be NoClass; if a type should 1070c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov /// be passed in Memory then at least the classification of \arg Lo 1071c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov /// will be Memory. 1072c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov /// 1073f3477c13eeaf11b32a41f181398fb5deffd0dd73Sylvestre Ledru /// The \arg Lo class will be NoClass iff the argument is ignored. 1074c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov /// 1075c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov /// If the \arg Lo class is ComplexX87, then the \arg Hi class will 1076c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov /// also be ComplexX87. 10779c254f0415bef9a0bafe5b5026ddb54b727597b1Chris Lattner void classify(QualType T, uint64_t OffsetBase, Class &Lo, Class &Hi) const; 1078c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 10794943c15df59fdec444656a48c16e72a2077ab61fBruno Cardoso Lopes llvm::Type *GetByteVectorType(QualType Ty) const; 10809cbe4f0ba01ec304e1e3d071c071f7bca33631c0Chris Lattner llvm::Type *GetSSETypeAtOffset(llvm::Type *IRType, 10819cbe4f0ba01ec304e1e3d071c071f7bca33631c0Chris Lattner unsigned IROffset, QualType SourceTy, 10829cbe4f0ba01ec304e1e3d071c071f7bca33631c0Chris Lattner unsigned SourceOffset) const; 10839cbe4f0ba01ec304e1e3d071c071f7bca33631c0Chris Lattner llvm::Type *GetINTEGERTypeAtOffset(llvm::Type *IRType, 10849cbe4f0ba01ec304e1e3d071c071f7bca33631c0Chris Lattner unsigned IROffset, QualType SourceTy, 10859cbe4f0ba01ec304e1e3d071c071f7bca33631c0Chris Lattner unsigned SourceOffset) const; 10868bea82f6699e4384ef823cdc8800ad5db271177cMichael J. Spencer 1087c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov /// getIndirectResult - Give a source type \arg Ty, return a suitable result 108846c54fb8ec45765a475b7b709b9aee7f94c490c2Daniel Dunbar /// such that the argument will be returned in memory. 10899c254f0415bef9a0bafe5b5026ddb54b727597b1Chris Lattner ABIArgInfo getIndirectReturnResult(QualType Ty) const; 109046c54fb8ec45765a475b7b709b9aee7f94c490c2Daniel Dunbar 109146c54fb8ec45765a475b7b709b9aee7f94c490c2Daniel Dunbar /// getIndirectResult - Give a source type \arg Ty, return a suitable result 1092c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov /// such that the argument will be passed in memory. 1093edfac0302490d84419eb958c812c533b8df29785Daniel Dunbar /// 1094edfac0302490d84419eb958c812c533b8df29785Daniel Dunbar /// \param freeIntRegs - The number of free integer registers remaining 1095edfac0302490d84419eb958c812c533b8df29785Daniel Dunbar /// available. 1096edfac0302490d84419eb958c812c533b8df29785Daniel Dunbar ABIArgInfo getIndirectResult(QualType Ty, unsigned freeIntRegs) const; 1097c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 1098a3c109bbf6e198f463fbe204da4d25b40dab65c4Chris Lattner ABIArgInfo classifyReturnType(QualType RetTy) const; 1099c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 1100bb465d7d0489a6605bb1eb82dea87350066ac5e2Bill Wendling ABIArgInfo classifyArgumentType(QualType Ty, 1101edfac0302490d84419eb958c812c533b8df29785Daniel Dunbar unsigned freeIntRegs, 1102bb465d7d0489a6605bb1eb82dea87350066ac5e2Bill Wendling unsigned &neededInt, 110399aaae87ae972ac2dd4cccd8b4886537aabaff43Bill Wendling unsigned &neededSSE) const; 1104c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 1105ee1ad99f1ced9ffee436466ef674d4541c37864eEli Friedman bool IsIllegalVectorType(QualType Ty) const; 1106ee1ad99f1ced9ffee436466ef674d4541c37864eEli Friedman 110767a5773ba529aebcad03fa5e7cc95555d133e93dJohn McCall /// The 0.98 ABI revision clarified a lot of ambiguities, 110867a5773ba529aebcad03fa5e7cc95555d133e93dJohn McCall /// unfortunately in ways that were not always consistent with 110967a5773ba529aebcad03fa5e7cc95555d133e93dJohn McCall /// certain previous compilers. In particular, platforms which 111067a5773ba529aebcad03fa5e7cc95555d133e93dJohn McCall /// required strict binary compatibility with older versions of GCC 111167a5773ba529aebcad03fa5e7cc95555d133e93dJohn McCall /// may need to exempt themselves. 111267a5773ba529aebcad03fa5e7cc95555d133e93dJohn McCall bool honorsRevision0_98() const { 1113bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor return !getContext().getTargetInfo().getTriple().isOSDarwin(); 111467a5773ba529aebcad03fa5e7cc95555d133e93dJohn McCall } 111567a5773ba529aebcad03fa5e7cc95555d133e93dJohn McCall 1116ee1ad99f1ced9ffee436466ef674d4541c37864eEli Friedman bool HasAVX; 1117ee1ad99f1ced9ffee436466ef674d4541c37864eEli Friedman 1118c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikovpublic: 1119ee1ad99f1ced9ffee436466ef674d4541c37864eEli Friedman X86_64ABIInfo(CodeGen::CodeGenTypes &CGT, bool hasavx) : 1120ee1ad99f1ced9ffee436466ef674d4541c37864eEli Friedman ABIInfo(CGT), HasAVX(hasavx) {} 11219c254f0415bef9a0bafe5b5026ddb54b727597b1Chris Lattner 1122de5d3c717684f3821b8db58037bc7140acf134aaJohn McCall bool isPassedUsingAVXType(QualType type) const { 1123de5d3c717684f3821b8db58037bc7140acf134aaJohn McCall unsigned neededInt, neededSSE; 1124edfac0302490d84419eb958c812c533b8df29785Daniel Dunbar // The freeIntRegs argument doesn't matter here. 1125edfac0302490d84419eb958c812c533b8df29785Daniel Dunbar ABIArgInfo info = classifyArgumentType(type, 0, neededInt, neededSSE); 1126de5d3c717684f3821b8db58037bc7140acf134aaJohn McCall if (info.isDirect()) { 1127de5d3c717684f3821b8db58037bc7140acf134aaJohn McCall llvm::Type *ty = info.getCoerceToType(); 1128de5d3c717684f3821b8db58037bc7140acf134aaJohn McCall if (llvm::VectorType *vectorTy = dyn_cast_or_null<llvm::VectorType>(ty)) 1129de5d3c717684f3821b8db58037bc7140acf134aaJohn McCall return (vectorTy->getBitWidth() > 128); 1130de5d3c717684f3821b8db58037bc7140acf134aaJohn McCall } 1131de5d3c717684f3821b8db58037bc7140acf134aaJohn McCall return false; 1132de5d3c717684f3821b8db58037bc7140acf134aaJohn McCall } 1133de5d3c717684f3821b8db58037bc7140acf134aaJohn McCall 1134ee5dcd064a811edc90f6c1fb31a837b6c961fed7Chris Lattner virtual void computeInfo(CGFunctionInfo &FI) const; 1135c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 1136c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov virtual llvm::Value *EmitVAArg(llvm::Value *VAListAddr, QualType Ty, 1137c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov CodeGenFunction &CGF) const; 1138c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov}; 113982d0a418c8699fc6f4a9417457ffe93d43bba1c1Anton Korobeynikov 1140f13721dd91dda7675e499331a2770308ad20ca61Chris Lattner/// WinX86_64ABIInfo - The Windows X86_64 ABI information. 1141a75732201b19059a0e56a88b0eb5a0e5dd3c6ca3NAKAMURA Takumiclass WinX86_64ABIInfo : public ABIInfo { 1142a75732201b19059a0e56a88b0eb5a0e5dd3c6ca3NAKAMURA Takumi 1143a75732201b19059a0e56a88b0eb5a0e5dd3c6ca3NAKAMURA Takumi ABIArgInfo classify(QualType Ty) const; 1144a75732201b19059a0e56a88b0eb5a0e5dd3c6ca3NAKAMURA Takumi 1145f13721dd91dda7675e499331a2770308ad20ca61Chris Lattnerpublic: 1146a75732201b19059a0e56a88b0eb5a0e5dd3c6ca3NAKAMURA Takumi WinX86_64ABIInfo(CodeGen::CodeGenTypes &CGT) : ABIInfo(CGT) {} 1147a75732201b19059a0e56a88b0eb5a0e5dd3c6ca3NAKAMURA Takumi 1148a75732201b19059a0e56a88b0eb5a0e5dd3c6ca3NAKAMURA Takumi virtual void computeInfo(CGFunctionInfo &FI) const; 1149f13721dd91dda7675e499331a2770308ad20ca61Chris Lattner 1150f13721dd91dda7675e499331a2770308ad20ca61Chris Lattner virtual llvm::Value *EmitVAArg(llvm::Value *VAListAddr, QualType Ty, 1151f13721dd91dda7675e499331a2770308ad20ca61Chris Lattner CodeGenFunction &CGF) const; 1152f13721dd91dda7675e499331a2770308ad20ca61Chris Lattner}; 1153f13721dd91dda7675e499331a2770308ad20ca61Chris Lattner 115482d0a418c8699fc6f4a9417457ffe93d43bba1c1Anton Korobeynikovclass X86_64TargetCodeGenInfo : public TargetCodeGenInfo { 115582d0a418c8699fc6f4a9417457ffe93d43bba1c1Anton Korobeynikovpublic: 1156ee1ad99f1ced9ffee436466ef674d4541c37864eEli Friedman X86_64TargetCodeGenInfo(CodeGen::CodeGenTypes &CGT, bool HasAVX) 1157ee1ad99f1ced9ffee436466ef674d4541c37864eEli Friedman : TargetCodeGenInfo(new X86_64ABIInfo(CGT, HasAVX)) {} 11586374c3307e2d73348f7b8cc73eeeb0998ad0ac94John McCall 1159de5d3c717684f3821b8db58037bc7140acf134aaJohn McCall const X86_64ABIInfo &getABIInfo() const { 1160de5d3c717684f3821b8db58037bc7140acf134aaJohn McCall return static_cast<const X86_64ABIInfo&>(TargetCodeGenInfo::getABIInfo()); 1161de5d3c717684f3821b8db58037bc7140acf134aaJohn McCall } 1162de5d3c717684f3821b8db58037bc7140acf134aaJohn McCall 11636374c3307e2d73348f7b8cc73eeeb0998ad0ac94John McCall int getDwarfEHStackPointer(CodeGen::CodeGenModule &CGM) const { 11646374c3307e2d73348f7b8cc73eeeb0998ad0ac94John McCall return 7; 11656374c3307e2d73348f7b8cc73eeeb0998ad0ac94John McCall } 11666374c3307e2d73348f7b8cc73eeeb0998ad0ac94John McCall 11676374c3307e2d73348f7b8cc73eeeb0998ad0ac94John McCall bool initDwarfEHRegSizeTable(CodeGen::CodeGenFunction &CGF, 11686374c3307e2d73348f7b8cc73eeeb0998ad0ac94John McCall llvm::Value *Address) const { 11698b418685e9e4f02f4eb2a76e1ec063e07552b68dChris Lattner llvm::Value *Eight8 = llvm::ConstantInt::get(CGF.Int8Ty, 8); 11708bea82f6699e4384ef823cdc8800ad5db271177cMichael J. Spencer 1171aeeb7011a875d3dd439e9fa07dc3ac54d97785b9John McCall // 0-15 are the 16 integer registers. 1172aeeb7011a875d3dd439e9fa07dc3ac54d97785b9John McCall // 16 is %rip. 11738b418685e9e4f02f4eb2a76e1ec063e07552b68dChris Lattner AssignToArrayRange(CGF.Builder, Address, Eight8, 0, 16); 11746374c3307e2d73348f7b8cc73eeeb0998ad0ac94John McCall return false; 11756374c3307e2d73348f7b8cc73eeeb0998ad0ac94John McCall } 11764b93d660c6326ec79b5e369317d1051cf826c2f3Peter Collingbourne 1177ef6de3da8572607f786303c07150daa6e140ab19Jay Foad llvm::Type* adjustInlineAsmType(CodeGen::CodeGenFunction &CGF, 11785f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner StringRef Constraint, 1179ef6de3da8572607f786303c07150daa6e140ab19Jay Foad llvm::Type* Ty) const { 11804b93d660c6326ec79b5e369317d1051cf826c2f3Peter Collingbourne return X86AdjustInlineAsmType(CGF, Constraint, Ty); 11814b93d660c6326ec79b5e369317d1051cf826c2f3Peter Collingbourne } 11824b93d660c6326ec79b5e369317d1051cf826c2f3Peter Collingbourne 1183de5d3c717684f3821b8db58037bc7140acf134aaJohn McCall bool isNoProtoCallVariadic(const CallArgList &args, 1184de5d3c717684f3821b8db58037bc7140acf134aaJohn McCall const FunctionNoProtoType *fnType) const { 118501f151e0ffba72bcad770bea5f563a9b68ca050eJohn McCall // The default CC on x86-64 sets %al to the number of SSA 118601f151e0ffba72bcad770bea5f563a9b68ca050eJohn McCall // registers used, and GCC sets this when calling an unprototyped 11873ed7903d27f0e7e0cd3a61c165d39eca70f3cff5Eli Friedman // function, so we override the default behavior. However, don't do 118868805fef77978e69a14584148a3c6a4239e34171Eli Friedman // that when AVX types are involved: the ABI explicitly states it is 118968805fef77978e69a14584148a3c6a4239e34171Eli Friedman // undefined, and it doesn't work in practice because of how the ABI 119068805fef77978e69a14584148a3c6a4239e34171Eli Friedman // defines varargs anyway. 1191de5d3c717684f3821b8db58037bc7140acf134aaJohn McCall if (fnType->getCallConv() == CC_Default || fnType->getCallConv() == CC_C) { 11923ed7903d27f0e7e0cd3a61c165d39eca70f3cff5Eli Friedman bool HasAVXType = false; 1193de5d3c717684f3821b8db58037bc7140acf134aaJohn McCall for (CallArgList::const_iterator 1194de5d3c717684f3821b8db58037bc7140acf134aaJohn McCall it = args.begin(), ie = args.end(); it != ie; ++it) { 1195de5d3c717684f3821b8db58037bc7140acf134aaJohn McCall if (getABIInfo().isPassedUsingAVXType(it->Ty)) { 1196de5d3c717684f3821b8db58037bc7140acf134aaJohn McCall HasAVXType = true; 1197de5d3c717684f3821b8db58037bc7140acf134aaJohn McCall break; 11983ed7903d27f0e7e0cd3a61c165d39eca70f3cff5Eli Friedman } 11993ed7903d27f0e7e0cd3a61c165d39eca70f3cff5Eli Friedman } 1200de5d3c717684f3821b8db58037bc7140acf134aaJohn McCall 12013ed7903d27f0e7e0cd3a61c165d39eca70f3cff5Eli Friedman if (!HasAVXType) 12023ed7903d27f0e7e0cd3a61c165d39eca70f3cff5Eli Friedman return true; 12033ed7903d27f0e7e0cd3a61c165d39eca70f3cff5Eli Friedman } 120401f151e0ffba72bcad770bea5f563a9b68ca050eJohn McCall 1205de5d3c717684f3821b8db58037bc7140acf134aaJohn McCall return TargetCodeGenInfo::isNoProtoCallVariadic(args, fnType); 120601f151e0ffba72bcad770bea5f563a9b68ca050eJohn McCall } 120701f151e0ffba72bcad770bea5f563a9b68ca050eJohn McCall 120882d0a418c8699fc6f4a9417457ffe93d43bba1c1Anton Korobeynikov}; 120982d0a418c8699fc6f4a9417457ffe93d43bba1c1Anton Korobeynikov 1210f13721dd91dda7675e499331a2770308ad20ca61Chris Lattnerclass WinX86_64TargetCodeGenInfo : public TargetCodeGenInfo { 1211f13721dd91dda7675e499331a2770308ad20ca61Chris Lattnerpublic: 1212f13721dd91dda7675e499331a2770308ad20ca61Chris Lattner WinX86_64TargetCodeGenInfo(CodeGen::CodeGenTypes &CGT) 1213f13721dd91dda7675e499331a2770308ad20ca61Chris Lattner : TargetCodeGenInfo(new WinX86_64ABIInfo(CGT)) {} 1214f13721dd91dda7675e499331a2770308ad20ca61Chris Lattner 1215f13721dd91dda7675e499331a2770308ad20ca61Chris Lattner int getDwarfEHStackPointer(CodeGen::CodeGenModule &CGM) const { 1216f13721dd91dda7675e499331a2770308ad20ca61Chris Lattner return 7; 1217f13721dd91dda7675e499331a2770308ad20ca61Chris Lattner } 1218f13721dd91dda7675e499331a2770308ad20ca61Chris Lattner 1219f13721dd91dda7675e499331a2770308ad20ca61Chris Lattner bool initDwarfEHRegSizeTable(CodeGen::CodeGenFunction &CGF, 1220f13721dd91dda7675e499331a2770308ad20ca61Chris Lattner llvm::Value *Address) const { 12218b418685e9e4f02f4eb2a76e1ec063e07552b68dChris Lattner llvm::Value *Eight8 = llvm::ConstantInt::get(CGF.Int8Ty, 8); 12229cac4942b920d4c5514e71949e3062ed626bfbdfMichael J. Spencer 1223f13721dd91dda7675e499331a2770308ad20ca61Chris Lattner // 0-15 are the 16 integer registers. 1224f13721dd91dda7675e499331a2770308ad20ca61Chris Lattner // 16 is %rip. 12258b418685e9e4f02f4eb2a76e1ec063e07552b68dChris Lattner AssignToArrayRange(CGF.Builder, Address, Eight8, 0, 16); 1226f13721dd91dda7675e499331a2770308ad20ca61Chris Lattner return false; 1227f13721dd91dda7675e499331a2770308ad20ca61Chris Lattner } 1228f13721dd91dda7675e499331a2770308ad20ca61Chris Lattner}; 1229f13721dd91dda7675e499331a2770308ad20ca61Chris Lattner 1230c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov} 1231c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 12324943c15df59fdec444656a48c16e72a2077ab61fBruno Cardoso Lopesvoid X86_64ABIInfo::postMerge(unsigned AggregateSize, Class &Lo, 12334943c15df59fdec444656a48c16e72a2077ab61fBruno Cardoso Lopes Class &Hi) const { 12344943c15df59fdec444656a48c16e72a2077ab61fBruno Cardoso Lopes // AMD64-ABI 3.2.3p2: Rule 5. Then a post merger cleanup is done: 12354943c15df59fdec444656a48c16e72a2077ab61fBruno Cardoso Lopes // 12364943c15df59fdec444656a48c16e72a2077ab61fBruno Cardoso Lopes // (a) If one of the classes is Memory, the whole argument is passed in 12374943c15df59fdec444656a48c16e72a2077ab61fBruno Cardoso Lopes // memory. 12384943c15df59fdec444656a48c16e72a2077ab61fBruno Cardoso Lopes // 12394943c15df59fdec444656a48c16e72a2077ab61fBruno Cardoso Lopes // (b) If X87UP is not preceded by X87, the whole argument is passed in 12404943c15df59fdec444656a48c16e72a2077ab61fBruno Cardoso Lopes // memory. 12414943c15df59fdec444656a48c16e72a2077ab61fBruno Cardoso Lopes // 12424943c15df59fdec444656a48c16e72a2077ab61fBruno Cardoso Lopes // (c) If the size of the aggregate exceeds two eightbytes and the first 12434943c15df59fdec444656a48c16e72a2077ab61fBruno Cardoso Lopes // eightbyte isn't SSE or any other eightbyte isn't SSEUP, the whole 12444943c15df59fdec444656a48c16e72a2077ab61fBruno Cardoso Lopes // argument is passed in memory. NOTE: This is necessary to keep the 12454943c15df59fdec444656a48c16e72a2077ab61fBruno Cardoso Lopes // ABI working for processors that don't support the __m256 type. 12464943c15df59fdec444656a48c16e72a2077ab61fBruno Cardoso Lopes // 12474943c15df59fdec444656a48c16e72a2077ab61fBruno Cardoso Lopes // (d) If SSEUP is not preceded by SSE or SSEUP, it is converted to SSE. 12484943c15df59fdec444656a48c16e72a2077ab61fBruno Cardoso Lopes // 12494943c15df59fdec444656a48c16e72a2077ab61fBruno Cardoso Lopes // Some of these are enforced by the merging logic. Others can arise 12504943c15df59fdec444656a48c16e72a2077ab61fBruno Cardoso Lopes // only with unions; for example: 12514943c15df59fdec444656a48c16e72a2077ab61fBruno Cardoso Lopes // union { _Complex double; unsigned; } 12524943c15df59fdec444656a48c16e72a2077ab61fBruno Cardoso Lopes // 12534943c15df59fdec444656a48c16e72a2077ab61fBruno Cardoso Lopes // Note that clauses (b) and (c) were added in 0.98. 12544943c15df59fdec444656a48c16e72a2077ab61fBruno Cardoso Lopes // 12554943c15df59fdec444656a48c16e72a2077ab61fBruno Cardoso Lopes if (Hi == Memory) 12564943c15df59fdec444656a48c16e72a2077ab61fBruno Cardoso Lopes Lo = Memory; 12574943c15df59fdec444656a48c16e72a2077ab61fBruno Cardoso Lopes if (Hi == X87Up && Lo != X87 && honorsRevision0_98()) 12584943c15df59fdec444656a48c16e72a2077ab61fBruno Cardoso Lopes Lo = Memory; 12594943c15df59fdec444656a48c16e72a2077ab61fBruno Cardoso Lopes if (AggregateSize > 128 && (Lo != SSE || Hi != SSEUp)) 12604943c15df59fdec444656a48c16e72a2077ab61fBruno Cardoso Lopes Lo = Memory; 12614943c15df59fdec444656a48c16e72a2077ab61fBruno Cardoso Lopes if (Hi == SSEUp && Lo != SSE) 12624943c15df59fdec444656a48c16e72a2077ab61fBruno Cardoso Lopes Hi = SSE; 12634943c15df59fdec444656a48c16e72a2077ab61fBruno Cardoso Lopes} 12644943c15df59fdec444656a48c16e72a2077ab61fBruno Cardoso Lopes 12651090a9ba0902380dbd97d0a500daa4c373712df9Chris LattnerX86_64ABIInfo::Class X86_64ABIInfo::merge(Class Accum, Class Field) { 1266c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // AMD64-ABI 3.2.3p2: Rule 4. Each field of an object is 1267c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // classified recursively so that always two fields are 1268c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // considered. The resulting class is calculated according to 1269c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // the classes of the fields in the eightbyte: 1270c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // 1271c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // (a) If both classes are equal, this is the resulting class. 1272c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // 1273c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // (b) If one of the classes is NO_CLASS, the resulting class is 1274c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // the other class. 1275c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // 1276c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // (c) If one of the classes is MEMORY, the result is the MEMORY 1277c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // class. 1278c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // 1279c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // (d) If one of the classes is INTEGER, the result is the 1280c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // INTEGER. 1281c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // 1282c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // (e) If one of the classes is X87, X87UP, COMPLEX_X87 class, 1283c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // MEMORY is used as class. 1284c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // 1285c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // (f) Otherwise class SSE is used. 1286c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 1287c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // Accum should never be memory (we should have returned) or 1288c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // ComplexX87 (because this cannot be passed in a structure). 1289c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov assert((Accum != Memory && Accum != ComplexX87) && 1290c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov "Invalid accumulated classification during merge."); 1291c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov if (Accum == Field || Field == NoClass) 1292c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov return Accum; 12931090a9ba0902380dbd97d0a500daa4c373712df9Chris Lattner if (Field == Memory) 1294c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov return Memory; 12951090a9ba0902380dbd97d0a500daa4c373712df9Chris Lattner if (Accum == NoClass) 1296c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov return Field; 12971090a9ba0902380dbd97d0a500daa4c373712df9Chris Lattner if (Accum == Integer || Field == Integer) 1298c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov return Integer; 12991090a9ba0902380dbd97d0a500daa4c373712df9Chris Lattner if (Field == X87 || Field == X87Up || Field == ComplexX87 || 13001090a9ba0902380dbd97d0a500daa4c373712df9Chris Lattner Accum == X87 || Accum == X87Up) 1301c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov return Memory; 13021090a9ba0902380dbd97d0a500daa4c373712df9Chris Lattner return SSE; 1303c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov} 1304c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 1305bcaedaed309ce453a992fdeef4a4c908cc7d9dfbChris Lattnervoid X86_64ABIInfo::classify(QualType Ty, uint64_t OffsetBase, 1306c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov Class &Lo, Class &Hi) const { 1307c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // FIXME: This code can be simplified by introducing a simple value class for 1308c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // Class pairs with appropriate constructor methods for the various 1309c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // situations. 1310c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 1311c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // FIXME: Some of the split computations are wrong; unaligned vectors 1312c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // shouldn't be passed in registers for example, so there is no chance they 1313c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // can straddle an eightbyte. Verify & simplify. 1314c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 1315c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov Lo = Hi = NoClass; 1316c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 1317c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov Class &Current = OffsetBase < 64 ? Lo : Hi; 1318c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov Current = Memory; 1319c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 1320183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall if (const BuiltinType *BT = Ty->getAs<BuiltinType>()) { 1321c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov BuiltinType::Kind k = BT->getKind(); 1322c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 1323c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov if (k == BuiltinType::Void) { 1324c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov Current = NoClass; 1325c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov } else if (k == BuiltinType::Int128 || k == BuiltinType::UInt128) { 1326c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov Lo = Integer; 1327c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov Hi = Integer; 1328c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov } else if (k >= BuiltinType::Bool && k <= BuiltinType::LongLong) { 1329c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov Current = Integer; 1330c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov } else if (k == BuiltinType::Float || k == BuiltinType::Double) { 1331c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov Current = SSE; 1332c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov } else if (k == BuiltinType::LongDouble) { 1333c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov Lo = X87; 1334c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov Hi = X87Up; 1335c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov } 1336c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // FIXME: _Decimal32 and _Decimal64 are SSE. 1337c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // FIXME: _float128 and _Decimal128 are (SSE, SSEUp). 13381090a9ba0902380dbd97d0a500daa4c373712df9Chris Lattner return; 13391090a9ba0902380dbd97d0a500daa4c373712df9Chris Lattner } 13408bea82f6699e4384ef823cdc8800ad5db271177cMichael J. Spencer 13411090a9ba0902380dbd97d0a500daa4c373712df9Chris Lattner if (const EnumType *ET = Ty->getAs<EnumType>()) { 1342c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // Classify the underlying integer type. 13439c254f0415bef9a0bafe5b5026ddb54b727597b1Chris Lattner classify(ET->getDecl()->getIntegerType(), OffsetBase, Lo, Hi); 13441090a9ba0902380dbd97d0a500daa4c373712df9Chris Lattner return; 13451090a9ba0902380dbd97d0a500daa4c373712df9Chris Lattner } 13468bea82f6699e4384ef823cdc8800ad5db271177cMichael J. Spencer 13471090a9ba0902380dbd97d0a500daa4c373712df9Chris Lattner if (Ty->hasPointerRepresentation()) { 1348c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov Current = Integer; 13491090a9ba0902380dbd97d0a500daa4c373712df9Chris Lattner return; 13501090a9ba0902380dbd97d0a500daa4c373712df9Chris Lattner } 13518bea82f6699e4384ef823cdc8800ad5db271177cMichael J. Spencer 13521090a9ba0902380dbd97d0a500daa4c373712df9Chris Lattner if (Ty->isMemberPointerType()) { 135367d438d39a1cc37c372a2684dc354f58d0169bb1Daniel Dunbar if (Ty->isMemberFunctionPointerType()) 135467d438d39a1cc37c372a2684dc354f58d0169bb1Daniel Dunbar Lo = Hi = Integer; 135567d438d39a1cc37c372a2684dc354f58d0169bb1Daniel Dunbar else 135667d438d39a1cc37c372a2684dc354f58d0169bb1Daniel Dunbar Current = Integer; 13571090a9ba0902380dbd97d0a500daa4c373712df9Chris Lattner return; 13581090a9ba0902380dbd97d0a500daa4c373712df9Chris Lattner } 13598bea82f6699e4384ef823cdc8800ad5db271177cMichael J. Spencer 13601090a9ba0902380dbd97d0a500daa4c373712df9Chris Lattner if (const VectorType *VT = Ty->getAs<VectorType>()) { 1361ea0443212e7ec6ff82e2f174e8e948a6eb0e0876Chris Lattner uint64_t Size = getContext().getTypeSize(VT); 1362c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov if (Size == 32) { 1363c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // gcc passes all <4 x char>, <2 x short>, <1 x int>, <1 x 1364c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // float> as integer. 1365c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov Current = Integer; 1366c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 1367c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // If this type crosses an eightbyte boundary, it should be 1368c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // split. 1369c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov uint64_t EB_Real = (OffsetBase) / 64; 1370c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov uint64_t EB_Imag = (OffsetBase + Size - 1) / 64; 1371c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov if (EB_Real != EB_Imag) 1372c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov Hi = Lo; 1373c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov } else if (Size == 64) { 1374c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // gcc passes <1 x double> in memory. :( 1375c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov if (VT->getElementType()->isSpecificBuiltinType(BuiltinType::Double)) 1376c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov return; 1377c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 1378c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // gcc passes <1 x long long> as INTEGER. 1379473f8e723be93d84bd5fd15b094f4184802d4676Chris Lattner if (VT->getElementType()->isSpecificBuiltinType(BuiltinType::LongLong) || 13800fefa4175b0c9101564946f6a975ee9946c16d4bChris Lattner VT->getElementType()->isSpecificBuiltinType(BuiltinType::ULongLong) || 13810fefa4175b0c9101564946f6a975ee9946c16d4bChris Lattner VT->getElementType()->isSpecificBuiltinType(BuiltinType::Long) || 13820fefa4175b0c9101564946f6a975ee9946c16d4bChris Lattner VT->getElementType()->isSpecificBuiltinType(BuiltinType::ULong)) 1383c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov Current = Integer; 1384c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov else 1385c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov Current = SSE; 1386c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 1387c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // If this type crosses an eightbyte boundary, it should be 1388c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // split. 1389c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov if (OffsetBase && OffsetBase != 64) 1390c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov Hi = Lo; 1391ee1ad99f1ced9ffee436466ef674d4541c37864eEli Friedman } else if (Size == 128 || (HasAVX && Size == 256)) { 13924943c15df59fdec444656a48c16e72a2077ab61fBruno Cardoso Lopes // Arguments of 256-bits are split into four eightbyte chunks. The 13934943c15df59fdec444656a48c16e72a2077ab61fBruno Cardoso Lopes // least significant one belongs to class SSE and all the others to class 13944943c15df59fdec444656a48c16e72a2077ab61fBruno Cardoso Lopes // SSEUP. The original Lo and Hi design considers that types can't be 13954943c15df59fdec444656a48c16e72a2077ab61fBruno Cardoso Lopes // greater than 128-bits, so a 64-bit split in Hi and Lo makes sense. 13964943c15df59fdec444656a48c16e72a2077ab61fBruno Cardoso Lopes // This design isn't correct for 256-bits, but since there're no cases 13974943c15df59fdec444656a48c16e72a2077ab61fBruno Cardoso Lopes // where the upper parts would need to be inspected, avoid adding 13984943c15df59fdec444656a48c16e72a2077ab61fBruno Cardoso Lopes // complexity and just consider Hi to match the 64-256 part. 1399c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov Lo = SSE; 1400c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov Hi = SSEUp; 1401c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov } 14021090a9ba0902380dbd97d0a500daa4c373712df9Chris Lattner return; 14031090a9ba0902380dbd97d0a500daa4c373712df9Chris Lattner } 14048bea82f6699e4384ef823cdc8800ad5db271177cMichael J. Spencer 14051090a9ba0902380dbd97d0a500daa4c373712df9Chris Lattner if (const ComplexType *CT = Ty->getAs<ComplexType>()) { 1406ea0443212e7ec6ff82e2f174e8e948a6eb0e0876Chris Lattner QualType ET = getContext().getCanonicalType(CT->getElementType()); 1407c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 1408ea0443212e7ec6ff82e2f174e8e948a6eb0e0876Chris Lattner uint64_t Size = getContext().getTypeSize(Ty); 14092ade35e2cfd554e49d35a52047cea98a82787af9Douglas Gregor if (ET->isIntegralOrEnumerationType()) { 1410c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov if (Size <= 64) 1411c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov Current = Integer; 1412c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov else if (Size <= 128) 1413c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov Lo = Hi = Integer; 1414ea0443212e7ec6ff82e2f174e8e948a6eb0e0876Chris Lattner } else if (ET == getContext().FloatTy) 1415c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov Current = SSE; 1416ea0443212e7ec6ff82e2f174e8e948a6eb0e0876Chris Lattner else if (ET == getContext().DoubleTy) 1417c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov Lo = Hi = SSE; 1418ea0443212e7ec6ff82e2f174e8e948a6eb0e0876Chris Lattner else if (ET == getContext().LongDoubleTy) 1419c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov Current = ComplexX87; 1420c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 1421c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // If this complex type crosses an eightbyte boundary then it 1422c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // should be split. 1423c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov uint64_t EB_Real = (OffsetBase) / 64; 1424ea0443212e7ec6ff82e2f174e8e948a6eb0e0876Chris Lattner uint64_t EB_Imag = (OffsetBase + getContext().getTypeSize(ET)) / 64; 1425c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov if (Hi == NoClass && EB_Real != EB_Imag) 1426c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov Hi = Lo; 14278bea82f6699e4384ef823cdc8800ad5db271177cMichael J. Spencer 14281090a9ba0902380dbd97d0a500daa4c373712df9Chris Lattner return; 14291090a9ba0902380dbd97d0a500daa4c373712df9Chris Lattner } 14308bea82f6699e4384ef823cdc8800ad5db271177cMichael J. Spencer 1431ea0443212e7ec6ff82e2f174e8e948a6eb0e0876Chris Lattner if (const ConstantArrayType *AT = getContext().getAsConstantArrayType(Ty)) { 1432c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // Arrays are treated like structures. 1433c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 1434ea0443212e7ec6ff82e2f174e8e948a6eb0e0876Chris Lattner uint64_t Size = getContext().getTypeSize(Ty); 1435c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 1436c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // AMD64-ABI 3.2.3p2: Rule 1. If the size of an object is larger 14374943c15df59fdec444656a48c16e72a2077ab61fBruno Cardoso Lopes // than four eightbytes, ..., it has class MEMORY. 14384943c15df59fdec444656a48c16e72a2077ab61fBruno Cardoso Lopes if (Size > 256) 1439c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov return; 1440c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 1441c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // AMD64-ABI 3.2.3p2: Rule 1. If ..., or it contains unaligned 1442c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // fields, it has class MEMORY. 1443c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // 1444c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // Only need to check alignment of array base. 1445ea0443212e7ec6ff82e2f174e8e948a6eb0e0876Chris Lattner if (OffsetBase % getContext().getTypeAlign(AT->getElementType())) 1446c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov return; 1447c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 1448c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // Otherwise implement simplified merge. We could be smarter about 1449c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // this, but it isn't worth it and would be harder to verify. 1450c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov Current = NoClass; 1451ea0443212e7ec6ff82e2f174e8e948a6eb0e0876Chris Lattner uint64_t EltSize = getContext().getTypeSize(AT->getElementType()); 1452c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov uint64_t ArraySize = AT->getSize().getZExtValue(); 1453089d8927abe73fe6a806987937d9b54b1a7a8659Bruno Cardoso Lopes 1454089d8927abe73fe6a806987937d9b54b1a7a8659Bruno Cardoso Lopes // The only case a 256-bit wide vector could be used is when the array 1455089d8927abe73fe6a806987937d9b54b1a7a8659Bruno Cardoso Lopes // contains a single 256-bit element. Since Lo and Hi logic isn't extended 1456089d8927abe73fe6a806987937d9b54b1a7a8659Bruno Cardoso Lopes // to work for sizes wider than 128, early check and fallback to memory. 1457089d8927abe73fe6a806987937d9b54b1a7a8659Bruno Cardoso Lopes if (Size > 128 && EltSize != 256) 1458089d8927abe73fe6a806987937d9b54b1a7a8659Bruno Cardoso Lopes return; 1459089d8927abe73fe6a806987937d9b54b1a7a8659Bruno Cardoso Lopes 1460c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov for (uint64_t i=0, Offset=OffsetBase; i<ArraySize; ++i, Offset += EltSize) { 1461c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov Class FieldLo, FieldHi; 14629c254f0415bef9a0bafe5b5026ddb54b727597b1Chris Lattner classify(AT->getElementType(), Offset, FieldLo, FieldHi); 1463c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov Lo = merge(Lo, FieldLo); 1464c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov Hi = merge(Hi, FieldHi); 1465c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov if (Lo == Memory || Hi == Memory) 1466c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov break; 1467c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov } 1468c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 14694943c15df59fdec444656a48c16e72a2077ab61fBruno Cardoso Lopes postMerge(Size, Lo, Hi); 1470c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov assert((Hi != SSEUp || Lo == SSE) && "Invalid SSEUp array classification."); 14711090a9ba0902380dbd97d0a500daa4c373712df9Chris Lattner return; 14721090a9ba0902380dbd97d0a500daa4c373712df9Chris Lattner } 14738bea82f6699e4384ef823cdc8800ad5db271177cMichael J. Spencer 14741090a9ba0902380dbd97d0a500daa4c373712df9Chris Lattner if (const RecordType *RT = Ty->getAs<RecordType>()) { 1475ea0443212e7ec6ff82e2f174e8e948a6eb0e0876Chris Lattner uint64_t Size = getContext().getTypeSize(Ty); 1476c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 1477c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // AMD64-ABI 3.2.3p2: Rule 1. If the size of an object is larger 14784943c15df59fdec444656a48c16e72a2077ab61fBruno Cardoso Lopes // than four eightbytes, ..., it has class MEMORY. 14794943c15df59fdec444656a48c16e72a2077ab61fBruno Cardoso Lopes if (Size > 256) 1480c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov return; 1481c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 14820a8f847e97f40cce51dc69051b964732333dc028Anders Carlsson // AMD64-ABI 3.2.3p2: Rule 2. If a C++ object has either a non-trivial 14830a8f847e97f40cce51dc69051b964732333dc028Anders Carlsson // copy constructor or a non-trivial destructor, it is passed by invisible 14840a8f847e97f40cce51dc69051b964732333dc028Anders Carlsson // reference. 14850a8f847e97f40cce51dc69051b964732333dc028Anders Carlsson if (hasNonTrivialDestructorOrCopyConstructor(RT)) 14860a8f847e97f40cce51dc69051b964732333dc028Anders Carlsson return; 1487ce9f423d2ce4b8699d9f6c7623053f645ac4dc6dDaniel Dunbar 1488c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov const RecordDecl *RD = RT->getDecl(); 1489c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 1490c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // Assume variable sized types are passed in memory. 1491c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov if (RD->hasFlexibleArrayMember()) 1492c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov return; 1493c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 1494ea0443212e7ec6ff82e2f174e8e948a6eb0e0876Chris Lattner const ASTRecordLayout &Layout = getContext().getASTRecordLayout(RD); 1495c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 1496c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // Reset Lo class, this will be recomputed. 1497c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov Current = NoClass; 1498ce9f423d2ce4b8699d9f6c7623053f645ac4dc6dDaniel Dunbar 1499ce9f423d2ce4b8699d9f6c7623053f645ac4dc6dDaniel Dunbar // If this is a C++ record, classify the bases first. 1500ce9f423d2ce4b8699d9f6c7623053f645ac4dc6dDaniel Dunbar if (const CXXRecordDecl *CXXRD = dyn_cast<CXXRecordDecl>(RD)) { 1501ce9f423d2ce4b8699d9f6c7623053f645ac4dc6dDaniel Dunbar for (CXXRecordDecl::base_class_const_iterator i = CXXRD->bases_begin(), 1502ce9f423d2ce4b8699d9f6c7623053f645ac4dc6dDaniel Dunbar e = CXXRD->bases_end(); i != e; ++i) { 1503ce9f423d2ce4b8699d9f6c7623053f645ac4dc6dDaniel Dunbar assert(!i->isVirtual() && !i->getType()->isDependentType() && 1504ce9f423d2ce4b8699d9f6c7623053f645ac4dc6dDaniel Dunbar "Unexpected base class!"); 1505ce9f423d2ce4b8699d9f6c7623053f645ac4dc6dDaniel Dunbar const CXXRecordDecl *Base = 1506ce9f423d2ce4b8699d9f6c7623053f645ac4dc6dDaniel Dunbar cast<CXXRecordDecl>(i->getType()->getAs<RecordType>()->getDecl()); 1507ce9f423d2ce4b8699d9f6c7623053f645ac4dc6dDaniel Dunbar 1508ce9f423d2ce4b8699d9f6c7623053f645ac4dc6dDaniel Dunbar // Classify this field. 1509ce9f423d2ce4b8699d9f6c7623053f645ac4dc6dDaniel Dunbar // 1510ce9f423d2ce4b8699d9f6c7623053f645ac4dc6dDaniel Dunbar // AMD64-ABI 3.2.3p2: Rule 3. If the size of the aggregate exceeds a 1511ce9f423d2ce4b8699d9f6c7623053f645ac4dc6dDaniel Dunbar // single eightbyte, each is classified separately. Each eightbyte gets 1512ce9f423d2ce4b8699d9f6c7623053f645ac4dc6dDaniel Dunbar // initialized to class NO_CLASS. 1513ce9f423d2ce4b8699d9f6c7623053f645ac4dc6dDaniel Dunbar Class FieldLo, FieldHi; 1514d4f5198ae07d9a4958d8191bac694ded12173ad9Benjamin Kramer uint64_t Offset = 1515d4f5198ae07d9a4958d8191bac694ded12173ad9Benjamin Kramer OffsetBase + getContext().toBits(Layout.getBaseClassOffset(Base)); 15169c254f0415bef9a0bafe5b5026ddb54b727597b1Chris Lattner classify(i->getType(), Offset, FieldLo, FieldHi); 1517ce9f423d2ce4b8699d9f6c7623053f645ac4dc6dDaniel Dunbar Lo = merge(Lo, FieldLo); 1518ce9f423d2ce4b8699d9f6c7623053f645ac4dc6dDaniel Dunbar Hi = merge(Hi, FieldHi); 1519ce9f423d2ce4b8699d9f6c7623053f645ac4dc6dDaniel Dunbar if (Lo == Memory || Hi == Memory) 1520ce9f423d2ce4b8699d9f6c7623053f645ac4dc6dDaniel Dunbar break; 1521ce9f423d2ce4b8699d9f6c7623053f645ac4dc6dDaniel Dunbar } 1522ce9f423d2ce4b8699d9f6c7623053f645ac4dc6dDaniel Dunbar } 1523ce9f423d2ce4b8699d9f6c7623053f645ac4dc6dDaniel Dunbar 1524ce9f423d2ce4b8699d9f6c7623053f645ac4dc6dDaniel Dunbar // Classify the fields one at a time, merging the results. 1525c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov unsigned idx = 0; 1526548e478b8bd02b0295bc4efd0c282337f00646fdBruno Cardoso Lopes for (RecordDecl::field_iterator i = RD->field_begin(), e = RD->field_end(); 152717945a0f64fe03ff6ec0c2146005a87636e3ac12Argyrios Kyrtzidis i != e; ++i, ++idx) { 1528c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov uint64_t Offset = OffsetBase + Layout.getFieldOffset(idx); 1529c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov bool BitField = i->isBitField(); 1530c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 1531b8981df0ed2886dfa221f2fad6d86872c39d3549Bruno Cardoso Lopes // AMD64-ABI 3.2.3p2: Rule 1. If the size of an object is larger than 1532b8981df0ed2886dfa221f2fad6d86872c39d3549Bruno Cardoso Lopes // four eightbytes, or it contains unaligned fields, it has class MEMORY. 1533c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // 1534b8981df0ed2886dfa221f2fad6d86872c39d3549Bruno Cardoso Lopes // The only case a 256-bit wide vector could be used is when the struct 1535b8981df0ed2886dfa221f2fad6d86872c39d3549Bruno Cardoso Lopes // contains a single 256-bit element. Since Lo and Hi logic isn't extended 1536b8981df0ed2886dfa221f2fad6d86872c39d3549Bruno Cardoso Lopes // to work for sizes wider than 128, early check and fallback to memory. 1537b8981df0ed2886dfa221f2fad6d86872c39d3549Bruno Cardoso Lopes // 1538b8981df0ed2886dfa221f2fad6d86872c39d3549Bruno Cardoso Lopes if (Size > 128 && getContext().getTypeSize(i->getType()) != 256) { 1539b8981df0ed2886dfa221f2fad6d86872c39d3549Bruno Cardoso Lopes Lo = Memory; 1540b8981df0ed2886dfa221f2fad6d86872c39d3549Bruno Cardoso Lopes return; 1541b8981df0ed2886dfa221f2fad6d86872c39d3549Bruno Cardoso Lopes } 1542c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // Note, skip this test for bit-fields, see below. 1543ea0443212e7ec6ff82e2f174e8e948a6eb0e0876Chris Lattner if (!BitField && Offset % getContext().getTypeAlign(i->getType())) { 1544c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov Lo = Memory; 1545c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov return; 1546c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov } 1547c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 1548c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // Classify this field. 1549c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // 1550c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // AMD64-ABI 3.2.3p2: Rule 3. If the size of the aggregate 1551c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // exceeds a single eightbyte, each is classified 1552c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // separately. Each eightbyte gets initialized to class 1553c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // NO_CLASS. 1554c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov Class FieldLo, FieldHi; 1555c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 1556c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // Bit-fields require special handling, they do not force the 1557c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // structure to be passed in memory even if unaligned, and 1558c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // therefore they can straddle an eightbyte. 1559c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov if (BitField) { 1560c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // Ignore padding bit-fields. 1561c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov if (i->isUnnamedBitfield()) 1562c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov continue; 1563c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 1564c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov uint64_t Offset = OffsetBase + Layout.getFieldOffset(idx); 1565a6b8b2c09610b8bc4330e948ece8b940c2386406Richard Smith uint64_t Size = i->getBitWidthValue(getContext()); 1566c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 1567c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov uint64_t EB_Lo = Offset / 64; 1568c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov uint64_t EB_Hi = (Offset + Size - 1) / 64; 1569c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov FieldLo = FieldHi = NoClass; 1570c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov if (EB_Lo) { 1571c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov assert(EB_Hi == EB_Lo && "Invalid classification, type > 16 bytes."); 1572c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov FieldLo = NoClass; 1573c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov FieldHi = Integer; 1574c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov } else { 1575c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov FieldLo = Integer; 1576c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov FieldHi = EB_Hi ? Integer : NoClass; 1577c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov } 1578c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov } else 15799c254f0415bef9a0bafe5b5026ddb54b727597b1Chris Lattner classify(i->getType(), Offset, FieldLo, FieldHi); 1580c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov Lo = merge(Lo, FieldLo); 1581c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov Hi = merge(Hi, FieldHi); 1582c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov if (Lo == Memory || Hi == Memory) 1583c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov break; 1584c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov } 1585c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 15864943c15df59fdec444656a48c16e72a2077ab61fBruno Cardoso Lopes postMerge(Size, Lo, Hi); 1587c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov } 1588c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov} 1589c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 15909c254f0415bef9a0bafe5b5026ddb54b727597b1Chris LattnerABIArgInfo X86_64ABIInfo::getIndirectReturnResult(QualType Ty) const { 159146c54fb8ec45765a475b7b709b9aee7f94c490c2Daniel Dunbar // If this is a scalar LLVM value then assume LLVM will pass it in the right 159246c54fb8ec45765a475b7b709b9aee7f94c490c2Daniel Dunbar // place naturally. 1593d608cdb7c044365cf4e8764ade1e11e99c176078John McCall if (!isAggregateTypeForABI(Ty)) { 159446c54fb8ec45765a475b7b709b9aee7f94c490c2Daniel Dunbar // Treat an enum type as its underlying type. 159546c54fb8ec45765a475b7b709b9aee7f94c490c2Daniel Dunbar if (const EnumType *EnumTy = Ty->getAs<EnumType>()) 159646c54fb8ec45765a475b7b709b9aee7f94c490c2Daniel Dunbar Ty = EnumTy->getDecl()->getIntegerType(); 159746c54fb8ec45765a475b7b709b9aee7f94c490c2Daniel Dunbar 159846c54fb8ec45765a475b7b709b9aee7f94c490c2Daniel Dunbar return (Ty->isPromotableIntegerType() ? 159946c54fb8ec45765a475b7b709b9aee7f94c490c2Daniel Dunbar ABIArgInfo::getExtend() : ABIArgInfo::getDirect()); 160046c54fb8ec45765a475b7b709b9aee7f94c490c2Daniel Dunbar } 160146c54fb8ec45765a475b7b709b9aee7f94c490c2Daniel Dunbar 160246c54fb8ec45765a475b7b709b9aee7f94c490c2Daniel Dunbar return ABIArgInfo::getIndirect(0); 160346c54fb8ec45765a475b7b709b9aee7f94c490c2Daniel Dunbar} 160446c54fb8ec45765a475b7b709b9aee7f94c490c2Daniel Dunbar 1605ee1ad99f1ced9ffee436466ef674d4541c37864eEli Friedmanbool X86_64ABIInfo::IsIllegalVectorType(QualType Ty) const { 1606ee1ad99f1ced9ffee436466ef674d4541c37864eEli Friedman if (const VectorType *VecTy = Ty->getAs<VectorType>()) { 1607ee1ad99f1ced9ffee436466ef674d4541c37864eEli Friedman uint64_t Size = getContext().getTypeSize(VecTy); 1608ee1ad99f1ced9ffee436466ef674d4541c37864eEli Friedman unsigned LargestVector = HasAVX ? 256 : 128; 1609ee1ad99f1ced9ffee436466ef674d4541c37864eEli Friedman if (Size <= 64 || Size > LargestVector) 1610ee1ad99f1ced9ffee436466ef674d4541c37864eEli Friedman return true; 1611ee1ad99f1ced9ffee436466ef674d4541c37864eEli Friedman } 1612ee1ad99f1ced9ffee436466ef674d4541c37864eEli Friedman 1613ee1ad99f1ced9ffee436466ef674d4541c37864eEli Friedman return false; 1614ee1ad99f1ced9ffee436466ef674d4541c37864eEli Friedman} 1615ee1ad99f1ced9ffee436466ef674d4541c37864eEli Friedman 1616edfac0302490d84419eb958c812c533b8df29785Daniel DunbarABIArgInfo X86_64ABIInfo::getIndirectResult(QualType Ty, 1617edfac0302490d84419eb958c812c533b8df29785Daniel Dunbar unsigned freeIntRegs) const { 1618c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // If this is a scalar LLVM value then assume LLVM will pass it in the right 1619c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // place naturally. 1620edfac0302490d84419eb958c812c533b8df29785Daniel Dunbar // 1621edfac0302490d84419eb958c812c533b8df29785Daniel Dunbar // This assumption is optimistic, as there could be free registers available 1622edfac0302490d84419eb958c812c533b8df29785Daniel Dunbar // when we need to pass this argument in memory, and LLVM could try to pass 1623edfac0302490d84419eb958c812c533b8df29785Daniel Dunbar // the argument in the free register. This does not seem to happen currently, 1624edfac0302490d84419eb958c812c533b8df29785Daniel Dunbar // but this code would be much safer if we could mark the argument with 1625edfac0302490d84419eb958c812c533b8df29785Daniel Dunbar // 'onstack'. See PR12193. 1626ee1ad99f1ced9ffee436466ef674d4541c37864eEli Friedman if (!isAggregateTypeForABI(Ty) && !IsIllegalVectorType(Ty)) { 1627aa74a1e49f7c4b89539830290f76fe2c3e97187fDouglas Gregor // Treat an enum type as its underlying type. 1628aa74a1e49f7c4b89539830290f76fe2c3e97187fDouglas Gregor if (const EnumType *EnumTy = Ty->getAs<EnumType>()) 1629aa74a1e49f7c4b89539830290f76fe2c3e97187fDouglas Gregor Ty = EnumTy->getDecl()->getIntegerType(); 1630aa74a1e49f7c4b89539830290f76fe2c3e97187fDouglas Gregor 1631cc6fa88666ca2f287df4a600eb31a4087bab9c13Anton Korobeynikov return (Ty->isPromotableIntegerType() ? 1632cc6fa88666ca2f287df4a600eb31a4087bab9c13Anton Korobeynikov ABIArgInfo::getExtend() : ABIArgInfo::getDirect()); 1633aa74a1e49f7c4b89539830290f76fe2c3e97187fDouglas Gregor } 1634c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 163546c54fb8ec45765a475b7b709b9aee7f94c490c2Daniel Dunbar if (isRecordWithNonTrivialDestructorOrCopyConstructor(Ty)) 163646c54fb8ec45765a475b7b709b9aee7f94c490c2Daniel Dunbar return ABIArgInfo::getIndirect(0, /*ByVal=*/false); 16370a8f847e97f40cce51dc69051b964732333dc028Anders Carlsson 1638855d227967f8332237f1f1cf8eb63a1e22d8be05Chris Lattner // Compute the byval alignment. We specify the alignment of the byval in all 1639855d227967f8332237f1f1cf8eb63a1e22d8be05Chris Lattner // cases so that the mid-level optimizer knows the alignment of the byval. 1640855d227967f8332237f1f1cf8eb63a1e22d8be05Chris Lattner unsigned Align = std::max(getContext().getTypeAlign(Ty) / 8, 8U); 1641edfac0302490d84419eb958c812c533b8df29785Daniel Dunbar 1642edfac0302490d84419eb958c812c533b8df29785Daniel Dunbar // Attempt to avoid passing indirect results using byval when possible. This 1643edfac0302490d84419eb958c812c533b8df29785Daniel Dunbar // is important for good codegen. 1644edfac0302490d84419eb958c812c533b8df29785Daniel Dunbar // 1645edfac0302490d84419eb958c812c533b8df29785Daniel Dunbar // We do this by coercing the value into a scalar type which the backend can 1646edfac0302490d84419eb958c812c533b8df29785Daniel Dunbar // handle naturally (i.e., without using byval). 1647edfac0302490d84419eb958c812c533b8df29785Daniel Dunbar // 1648edfac0302490d84419eb958c812c533b8df29785Daniel Dunbar // For simplicity, we currently only do this when we have exhausted all of the 1649edfac0302490d84419eb958c812c533b8df29785Daniel Dunbar // free integer registers. Doing this when there are free integer registers 1650edfac0302490d84419eb958c812c533b8df29785Daniel Dunbar // would require more care, as we would have to ensure that the coerced value 1651edfac0302490d84419eb958c812c533b8df29785Daniel Dunbar // did not claim the unused register. That would require either reording the 1652edfac0302490d84419eb958c812c533b8df29785Daniel Dunbar // arguments to the function (so that any subsequent inreg values came first), 1653edfac0302490d84419eb958c812c533b8df29785Daniel Dunbar // or only doing this optimization when there were no following arguments that 1654edfac0302490d84419eb958c812c533b8df29785Daniel Dunbar // might be inreg. 1655edfac0302490d84419eb958c812c533b8df29785Daniel Dunbar // 1656edfac0302490d84419eb958c812c533b8df29785Daniel Dunbar // We currently expect it to be rare (particularly in well written code) for 1657edfac0302490d84419eb958c812c533b8df29785Daniel Dunbar // arguments to be passed on the stack when there are still free integer 1658edfac0302490d84419eb958c812c533b8df29785Daniel Dunbar // registers available (this would typically imply large structs being passed 1659edfac0302490d84419eb958c812c533b8df29785Daniel Dunbar // by value), so this seems like a fair tradeoff for now. 1660edfac0302490d84419eb958c812c533b8df29785Daniel Dunbar // 1661edfac0302490d84419eb958c812c533b8df29785Daniel Dunbar // We can revisit this if the backend grows support for 'onstack' parameter 1662edfac0302490d84419eb958c812c533b8df29785Daniel Dunbar // attributes. See PR12193. 1663edfac0302490d84419eb958c812c533b8df29785Daniel Dunbar if (freeIntRegs == 0) { 1664edfac0302490d84419eb958c812c533b8df29785Daniel Dunbar uint64_t Size = getContext().getTypeSize(Ty); 1665edfac0302490d84419eb958c812c533b8df29785Daniel Dunbar 1666edfac0302490d84419eb958c812c533b8df29785Daniel Dunbar // If this type fits in an eightbyte, coerce it into the matching integral 1667edfac0302490d84419eb958c812c533b8df29785Daniel Dunbar // type, which will end up on the stack (with alignment 8). 1668edfac0302490d84419eb958c812c533b8df29785Daniel Dunbar if (Align == 8 && Size <= 64) 1669edfac0302490d84419eb958c812c533b8df29785Daniel Dunbar return ABIArgInfo::getDirect(llvm::IntegerType::get(getVMContext(), 1670edfac0302490d84419eb958c812c533b8df29785Daniel Dunbar Size)); 1671edfac0302490d84419eb958c812c533b8df29785Daniel Dunbar } 1672edfac0302490d84419eb958c812c533b8df29785Daniel Dunbar 1673855d227967f8332237f1f1cf8eb63a1e22d8be05Chris Lattner return ABIArgInfo::getIndirect(Align); 1674c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov} 1675c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 16764943c15df59fdec444656a48c16e72a2077ab61fBruno Cardoso Lopes/// GetByteVectorType - The ABI specifies that a value should be passed in an 16774943c15df59fdec444656a48c16e72a2077ab61fBruno Cardoso Lopes/// full vector XMM/YMM register. Pick an LLVM IR type that will be passed as a 16780f408f5242522cbede304472e17931357c1b573dChris Lattner/// vector register. 16794943c15df59fdec444656a48c16e72a2077ab61fBruno Cardoso Lopesllvm::Type *X86_64ABIInfo::GetByteVectorType(QualType Ty) const { 16809cbe4f0ba01ec304e1e3d071c071f7bca33631c0Chris Lattner llvm::Type *IRType = CGT.ConvertType(Ty); 16818bea82f6699e4384ef823cdc8800ad5db271177cMichael J. Spencer 168215842bd05bd6d3b7450385ac8f73aaee5f807e19Chris Lattner // Wrapper structs that just contain vectors are passed just like vectors, 168315842bd05bd6d3b7450385ac8f73aaee5f807e19Chris Lattner // strip them off if present. 16849cbe4f0ba01ec304e1e3d071c071f7bca33631c0Chris Lattner llvm::StructType *STy = dyn_cast<llvm::StructType>(IRType); 168515842bd05bd6d3b7450385ac8f73aaee5f807e19Chris Lattner while (STy && STy->getNumElements() == 1) { 168615842bd05bd6d3b7450385ac8f73aaee5f807e19Chris Lattner IRType = STy->getElementType(0); 168715842bd05bd6d3b7450385ac8f73aaee5f807e19Chris Lattner STy = dyn_cast<llvm::StructType>(IRType); 168815842bd05bd6d3b7450385ac8f73aaee5f807e19Chris Lattner } 16898bea82f6699e4384ef823cdc8800ad5db271177cMichael J. Spencer 1690528a8c7b4c39ae1c551760fd087a508a71ee9541Bruno Cardoso Lopes // If the preferred type is a 16-byte vector, prefer to pass it. 16919cbe4f0ba01ec304e1e3d071c071f7bca33631c0Chris Lattner if (llvm::VectorType *VT = dyn_cast<llvm::VectorType>(IRType)){ 16929cbe4f0ba01ec304e1e3d071c071f7bca33631c0Chris Lattner llvm::Type *EltTy = VT->getElementType(); 16934943c15df59fdec444656a48c16e72a2077ab61fBruno Cardoso Lopes unsigned BitWidth = VT->getBitWidth(); 1694ce275675d33142c235d7027db16abe43da616ee4Tanya Lattner if ((BitWidth >= 128 && BitWidth <= 256) && 16950f408f5242522cbede304472e17931357c1b573dChris Lattner (EltTy->isFloatTy() || EltTy->isDoubleTy() || 16960f408f5242522cbede304472e17931357c1b573dChris Lattner EltTy->isIntegerTy(8) || EltTy->isIntegerTy(16) || 16970f408f5242522cbede304472e17931357c1b573dChris Lattner EltTy->isIntegerTy(32) || EltTy->isIntegerTy(64) || 16980f408f5242522cbede304472e17931357c1b573dChris Lattner EltTy->isIntegerTy(128))) 16990f408f5242522cbede304472e17931357c1b573dChris Lattner return VT; 17000f408f5242522cbede304472e17931357c1b573dChris Lattner } 17018bea82f6699e4384ef823cdc8800ad5db271177cMichael J. Spencer 17020f408f5242522cbede304472e17931357c1b573dChris Lattner return llvm::VectorType::get(llvm::Type::getDoubleTy(getVMContext()), 2); 17030f408f5242522cbede304472e17931357c1b573dChris Lattner} 17040f408f5242522cbede304472e17931357c1b573dChris Lattner 1705e2962be11e8894329d37985eccaa4f4a12dea402Chris Lattner/// BitsContainNoUserData - Return true if the specified [start,end) bit range 1706e2962be11e8894329d37985eccaa4f4a12dea402Chris Lattner/// is known to either be off the end of the specified type or being in 1707e2962be11e8894329d37985eccaa4f4a12dea402Chris Lattner/// alignment padding. The user type specified is known to be at most 128 bits 1708e2962be11e8894329d37985eccaa4f4a12dea402Chris Lattner/// in size, and have passed through X86_64ABIInfo::classify with a successful 1709e2962be11e8894329d37985eccaa4f4a12dea402Chris Lattner/// classification that put one of the two halves in the INTEGER class. 1710e2962be11e8894329d37985eccaa4f4a12dea402Chris Lattner/// 1711e2962be11e8894329d37985eccaa4f4a12dea402Chris Lattner/// It is conservatively correct to return false. 1712e2962be11e8894329d37985eccaa4f4a12dea402Chris Lattnerstatic bool BitsContainNoUserData(QualType Ty, unsigned StartBit, 1713e2962be11e8894329d37985eccaa4f4a12dea402Chris Lattner unsigned EndBit, ASTContext &Context) { 1714e2962be11e8894329d37985eccaa4f4a12dea402Chris Lattner // If the bytes being queried are off the end of the type, there is no user 1715e2962be11e8894329d37985eccaa4f4a12dea402Chris Lattner // data hiding here. This handles analysis of builtins, vectors and other 1716e2962be11e8894329d37985eccaa4f4a12dea402Chris Lattner // types that don't contain interesting padding. 1717e2962be11e8894329d37985eccaa4f4a12dea402Chris Lattner unsigned TySize = (unsigned)Context.getTypeSize(Ty); 1718e2962be11e8894329d37985eccaa4f4a12dea402Chris Lattner if (TySize <= StartBit) 1719e2962be11e8894329d37985eccaa4f4a12dea402Chris Lattner return true; 1720e2962be11e8894329d37985eccaa4f4a12dea402Chris Lattner 1721021c3a349d4f55cc2c7970268758bcf37b924493Chris Lattner if (const ConstantArrayType *AT = Context.getAsConstantArrayType(Ty)) { 1722021c3a349d4f55cc2c7970268758bcf37b924493Chris Lattner unsigned EltSize = (unsigned)Context.getTypeSize(AT->getElementType()); 1723021c3a349d4f55cc2c7970268758bcf37b924493Chris Lattner unsigned NumElts = (unsigned)AT->getSize().getZExtValue(); 1724021c3a349d4f55cc2c7970268758bcf37b924493Chris Lattner 1725021c3a349d4f55cc2c7970268758bcf37b924493Chris Lattner // Check each element to see if the element overlaps with the queried range. 1726021c3a349d4f55cc2c7970268758bcf37b924493Chris Lattner for (unsigned i = 0; i != NumElts; ++i) { 1727021c3a349d4f55cc2c7970268758bcf37b924493Chris Lattner // If the element is after the span we care about, then we're done.. 1728021c3a349d4f55cc2c7970268758bcf37b924493Chris Lattner unsigned EltOffset = i*EltSize; 1729021c3a349d4f55cc2c7970268758bcf37b924493Chris Lattner if (EltOffset >= EndBit) break; 17308bea82f6699e4384ef823cdc8800ad5db271177cMichael J. Spencer 1731021c3a349d4f55cc2c7970268758bcf37b924493Chris Lattner unsigned EltStart = EltOffset < StartBit ? StartBit-EltOffset :0; 1732021c3a349d4f55cc2c7970268758bcf37b924493Chris Lattner if (!BitsContainNoUserData(AT->getElementType(), EltStart, 1733021c3a349d4f55cc2c7970268758bcf37b924493Chris Lattner EndBit-EltOffset, Context)) 1734021c3a349d4f55cc2c7970268758bcf37b924493Chris Lattner return false; 1735021c3a349d4f55cc2c7970268758bcf37b924493Chris Lattner } 1736021c3a349d4f55cc2c7970268758bcf37b924493Chris Lattner // If it overlaps no elements, then it is safe to process as padding. 1737021c3a349d4f55cc2c7970268758bcf37b924493Chris Lattner return true; 1738021c3a349d4f55cc2c7970268758bcf37b924493Chris Lattner } 17398bea82f6699e4384ef823cdc8800ad5db271177cMichael J. Spencer 1740e2962be11e8894329d37985eccaa4f4a12dea402Chris Lattner if (const RecordType *RT = Ty->getAs<RecordType>()) { 1741e2962be11e8894329d37985eccaa4f4a12dea402Chris Lattner const RecordDecl *RD = RT->getDecl(); 1742e2962be11e8894329d37985eccaa4f4a12dea402Chris Lattner const ASTRecordLayout &Layout = Context.getASTRecordLayout(RD); 17438bea82f6699e4384ef823cdc8800ad5db271177cMichael J. Spencer 1744e2962be11e8894329d37985eccaa4f4a12dea402Chris Lattner // If this is a C++ record, check the bases first. 1745e2962be11e8894329d37985eccaa4f4a12dea402Chris Lattner if (const CXXRecordDecl *CXXRD = dyn_cast<CXXRecordDecl>(RD)) { 1746e2962be11e8894329d37985eccaa4f4a12dea402Chris Lattner for (CXXRecordDecl::base_class_const_iterator i = CXXRD->bases_begin(), 1747e2962be11e8894329d37985eccaa4f4a12dea402Chris Lattner e = CXXRD->bases_end(); i != e; ++i) { 1748e2962be11e8894329d37985eccaa4f4a12dea402Chris Lattner assert(!i->isVirtual() && !i->getType()->isDependentType() && 1749e2962be11e8894329d37985eccaa4f4a12dea402Chris Lattner "Unexpected base class!"); 1750e2962be11e8894329d37985eccaa4f4a12dea402Chris Lattner const CXXRecordDecl *Base = 1751e2962be11e8894329d37985eccaa4f4a12dea402Chris Lattner cast<CXXRecordDecl>(i->getType()->getAs<RecordType>()->getDecl()); 17528bea82f6699e4384ef823cdc8800ad5db271177cMichael J. Spencer 1753e2962be11e8894329d37985eccaa4f4a12dea402Chris Lattner // If the base is after the span we care about, ignore it. 1754d4f5198ae07d9a4958d8191bac694ded12173ad9Benjamin Kramer unsigned BaseOffset = Context.toBits(Layout.getBaseClassOffset(Base)); 1755e2962be11e8894329d37985eccaa4f4a12dea402Chris Lattner if (BaseOffset >= EndBit) continue; 17568bea82f6699e4384ef823cdc8800ad5db271177cMichael J. Spencer 1757e2962be11e8894329d37985eccaa4f4a12dea402Chris Lattner unsigned BaseStart = BaseOffset < StartBit ? StartBit-BaseOffset :0; 1758e2962be11e8894329d37985eccaa4f4a12dea402Chris Lattner if (!BitsContainNoUserData(i->getType(), BaseStart, 1759e2962be11e8894329d37985eccaa4f4a12dea402Chris Lattner EndBit-BaseOffset, Context)) 1760e2962be11e8894329d37985eccaa4f4a12dea402Chris Lattner return false; 1761e2962be11e8894329d37985eccaa4f4a12dea402Chris Lattner } 1762e2962be11e8894329d37985eccaa4f4a12dea402Chris Lattner } 17638bea82f6699e4384ef823cdc8800ad5db271177cMichael J. Spencer 1764e2962be11e8894329d37985eccaa4f4a12dea402Chris Lattner // Verify that no field has data that overlaps the region of interest. Yes 1765e2962be11e8894329d37985eccaa4f4a12dea402Chris Lattner // this could be sped up a lot by being smarter about queried fields, 1766e2962be11e8894329d37985eccaa4f4a12dea402Chris Lattner // however we're only looking at structs up to 16 bytes, so we don't care 1767e2962be11e8894329d37985eccaa4f4a12dea402Chris Lattner // much. 1768e2962be11e8894329d37985eccaa4f4a12dea402Chris Lattner unsigned idx = 0; 1769e2962be11e8894329d37985eccaa4f4a12dea402Chris Lattner for (RecordDecl::field_iterator i = RD->field_begin(), e = RD->field_end(); 1770e2962be11e8894329d37985eccaa4f4a12dea402Chris Lattner i != e; ++i, ++idx) { 1771e2962be11e8894329d37985eccaa4f4a12dea402Chris Lattner unsigned FieldOffset = (unsigned)Layout.getFieldOffset(idx); 17728bea82f6699e4384ef823cdc8800ad5db271177cMichael J. Spencer 1773e2962be11e8894329d37985eccaa4f4a12dea402Chris Lattner // If we found a field after the region we care about, then we're done. 1774e2962be11e8894329d37985eccaa4f4a12dea402Chris Lattner if (FieldOffset >= EndBit) break; 1775e2962be11e8894329d37985eccaa4f4a12dea402Chris Lattner 1776e2962be11e8894329d37985eccaa4f4a12dea402Chris Lattner unsigned FieldStart = FieldOffset < StartBit ? StartBit-FieldOffset :0; 1777e2962be11e8894329d37985eccaa4f4a12dea402Chris Lattner if (!BitsContainNoUserData(i->getType(), FieldStart, EndBit-FieldOffset, 1778e2962be11e8894329d37985eccaa4f4a12dea402Chris Lattner Context)) 1779e2962be11e8894329d37985eccaa4f4a12dea402Chris Lattner return false; 1780e2962be11e8894329d37985eccaa4f4a12dea402Chris Lattner } 17818bea82f6699e4384ef823cdc8800ad5db271177cMichael J. Spencer 1782e2962be11e8894329d37985eccaa4f4a12dea402Chris Lattner // If nothing in this record overlapped the area of interest, then we're 1783e2962be11e8894329d37985eccaa4f4a12dea402Chris Lattner // clean. 1784e2962be11e8894329d37985eccaa4f4a12dea402Chris Lattner return true; 1785e2962be11e8894329d37985eccaa4f4a12dea402Chris Lattner } 17868bea82f6699e4384ef823cdc8800ad5db271177cMichael J. Spencer 1787e2962be11e8894329d37985eccaa4f4a12dea402Chris Lattner return false; 1788e2962be11e8894329d37985eccaa4f4a12dea402Chris Lattner} 1789e2962be11e8894329d37985eccaa4f4a12dea402Chris Lattner 17900b3620066bfbb33004bed1816c851a923b9301afChris Lattner/// ContainsFloatAtOffset - Return true if the specified LLVM IR type has a 17910b3620066bfbb33004bed1816c851a923b9301afChris Lattner/// float member at the specified offset. For example, {int,{float}} has a 17920b3620066bfbb33004bed1816c851a923b9301afChris Lattner/// float at offset 4. It is conservatively correct for this routine to return 17930b3620066bfbb33004bed1816c851a923b9301afChris Lattner/// false. 17942acc6e3feda5e4f7d9009bdcf8b1cd777fecfe2dChris Lattnerstatic bool ContainsFloatAtOffset(llvm::Type *IRType, unsigned IROffset, 17950b3620066bfbb33004bed1816c851a923b9301afChris Lattner const llvm::TargetData &TD) { 17960b3620066bfbb33004bed1816c851a923b9301afChris Lattner // Base case if we find a float. 17970b3620066bfbb33004bed1816c851a923b9301afChris Lattner if (IROffset == 0 && IRType->isFloatTy()) 17980b3620066bfbb33004bed1816c851a923b9301afChris Lattner return true; 17998bea82f6699e4384ef823cdc8800ad5db271177cMichael J. Spencer 18000b3620066bfbb33004bed1816c851a923b9301afChris Lattner // If this is a struct, recurse into the field at the specified offset. 18012acc6e3feda5e4f7d9009bdcf8b1cd777fecfe2dChris Lattner if (llvm::StructType *STy = dyn_cast<llvm::StructType>(IRType)) { 18020b3620066bfbb33004bed1816c851a923b9301afChris Lattner const llvm::StructLayout *SL = TD.getStructLayout(STy); 18030b3620066bfbb33004bed1816c851a923b9301afChris Lattner unsigned Elt = SL->getElementContainingOffset(IROffset); 18040b3620066bfbb33004bed1816c851a923b9301afChris Lattner IROffset -= SL->getElementOffset(Elt); 18050b3620066bfbb33004bed1816c851a923b9301afChris Lattner return ContainsFloatAtOffset(STy->getElementType(Elt), IROffset, TD); 18060b3620066bfbb33004bed1816c851a923b9301afChris Lattner } 18078bea82f6699e4384ef823cdc8800ad5db271177cMichael J. Spencer 18080b3620066bfbb33004bed1816c851a923b9301afChris Lattner // If this is an array, recurse into the field at the specified offset. 18092acc6e3feda5e4f7d9009bdcf8b1cd777fecfe2dChris Lattner if (llvm::ArrayType *ATy = dyn_cast<llvm::ArrayType>(IRType)) { 18102acc6e3feda5e4f7d9009bdcf8b1cd777fecfe2dChris Lattner llvm::Type *EltTy = ATy->getElementType(); 18110b3620066bfbb33004bed1816c851a923b9301afChris Lattner unsigned EltSize = TD.getTypeAllocSize(EltTy); 18120b3620066bfbb33004bed1816c851a923b9301afChris Lattner IROffset -= IROffset/EltSize*EltSize; 18130b3620066bfbb33004bed1816c851a923b9301afChris Lattner return ContainsFloatAtOffset(EltTy, IROffset, TD); 18140b3620066bfbb33004bed1816c851a923b9301afChris Lattner } 18150b3620066bfbb33004bed1816c851a923b9301afChris Lattner 18160b3620066bfbb33004bed1816c851a923b9301afChris Lattner return false; 18170b3620066bfbb33004bed1816c851a923b9301afChris Lattner} 18180b3620066bfbb33004bed1816c851a923b9301afChris Lattner 1819f47c944b5710a545d564b4d4b641a2f8bac96af3Chris Lattner 1820f47c944b5710a545d564b4d4b641a2f8bac96af3Chris Lattner/// GetSSETypeAtOffset - Return a type that will be passed by the backend in the 1821f47c944b5710a545d564b4d4b641a2f8bac96af3Chris Lattner/// low 8 bytes of an XMM register, corresponding to the SSE class. 18229cbe4f0ba01ec304e1e3d071c071f7bca33631c0Chris Lattnerllvm::Type *X86_64ABIInfo:: 18239cbe4f0ba01ec304e1e3d071c071f7bca33631c0Chris LattnerGetSSETypeAtOffset(llvm::Type *IRType, unsigned IROffset, 1824f47c944b5710a545d564b4d4b641a2f8bac96af3Chris Lattner QualType SourceTy, unsigned SourceOffset) const { 1825cba8d310163f84630fd140fbfa9b6fdad9d26587Chris Lattner // The only three choices we have are either double, <2 x float>, or float. We 1826f47c944b5710a545d564b4d4b641a2f8bac96af3Chris Lattner // pass as float if the last 4 bytes is just padding. This happens for 1827f47c944b5710a545d564b4d4b641a2f8bac96af3Chris Lattner // structs that contain 3 floats. 1828f47c944b5710a545d564b4d4b641a2f8bac96af3Chris Lattner if (BitsContainNoUserData(SourceTy, SourceOffset*8+32, 1829f47c944b5710a545d564b4d4b641a2f8bac96af3Chris Lattner SourceOffset*8+64, getContext())) 1830f47c944b5710a545d564b4d4b641a2f8bac96af3Chris Lattner return llvm::Type::getFloatTy(getVMContext()); 18318bea82f6699e4384ef823cdc8800ad5db271177cMichael J. Spencer 18320b3620066bfbb33004bed1816c851a923b9301afChris Lattner // We want to pass as <2 x float> if the LLVM IR type contains a float at 18330b3620066bfbb33004bed1816c851a923b9301afChris Lattner // offset+0 and offset+4. Walk the LLVM IR type to find out if this is the 18340b3620066bfbb33004bed1816c851a923b9301afChris Lattner // case. 18350b3620066bfbb33004bed1816c851a923b9301afChris Lattner if (ContainsFloatAtOffset(IRType, IROffset, getTargetData()) && 183622fd4baf2eba2103e2b41e463f1a5f6486c398fbChris Lattner ContainsFloatAtOffset(IRType, IROffset+4, getTargetData())) 183722fd4baf2eba2103e2b41e463f1a5f6486c398fbChris Lattner return llvm::VectorType::get(llvm::Type::getFloatTy(getVMContext()), 2); 18388bea82f6699e4384ef823cdc8800ad5db271177cMichael J. Spencer 1839f47c944b5710a545d564b4d4b641a2f8bac96af3Chris Lattner return llvm::Type::getDoubleTy(getVMContext()); 1840f47c944b5710a545d564b4d4b641a2f8bac96af3Chris Lattner} 1841f47c944b5710a545d564b4d4b641a2f8bac96af3Chris Lattner 1842f47c944b5710a545d564b4d4b641a2f8bac96af3Chris Lattner 18430d2656d77053cc2ed6f3a3acdf12d67807c7f3a2Chris Lattner/// GetINTEGERTypeAtOffset - The ABI specifies that a value should be passed in 18440d2656d77053cc2ed6f3a3acdf12d67807c7f3a2Chris Lattner/// an 8-byte GPR. This means that we either have a scalar or we are talking 18450d2656d77053cc2ed6f3a3acdf12d67807c7f3a2Chris Lattner/// about the high or low part of an up-to-16-byte struct. This routine picks 18460d2656d77053cc2ed6f3a3acdf12d67807c7f3a2Chris Lattner/// the best LLVM IR type to represent this, which may be i64 or may be anything 1847519f68cd26777c755763a644a7f7ed7ac389beb9Chris Lattner/// else that the backend will pass in a GPR that works better (e.g. i8, %foo*, 1848519f68cd26777c755763a644a7f7ed7ac389beb9Chris Lattner/// etc). 1849519f68cd26777c755763a644a7f7ed7ac389beb9Chris Lattner/// 1850519f68cd26777c755763a644a7f7ed7ac389beb9Chris Lattner/// PrefType is an LLVM IR type that corresponds to (part of) the IR type for 1851519f68cd26777c755763a644a7f7ed7ac389beb9Chris Lattner/// the source type. IROffset is an offset in bytes into the LLVM IR type that 1852519f68cd26777c755763a644a7f7ed7ac389beb9Chris Lattner/// the 8-byte value references. PrefType may be null. 1853519f68cd26777c755763a644a7f7ed7ac389beb9Chris Lattner/// 1854519f68cd26777c755763a644a7f7ed7ac389beb9Chris Lattner/// SourceTy is the source level type for the entire argument. SourceOffset is 1855519f68cd26777c755763a644a7f7ed7ac389beb9Chris Lattner/// an offset into this that we're processing (which is always either 0 or 8). 1856519f68cd26777c755763a644a7f7ed7ac389beb9Chris Lattner/// 18579cbe4f0ba01ec304e1e3d071c071f7bca33631c0Chris Lattnerllvm::Type *X86_64ABIInfo:: 18589cbe4f0ba01ec304e1e3d071c071f7bca33631c0Chris LattnerGetINTEGERTypeAtOffset(llvm::Type *IRType, unsigned IROffset, 18590d2656d77053cc2ed6f3a3acdf12d67807c7f3a2Chris Lattner QualType SourceTy, unsigned SourceOffset) const { 1860e2962be11e8894329d37985eccaa4f4a12dea402Chris Lattner // If we're dealing with an un-offset LLVM IR type, then it means that we're 1861e2962be11e8894329d37985eccaa4f4a12dea402Chris Lattner // returning an 8-byte unit starting with it. See if we can safely use it. 1862e2962be11e8894329d37985eccaa4f4a12dea402Chris Lattner if (IROffset == 0) { 1863e2962be11e8894329d37985eccaa4f4a12dea402Chris Lattner // Pointers and int64's always fill the 8-byte unit. 1864e2962be11e8894329d37985eccaa4f4a12dea402Chris Lattner if (isa<llvm::PointerType>(IRType) || IRType->isIntegerTy(64)) 1865e2962be11e8894329d37985eccaa4f4a12dea402Chris Lattner return IRType; 1866e2962be11e8894329d37985eccaa4f4a12dea402Chris Lattner 1867e2962be11e8894329d37985eccaa4f4a12dea402Chris Lattner // If we have a 1/2/4-byte integer, we can use it only if the rest of the 1868e2962be11e8894329d37985eccaa4f4a12dea402Chris Lattner // goodness in the source type is just tail padding. This is allowed to 1869e2962be11e8894329d37985eccaa4f4a12dea402Chris Lattner // kick in for struct {double,int} on the int, but not on 1870e2962be11e8894329d37985eccaa4f4a12dea402Chris Lattner // struct{double,int,int} because we wouldn't return the second int. We 1871e2962be11e8894329d37985eccaa4f4a12dea402Chris Lattner // have to do this analysis on the source type because we can't depend on 1872e2962be11e8894329d37985eccaa4f4a12dea402Chris Lattner // unions being lowered a specific way etc. 1873e2962be11e8894329d37985eccaa4f4a12dea402Chris Lattner if (IRType->isIntegerTy(8) || IRType->isIntegerTy(16) || 1874e2962be11e8894329d37985eccaa4f4a12dea402Chris Lattner IRType->isIntegerTy(32)) { 1875e2962be11e8894329d37985eccaa4f4a12dea402Chris Lattner unsigned BitWidth = cast<llvm::IntegerType>(IRType)->getBitWidth(); 18768bea82f6699e4384ef823cdc8800ad5db271177cMichael J. Spencer 1877e2962be11e8894329d37985eccaa4f4a12dea402Chris Lattner if (BitsContainNoUserData(SourceTy, SourceOffset*8+BitWidth, 1878e2962be11e8894329d37985eccaa4f4a12dea402Chris Lattner SourceOffset*8+64, getContext())) 1879e2962be11e8894329d37985eccaa4f4a12dea402Chris Lattner return IRType; 1880e2962be11e8894329d37985eccaa4f4a12dea402Chris Lattner } 1881e2962be11e8894329d37985eccaa4f4a12dea402Chris Lattner } 1882519f68cd26777c755763a644a7f7ed7ac389beb9Chris Lattner 18832acc6e3feda5e4f7d9009bdcf8b1cd777fecfe2dChris Lattner if (llvm::StructType *STy = dyn_cast<llvm::StructType>(IRType)) { 1884519f68cd26777c755763a644a7f7ed7ac389beb9Chris Lattner // If this is a struct, recurse into the field at the specified offset. 188544f0fd2804e9952a8dbf85bb60ee3501aa9f5ee7Chris Lattner const llvm::StructLayout *SL = getTargetData().getStructLayout(STy); 1886519f68cd26777c755763a644a7f7ed7ac389beb9Chris Lattner if (IROffset < SL->getSizeInBytes()) { 1887519f68cd26777c755763a644a7f7ed7ac389beb9Chris Lattner unsigned FieldIdx = SL->getElementContainingOffset(IROffset); 1888519f68cd26777c755763a644a7f7ed7ac389beb9Chris Lattner IROffset -= SL->getElementOffset(FieldIdx); 18898bea82f6699e4384ef823cdc8800ad5db271177cMichael J. Spencer 18900d2656d77053cc2ed6f3a3acdf12d67807c7f3a2Chris Lattner return GetINTEGERTypeAtOffset(STy->getElementType(FieldIdx), IROffset, 18910d2656d77053cc2ed6f3a3acdf12d67807c7f3a2Chris Lattner SourceTy, SourceOffset); 18928bea82f6699e4384ef823cdc8800ad5db271177cMichael J. Spencer } 1893519f68cd26777c755763a644a7f7ed7ac389beb9Chris Lattner } 18948bea82f6699e4384ef823cdc8800ad5db271177cMichael J. Spencer 18952acc6e3feda5e4f7d9009bdcf8b1cd777fecfe2dChris Lattner if (llvm::ArrayType *ATy = dyn_cast<llvm::ArrayType>(IRType)) { 18969cbe4f0ba01ec304e1e3d071c071f7bca33631c0Chris Lattner llvm::Type *EltTy = ATy->getElementType(); 1897021c3a349d4f55cc2c7970268758bcf37b924493Chris Lattner unsigned EltSize = getTargetData().getTypeAllocSize(EltTy); 1898021c3a349d4f55cc2c7970268758bcf37b924493Chris Lattner unsigned EltOffset = IROffset/EltSize*EltSize; 18990d2656d77053cc2ed6f3a3acdf12d67807c7f3a2Chris Lattner return GetINTEGERTypeAtOffset(EltTy, IROffset-EltOffset, SourceTy, 19000d2656d77053cc2ed6f3a3acdf12d67807c7f3a2Chris Lattner SourceOffset); 1901021c3a349d4f55cc2c7970268758bcf37b924493Chris Lattner } 19028bea82f6699e4384ef823cdc8800ad5db271177cMichael J. Spencer 1903519f68cd26777c755763a644a7f7ed7ac389beb9Chris Lattner // Okay, we don't have any better idea of what to pass, so we pass this in an 1904519f68cd26777c755763a644a7f7ed7ac389beb9Chris Lattner // integer register that isn't too big to fit the rest of the struct. 19059e45a3de3f462785a86bba77dee168ab354d9704Chris Lattner unsigned TySizeInBytes = 19069e45a3de3f462785a86bba77dee168ab354d9704Chris Lattner (unsigned)getContext().getTypeSizeInChars(SourceTy).getQuantity(); 1907519f68cd26777c755763a644a7f7ed7ac389beb9Chris Lattner 19089e45a3de3f462785a86bba77dee168ab354d9704Chris Lattner assert(TySizeInBytes != SourceOffset && "Empty field?"); 19098bea82f6699e4384ef823cdc8800ad5db271177cMichael J. Spencer 1910519f68cd26777c755763a644a7f7ed7ac389beb9Chris Lattner // It is always safe to classify this as an integer type up to i64 that 1911519f68cd26777c755763a644a7f7ed7ac389beb9Chris Lattner // isn't larger than the structure. 19129e45a3de3f462785a86bba77dee168ab354d9704Chris Lattner return llvm::IntegerType::get(getVMContext(), 19139e45a3de3f462785a86bba77dee168ab354d9704Chris Lattner std::min(TySizeInBytes-SourceOffset, 8U)*8); 1914519f68cd26777c755763a644a7f7ed7ac389beb9Chris Lattner} 1915519f68cd26777c755763a644a7f7ed7ac389beb9Chris Lattner 191666e7b68b0016aeebe349e21ace93ff0178665d69Chris Lattner 191766e7b68b0016aeebe349e21ace93ff0178665d69Chris Lattner/// GetX86_64ByValArgumentPair - Given a high and low type that can ideally 191866e7b68b0016aeebe349e21ace93ff0178665d69Chris Lattner/// be used as elements of a two register pair to pass or return, return a 191966e7b68b0016aeebe349e21ace93ff0178665d69Chris Lattner/// first class aggregate to represent them. For example, if the low part of 192066e7b68b0016aeebe349e21ace93ff0178665d69Chris Lattner/// a by-value argument should be passed as i32* and the high part as float, 192166e7b68b0016aeebe349e21ace93ff0178665d69Chris Lattner/// return {i32*, float}. 19229cbe4f0ba01ec304e1e3d071c071f7bca33631c0Chris Lattnerstatic llvm::Type * 1923ef6de3da8572607f786303c07150daa6e140ab19Jay FoadGetX86_64ByValArgumentPair(llvm::Type *Lo, llvm::Type *Hi, 192466e7b68b0016aeebe349e21ace93ff0178665d69Chris Lattner const llvm::TargetData &TD) { 192566e7b68b0016aeebe349e21ace93ff0178665d69Chris Lattner // In order to correctly satisfy the ABI, we need to the high part to start 192666e7b68b0016aeebe349e21ace93ff0178665d69Chris Lattner // at offset 8. If the high and low parts we inferred are both 4-byte types 192766e7b68b0016aeebe349e21ace93ff0178665d69Chris Lattner // (e.g. i32 and i32) then the resultant struct type ({i32,i32}) won't have 192866e7b68b0016aeebe349e21ace93ff0178665d69Chris Lattner // the second element at offset 8. Check for this: 192966e7b68b0016aeebe349e21ace93ff0178665d69Chris Lattner unsigned LoSize = (unsigned)TD.getTypeAllocSize(Lo); 193066e7b68b0016aeebe349e21ace93ff0178665d69Chris Lattner unsigned HiAlign = TD.getABITypeAlignment(Hi); 193166e7b68b0016aeebe349e21ace93ff0178665d69Chris Lattner unsigned HiStart = llvm::TargetData::RoundUpAlignment(LoSize, HiAlign); 193266e7b68b0016aeebe349e21ace93ff0178665d69Chris Lattner assert(HiStart != 0 && HiStart <= 8 && "Invalid x86-64 argument pair!"); 19339cac4942b920d4c5514e71949e3062ed626bfbdfMichael J. Spencer 193466e7b68b0016aeebe349e21ace93ff0178665d69Chris Lattner // To handle this, we have to increase the size of the low part so that the 193566e7b68b0016aeebe349e21ace93ff0178665d69Chris Lattner // second element will start at an 8 byte offset. We can't increase the size 193666e7b68b0016aeebe349e21ace93ff0178665d69Chris Lattner // of the second element because it might make us access off the end of the 193766e7b68b0016aeebe349e21ace93ff0178665d69Chris Lattner // struct. 193866e7b68b0016aeebe349e21ace93ff0178665d69Chris Lattner if (HiStart != 8) { 193966e7b68b0016aeebe349e21ace93ff0178665d69Chris Lattner // There are only two sorts of types the ABI generation code can produce for 194066e7b68b0016aeebe349e21ace93ff0178665d69Chris Lattner // the low part of a pair that aren't 8 bytes in size: float or i8/i16/i32. 194166e7b68b0016aeebe349e21ace93ff0178665d69Chris Lattner // Promote these to a larger type. 194266e7b68b0016aeebe349e21ace93ff0178665d69Chris Lattner if (Lo->isFloatTy()) 194366e7b68b0016aeebe349e21ace93ff0178665d69Chris Lattner Lo = llvm::Type::getDoubleTy(Lo->getContext()); 194466e7b68b0016aeebe349e21ace93ff0178665d69Chris Lattner else { 194566e7b68b0016aeebe349e21ace93ff0178665d69Chris Lattner assert(Lo->isIntegerTy() && "Invalid/unknown lo type"); 194666e7b68b0016aeebe349e21ace93ff0178665d69Chris Lattner Lo = llvm::Type::getInt64Ty(Lo->getContext()); 194766e7b68b0016aeebe349e21ace93ff0178665d69Chris Lattner } 194866e7b68b0016aeebe349e21ace93ff0178665d69Chris Lattner } 19499cac4942b920d4c5514e71949e3062ed626bfbdfMichael J. Spencer 19509cbe4f0ba01ec304e1e3d071c071f7bca33631c0Chris Lattner llvm::StructType *Result = llvm::StructType::get(Lo, Hi, NULL); 19519cac4942b920d4c5514e71949e3062ed626bfbdfMichael J. Spencer 19529cac4942b920d4c5514e71949e3062ed626bfbdfMichael J. Spencer 195366e7b68b0016aeebe349e21ace93ff0178665d69Chris Lattner // Verify that the second element is at an 8-byte offset. 195466e7b68b0016aeebe349e21ace93ff0178665d69Chris Lattner assert(TD.getStructLayout(Result)->getElementOffset(1) == 8 && 195566e7b68b0016aeebe349e21ace93ff0178665d69Chris Lattner "Invalid x86-64 argument pair!"); 195666e7b68b0016aeebe349e21ace93ff0178665d69Chris Lattner return Result; 195766e7b68b0016aeebe349e21ace93ff0178665d69Chris Lattner} 195866e7b68b0016aeebe349e21ace93ff0178665d69Chris Lattner 19591090a9ba0902380dbd97d0a500daa4c373712df9Chris LattnerABIArgInfo X86_64ABIInfo:: 1960a3c109bbf6e198f463fbe204da4d25b40dab65c4Chris LattnerclassifyReturnType(QualType RetTy) const { 1961c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // AMD64-ABI 3.2.3p4: Rule 1. Classify the return type with the 1962c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // classification algorithm. 1963c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov X86_64ABIInfo::Class Lo, Hi; 19649c254f0415bef9a0bafe5b5026ddb54b727597b1Chris Lattner classify(RetTy, 0, Lo, Hi); 1965c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 1966c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // Check some invariants. 1967c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov assert((Hi != Memory || Lo == Memory) && "Invalid memory classification."); 1968c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov assert((Hi != SSEUp || Lo == SSE) && "Invalid SSEUp classification."); 1969c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 19709cbe4f0ba01ec304e1e3d071c071f7bca33631c0Chris Lattner llvm::Type *ResType = 0; 1971c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov switch (Lo) { 1972c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov case NoClass: 1973117e3f4cd4d6ea41c3202da8729f94168c5c8239Chris Lattner if (Hi == NoClass) 1974117e3f4cd4d6ea41c3202da8729f94168c5c8239Chris Lattner return ABIArgInfo::getIgnore(); 1975117e3f4cd4d6ea41c3202da8729f94168c5c8239Chris Lattner // If the low part is just padding, it takes no register, leave ResType 1976117e3f4cd4d6ea41c3202da8729f94168c5c8239Chris Lattner // null. 1977117e3f4cd4d6ea41c3202da8729f94168c5c8239Chris Lattner assert((Hi == SSE || Hi == Integer || Hi == X87Up) && 1978117e3f4cd4d6ea41c3202da8729f94168c5c8239Chris Lattner "Unknown missing lo part"); 1979117e3f4cd4d6ea41c3202da8729f94168c5c8239Chris Lattner break; 1980c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 1981c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov case SSEUp: 1982c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov case X87Up: 1983b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie llvm_unreachable("Invalid classification for lo word."); 1984c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 1985c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // AMD64-ABI 3.2.3p4: Rule 2. Types of class memory are returned via 1986c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // hidden argument. 1987c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov case Memory: 19889c254f0415bef9a0bafe5b5026ddb54b727597b1Chris Lattner return getIndirectReturnResult(RetTy); 1989c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 1990c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // AMD64-ABI 3.2.3p4: Rule 3. If the class is INTEGER, the next 1991c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // available register of the sequence %rax, %rdx is used. 1992c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov case Integer: 19939cbe4f0ba01ec304e1e3d071c071f7bca33631c0Chris Lattner ResType = GetINTEGERTypeAtOffset(CGT.ConvertType(RetTy), 0, RetTy, 0); 19948bea82f6699e4384ef823cdc8800ad5db271177cMichael J. Spencer 1995eb518b4b89e4134b21975530809697142f69b779Chris Lattner // If we have a sign or zero extended integer, make sure to return Extend 1996eb518b4b89e4134b21975530809697142f69b779Chris Lattner // so that the parameter gets the right LLVM IR attributes. 1997eb518b4b89e4134b21975530809697142f69b779Chris Lattner if (Hi == NoClass && isa<llvm::IntegerType>(ResType)) { 1998eb518b4b89e4134b21975530809697142f69b779Chris Lattner // Treat an enum type as its underlying type. 1999eb518b4b89e4134b21975530809697142f69b779Chris Lattner if (const EnumType *EnumTy = RetTy->getAs<EnumType>()) 2000eb518b4b89e4134b21975530809697142f69b779Chris Lattner RetTy = EnumTy->getDecl()->getIntegerType(); 20018bea82f6699e4384ef823cdc8800ad5db271177cMichael J. Spencer 2002eb518b4b89e4134b21975530809697142f69b779Chris Lattner if (RetTy->isIntegralOrEnumerationType() && 2003eb518b4b89e4134b21975530809697142f69b779Chris Lattner RetTy->isPromotableIntegerType()) 2004eb518b4b89e4134b21975530809697142f69b779Chris Lattner return ABIArgInfo::getExtend(); 2005eb518b4b89e4134b21975530809697142f69b779Chris Lattner } 2006519f68cd26777c755763a644a7f7ed7ac389beb9Chris Lattner break; 2007c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 2008c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // AMD64-ABI 3.2.3p4: Rule 4. If the class is SSE, the next 2009c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // available SSE register of the sequence %xmm0, %xmm1 is used. 2010c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov case SSE: 20119cbe4f0ba01ec304e1e3d071c071f7bca33631c0Chris Lattner ResType = GetSSETypeAtOffset(CGT.ConvertType(RetTy), 0, RetTy, 0); 20120b30c67132f00c667512a65cfe1fe81ae54c2383Chris Lattner break; 2013c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 2014c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // AMD64-ABI 3.2.3p4: Rule 6. If the class is X87, the value is 2015c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // returned on the X87 stack in %st0 as 80-bit x87 number. 2016c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov case X87: 2017ea0443212e7ec6ff82e2f174e8e948a6eb0e0876Chris Lattner ResType = llvm::Type::getX86_FP80Ty(getVMContext()); 20180b30c67132f00c667512a65cfe1fe81ae54c2383Chris Lattner break; 2019c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 2020c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // AMD64-ABI 3.2.3p4: Rule 8. If the class is COMPLEX_X87, the real 2021c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // part of the value is returned in %st0 and the imaginary part in 2022c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // %st1. 2023c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov case ComplexX87: 2024c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov assert(Hi == ComplexX87 && "Unexpected ComplexX87 classification."); 20257650d95a1a616ea300f37126a8dfc93dc19a662aChris Lattner ResType = llvm::StructType::get(llvm::Type::getX86_FP80Ty(getVMContext()), 2026ea0443212e7ec6ff82e2f174e8e948a6eb0e0876Chris Lattner llvm::Type::getX86_FP80Ty(getVMContext()), 2027c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov NULL); 2028c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov break; 2029c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov } 2030c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 20319cbe4f0ba01ec304e1e3d071c071f7bca33631c0Chris Lattner llvm::Type *HighPart = 0; 2032c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov switch (Hi) { 2033c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // Memory was handled previously and X87 should 2034c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // never occur as a hi class. 2035c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov case Memory: 2036c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov case X87: 2037b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie llvm_unreachable("Invalid classification for hi word."); 2038c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 2039c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov case ComplexX87: // Previously handled. 20400b30c67132f00c667512a65cfe1fe81ae54c2383Chris Lattner case NoClass: 20410b30c67132f00c667512a65cfe1fe81ae54c2383Chris Lattner break; 2042c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 20433db4dde12de84269c8f803f9dfca37a2d14f9898Chris Lattner case Integer: 20449cbe4f0ba01ec304e1e3d071c071f7bca33631c0Chris Lattner HighPart = GetINTEGERTypeAtOffset(CGT.ConvertType(RetTy), 8, RetTy, 8); 20453db4dde12de84269c8f803f9dfca37a2d14f9898Chris Lattner if (Lo == NoClass) // Return HighPart at offset 8 in memory. 20463db4dde12de84269c8f803f9dfca37a2d14f9898Chris Lattner return ABIArgInfo::getDirect(HighPart, 8); 2047c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov break; 20483db4dde12de84269c8f803f9dfca37a2d14f9898Chris Lattner case SSE: 20499cbe4f0ba01ec304e1e3d071c071f7bca33631c0Chris Lattner HighPart = GetSSETypeAtOffset(CGT.ConvertType(RetTy), 8, RetTy, 8); 20503db4dde12de84269c8f803f9dfca37a2d14f9898Chris Lattner if (Lo == NoClass) // Return HighPart at offset 8 in memory. 20513db4dde12de84269c8f803f9dfca37a2d14f9898Chris Lattner return ABIArgInfo::getDirect(HighPart, 8); 2052c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov break; 2053c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 2054c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // AMD64-ABI 3.2.3p4: Rule 5. If the class is SSEUP, the eightbyte 20554943c15df59fdec444656a48c16e72a2077ab61fBruno Cardoso Lopes // is passed in the next available eightbyte chunk if the last used 20564943c15df59fdec444656a48c16e72a2077ab61fBruno Cardoso Lopes // vector register. 2057c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // 2058fc8f0e14ad142ed811e90fbd9a30e419e301c717Chris Lattner // SSEUP should always be preceded by SSE, just widen. 2059c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov case SSEUp: 2060c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov assert(Lo == SSE && "Unexpected SSEUp classification."); 20614943c15df59fdec444656a48c16e72a2077ab61fBruno Cardoso Lopes ResType = GetByteVectorType(RetTy); 2062c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov break; 2063c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 2064c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // AMD64-ABI 3.2.3p4: Rule 7. If the class is X87UP, the value is 2065c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // returned together with the previous X87 value in %st0. 2066c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov case X87Up: 2067fc8f0e14ad142ed811e90fbd9a30e419e301c717Chris Lattner // If X87Up is preceded by X87, we don't need to do 2068c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // anything. However, in some cases with unions it may not be 2069fc8f0e14ad142ed811e90fbd9a30e419e301c717Chris Lattner // preceded by X87. In such situations we follow gcc and pass the 2070c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // extra bits in an SSE reg. 2071603519d269d48dca99927f0ad65e92099bd76161Chris Lattner if (Lo != X87) { 20729cbe4f0ba01ec304e1e3d071c071f7bca33631c0Chris Lattner HighPart = GetSSETypeAtOffset(CGT.ConvertType(RetTy), 8, RetTy, 8); 20733db4dde12de84269c8f803f9dfca37a2d14f9898Chris Lattner if (Lo == NoClass) // Return HighPart at offset 8 in memory. 20743db4dde12de84269c8f803f9dfca37a2d14f9898Chris Lattner return ABIArgInfo::getDirect(HighPart, 8); 2075603519d269d48dca99927f0ad65e92099bd76161Chris Lattner } 2076c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov break; 2077c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov } 20789cac4942b920d4c5514e71949e3062ed626bfbdfMichael J. Spencer 20793db4dde12de84269c8f803f9dfca37a2d14f9898Chris Lattner // If a high part was specified, merge it together with the low part. It is 2080645406a3d3405ad0f4b5a0e46a34ae92d9d23bd3Chris Lattner // known to pass in the high eightbyte of the result. We do this by forming a 2081645406a3d3405ad0f4b5a0e46a34ae92d9d23bd3Chris Lattner // first class struct aggregate with the high and low part: {low, high} 208266e7b68b0016aeebe349e21ace93ff0178665d69Chris Lattner if (HighPart) 208366e7b68b0016aeebe349e21ace93ff0178665d69Chris Lattner ResType = GetX86_64ByValArgumentPair(ResType, HighPart, getTargetData()); 2084c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 2085eb518b4b89e4134b21975530809697142f69b779Chris Lattner return ABIArgInfo::getDirect(ResType); 20869c254f0415bef9a0bafe5b5026ddb54b727597b1Chris Lattner} 20879c254f0415bef9a0bafe5b5026ddb54b727597b1Chris Lattner 2088edfac0302490d84419eb958c812c533b8df29785Daniel DunbarABIArgInfo X86_64ABIInfo::classifyArgumentType( 2089edfac0302490d84419eb958c812c533b8df29785Daniel Dunbar QualType Ty, unsigned freeIntRegs, unsigned &neededInt, unsigned &neededSSE) 2090edfac0302490d84419eb958c812c533b8df29785Daniel Dunbar const 2091edfac0302490d84419eb958c812c533b8df29785Daniel Dunbar{ 2092c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov X86_64ABIInfo::Class Lo, Hi; 20939c254f0415bef9a0bafe5b5026ddb54b727597b1Chris Lattner classify(Ty, 0, Lo, Hi); 20948bea82f6699e4384ef823cdc8800ad5db271177cMichael J. Spencer 2095c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // Check some invariants. 2096c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // FIXME: Enforce these by construction. 2097c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov assert((Hi != Memory || Lo == Memory) && "Invalid memory classification."); 2098c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov assert((Hi != SSEUp || Lo == SSE) && "Invalid SSEUp classification."); 2099c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 2100c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov neededInt = 0; 2101c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov neededSSE = 0; 21029cbe4f0ba01ec304e1e3d071c071f7bca33631c0Chris Lattner llvm::Type *ResType = 0; 2103c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov switch (Lo) { 2104c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov case NoClass: 2105117e3f4cd4d6ea41c3202da8729f94168c5c8239Chris Lattner if (Hi == NoClass) 2106117e3f4cd4d6ea41c3202da8729f94168c5c8239Chris Lattner return ABIArgInfo::getIgnore(); 2107117e3f4cd4d6ea41c3202da8729f94168c5c8239Chris Lattner // If the low part is just padding, it takes no register, leave ResType 2108117e3f4cd4d6ea41c3202da8729f94168c5c8239Chris Lattner // null. 2109117e3f4cd4d6ea41c3202da8729f94168c5c8239Chris Lattner assert((Hi == SSE || Hi == Integer || Hi == X87Up) && 2110117e3f4cd4d6ea41c3202da8729f94168c5c8239Chris Lattner "Unknown missing lo part"); 2111117e3f4cd4d6ea41c3202da8729f94168c5c8239Chris Lattner break; 21128bea82f6699e4384ef823cdc8800ad5db271177cMichael J. Spencer 2113c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // AMD64-ABI 3.2.3p3: Rule 1. If the class is MEMORY, pass the argument 2114c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // on the stack. 2115c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov case Memory: 2116c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 2117c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // AMD64-ABI 3.2.3p3: Rule 5. If the class is X87, X87UP or 2118c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // COMPLEX_X87, it is passed in memory. 2119c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov case X87: 2120c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov case ComplexX87: 2121ded137fcab19f0aace08a28b5c91574e6b23debcEli Friedman if (isRecordWithNonTrivialDestructorOrCopyConstructor(Ty)) 2122ded137fcab19f0aace08a28b5c91574e6b23debcEli Friedman ++neededInt; 2123edfac0302490d84419eb958c812c533b8df29785Daniel Dunbar return getIndirectResult(Ty, freeIntRegs); 2124c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 2125c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov case SSEUp: 2126c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov case X87Up: 2127b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie llvm_unreachable("Invalid classification for lo word."); 2128c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 2129c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // AMD64-ABI 3.2.3p3: Rule 2. If the class is INTEGER, the next 2130c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // available register of the sequence %rdi, %rsi, %rdx, %rcx, %r8 2131c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // and %r9 is used. 2132c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov case Integer: 21339c254f0415bef9a0bafe5b5026ddb54b727597b1Chris Lattner ++neededInt; 21348bea82f6699e4384ef823cdc8800ad5db271177cMichael J. Spencer 213549382de42c2a411bfd772408e987cb399071241dChris Lattner // Pick an 8-byte type based on the preferred type. 21369cbe4f0ba01ec304e1e3d071c071f7bca33631c0Chris Lattner ResType = GetINTEGERTypeAtOffset(CGT.ConvertType(Ty), 0, Ty, 0); 2137eb518b4b89e4134b21975530809697142f69b779Chris Lattner 2138eb518b4b89e4134b21975530809697142f69b779Chris Lattner // If we have a sign or zero extended integer, make sure to return Extend 2139eb518b4b89e4134b21975530809697142f69b779Chris Lattner // so that the parameter gets the right LLVM IR attributes. 2140eb518b4b89e4134b21975530809697142f69b779Chris Lattner if (Hi == NoClass && isa<llvm::IntegerType>(ResType)) { 2141eb518b4b89e4134b21975530809697142f69b779Chris Lattner // Treat an enum type as its underlying type. 2142eb518b4b89e4134b21975530809697142f69b779Chris Lattner if (const EnumType *EnumTy = Ty->getAs<EnumType>()) 2143eb518b4b89e4134b21975530809697142f69b779Chris Lattner Ty = EnumTy->getDecl()->getIntegerType(); 21448bea82f6699e4384ef823cdc8800ad5db271177cMichael J. Spencer 2145eb518b4b89e4134b21975530809697142f69b779Chris Lattner if (Ty->isIntegralOrEnumerationType() && 2146eb518b4b89e4134b21975530809697142f69b779Chris Lattner Ty->isPromotableIntegerType()) 2147eb518b4b89e4134b21975530809697142f69b779Chris Lattner return ABIArgInfo::getExtend(); 2148eb518b4b89e4134b21975530809697142f69b779Chris Lattner } 21498bea82f6699e4384ef823cdc8800ad5db271177cMichael J. Spencer 2150c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov break; 2151c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 2152c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // AMD64-ABI 3.2.3p3: Rule 3. If the class is SSE, the next 2153c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // available SSE register is used, the registers are taken in the 2154c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // order from %xmm0 to %xmm7. 2155bb465d7d0489a6605bb1eb82dea87350066ac5e2Bill Wendling case SSE: { 21569cbe4f0ba01ec304e1e3d071c071f7bca33631c0Chris Lattner llvm::Type *IRType = CGT.ConvertType(Ty); 215714508ff0bffee0fdfe5d336946c6db0e709099c8Eli Friedman ResType = GetSSETypeAtOffset(IRType, 0, Ty, 0); 215899aaae87ae972ac2dd4cccd8b4886537aabaff43Bill Wendling ++neededSSE; 2159c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov break; 2160c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov } 2161bb465d7d0489a6605bb1eb82dea87350066ac5e2Bill Wendling } 2162c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 21639cbe4f0ba01ec304e1e3d071c071f7bca33631c0Chris Lattner llvm::Type *HighPart = 0; 2164c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov switch (Hi) { 2165c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // Memory was handled previously, ComplexX87 and X87 should 2166fc8f0e14ad142ed811e90fbd9a30e419e301c717Chris Lattner // never occur as hi classes, and X87Up must be preceded by X87, 2167c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // which is passed in memory. 2168c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov case Memory: 2169c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov case X87: 2170c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov case ComplexX87: 2171b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie llvm_unreachable("Invalid classification for hi word."); 2172c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 2173c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov case NoClass: break; 21748bea82f6699e4384ef823cdc8800ad5db271177cMichael J. Spencer 2175645406a3d3405ad0f4b5a0e46a34ae92d9d23bd3Chris Lattner case Integer: 2176c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov ++neededInt; 217749382de42c2a411bfd772408e987cb399071241dChris Lattner // Pick an 8-byte type based on the preferred type. 21789cbe4f0ba01ec304e1e3d071c071f7bca33631c0Chris Lattner HighPart = GetINTEGERTypeAtOffset(CGT.ConvertType(Ty), 8, Ty, 8); 2179117e3f4cd4d6ea41c3202da8729f94168c5c8239Chris Lattner 2180645406a3d3405ad0f4b5a0e46a34ae92d9d23bd3Chris Lattner if (Lo == NoClass) // Pass HighPart at offset 8 in memory. 2181645406a3d3405ad0f4b5a0e46a34ae92d9d23bd3Chris Lattner return ABIArgInfo::getDirect(HighPart, 8); 2182c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov break; 2183c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 2184c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // X87Up generally doesn't occur here (long double is passed in 2185c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // memory), except in situations involving unions. 2186c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov case X87Up: 2187645406a3d3405ad0f4b5a0e46a34ae92d9d23bd3Chris Lattner case SSE: 21889cbe4f0ba01ec304e1e3d071c071f7bca33631c0Chris Lattner HighPart = GetSSETypeAtOffset(CGT.ConvertType(Ty), 8, Ty, 8); 21898bea82f6699e4384ef823cdc8800ad5db271177cMichael J. Spencer 2190645406a3d3405ad0f4b5a0e46a34ae92d9d23bd3Chris Lattner if (Lo == NoClass) // Pass HighPart at offset 8 in memory. 2191645406a3d3405ad0f4b5a0e46a34ae92d9d23bd3Chris Lattner return ABIArgInfo::getDirect(HighPart, 8); 2192117e3f4cd4d6ea41c3202da8729f94168c5c8239Chris Lattner 2193c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov ++neededSSE; 2194c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov break; 2195c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 2196c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // AMD64-ABI 3.2.3p3: Rule 4. If the class is SSEUP, the 2197c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // eightbyte is passed in the upper half of the last used SSE 21988bea82f6699e4384ef823cdc8800ad5db271177cMichael J. Spencer // register. This only happens when 128-bit vectors are passed. 2199c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov case SSEUp: 2200ab5722e67794b3954c874a369086fc5f41ac46a5Chris Lattner assert(Lo == SSE && "Unexpected SSEUp classification"); 22014943c15df59fdec444656a48c16e72a2077ab61fBruno Cardoso Lopes ResType = GetByteVectorType(Ty); 2202c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov break; 2203c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov } 2204c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 2205645406a3d3405ad0f4b5a0e46a34ae92d9d23bd3Chris Lattner // If a high part was specified, merge it together with the low part. It is 2206645406a3d3405ad0f4b5a0e46a34ae92d9d23bd3Chris Lattner // known to pass in the high eightbyte of the result. We do this by forming a 2207645406a3d3405ad0f4b5a0e46a34ae92d9d23bd3Chris Lattner // first class struct aggregate with the high and low part: {low, high} 2208645406a3d3405ad0f4b5a0e46a34ae92d9d23bd3Chris Lattner if (HighPart) 220966e7b68b0016aeebe349e21ace93ff0178665d69Chris Lattner ResType = GetX86_64ByValArgumentPair(ResType, HighPart, getTargetData()); 22109cac4942b920d4c5514e71949e3062ed626bfbdfMichael J. Spencer 2211eb518b4b89e4134b21975530809697142f69b779Chris Lattner return ABIArgInfo::getDirect(ResType); 2212c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov} 2213c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 2214ee5dcd064a811edc90f6c1fb31a837b6c961fed7Chris Lattnervoid X86_64ABIInfo::computeInfo(CGFunctionInfo &FI) const { 22158bea82f6699e4384ef823cdc8800ad5db271177cMichael J. Spencer 2216a3c109bbf6e198f463fbe204da4d25b40dab65c4Chris Lattner FI.getReturnInfo() = classifyReturnType(FI.getReturnType()); 2217c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 2218c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // Keep track of the number of assigned registers. 221999aaae87ae972ac2dd4cccd8b4886537aabaff43Bill Wendling unsigned freeIntRegs = 6, freeSSERegs = 8; 2220c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 2221c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // If the return value is indirect, then the hidden argument is consuming one 2222c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // integer register. 2223c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov if (FI.getReturnInfo().isIndirect()) 2224c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov --freeIntRegs; 2225c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 2226c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // AMD64-ABI 3.2.3p3: Once arguments are classified, the registers 2227c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // get assigned (in left-to-right order) for passing as follows... 2228c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov for (CGFunctionInfo::arg_iterator it = FI.arg_begin(), ie = FI.arg_end(); 2229c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov it != ie; ++it) { 223099aaae87ae972ac2dd4cccd8b4886537aabaff43Bill Wendling unsigned neededInt, neededSSE; 2231edfac0302490d84419eb958c812c533b8df29785Daniel Dunbar it->info = classifyArgumentType(it->type, freeIntRegs, neededInt, 2232edfac0302490d84419eb958c812c533b8df29785Daniel Dunbar neededSSE); 2233c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 2234c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // AMD64-ABI 3.2.3p3: If there are no registers available for any 2235c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // eightbyte of an argument, the whole argument is passed on the 2236c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // stack. If registers have already been assigned for some 2237c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // eightbytes of such an argument, the assignments get reverted. 223899aaae87ae972ac2dd4cccd8b4886537aabaff43Bill Wendling if (freeIntRegs >= neededInt && freeSSERegs >= neededSSE) { 2239c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov freeIntRegs -= neededInt; 2240c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov freeSSERegs -= neededSSE; 2241c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov } else { 2242edfac0302490d84419eb958c812c533b8df29785Daniel Dunbar it->info = getIndirectResult(it->type, freeIntRegs); 2243c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov } 2244c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov } 2245c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov} 2246c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 2247c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikovstatic llvm::Value *EmitVAArgFromMemory(llvm::Value *VAListAddr, 2248c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov QualType Ty, 2249c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov CodeGenFunction &CGF) { 2250c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov llvm::Value *overflow_arg_area_p = 2251c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov CGF.Builder.CreateStructGEP(VAListAddr, 2, "overflow_arg_area_p"); 2252c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov llvm::Value *overflow_arg_area = 2253c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov CGF.Builder.CreateLoad(overflow_arg_area_p, "overflow_arg_area"); 2254c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 2255c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // AMD64-ABI 3.5.7p5: Step 7. Align l->overflow_arg_area upwards to a 16 2256c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // byte boundary if alignment needed by type exceeds 8 byte boundary. 22578d2fe42417fcc861b3324d585dc29ac4da59bee0Eli Friedman // It isn't stated explicitly in the standard, but in practice we use 22588d2fe42417fcc861b3324d585dc29ac4da59bee0Eli Friedman // alignment greater than 16 where necessary. 2259c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov uint64_t Align = CGF.getContext().getTypeAlign(Ty) / 8; 2260c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov if (Align > 8) { 22618d2fe42417fcc861b3324d585dc29ac4da59bee0Eli Friedman // overflow_arg_area = (overflow_arg_area + align - 1) & -align; 22620032b2781b4deb131f8c9b7968f2030bf2489cddOwen Anderson llvm::Value *Offset = 22638d2fe42417fcc861b3324d585dc29ac4da59bee0Eli Friedman llvm::ConstantInt::get(CGF.Int64Ty, Align - 1); 2264c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov overflow_arg_area = CGF.Builder.CreateGEP(overflow_arg_area, Offset); 2265c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov llvm::Value *AsInt = CGF.Builder.CreatePtrToInt(overflow_arg_area, 226677b89b87c3b9220fea1bc80f6d6598d2003cc8a8Chris Lattner CGF.Int64Ty); 22678d2fe42417fcc861b3324d585dc29ac4da59bee0Eli Friedman llvm::Value *Mask = llvm::ConstantInt::get(CGF.Int64Ty, -(uint64_t)Align); 2268c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov overflow_arg_area = 2269c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov CGF.Builder.CreateIntToPtr(CGF.Builder.CreateAnd(AsInt, Mask), 2270c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov overflow_arg_area->getType(), 2271c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov "overflow_arg_area.align"); 2272c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov } 2273c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 2274c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // AMD64-ABI 3.5.7p5: Step 8. Fetch type from l->overflow_arg_area. 22752acc6e3feda5e4f7d9009bdcf8b1cd777fecfe2dChris Lattner llvm::Type *LTy = CGF.ConvertTypeForMem(Ty); 2276c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov llvm::Value *Res = 2277c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov CGF.Builder.CreateBitCast(overflow_arg_area, 227896e0fc726c6fe7538522c60743705d5e696b40afOwen Anderson llvm::PointerType::getUnqual(LTy)); 2279c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 2280c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // AMD64-ABI 3.5.7p5: Step 9. Set l->overflow_arg_area to: 2281c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // l->overflow_arg_area + sizeof(type). 2282c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // AMD64-ABI 3.5.7p5: Step 10. Align l->overflow_arg_area upwards to 2283c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // an 8 byte boundary. 2284c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 2285c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov uint64_t SizeInBytes = (CGF.getContext().getTypeSize(Ty) + 7) / 8; 22860032b2781b4deb131f8c9b7968f2030bf2489cddOwen Anderson llvm::Value *Offset = 228777b89b87c3b9220fea1bc80f6d6598d2003cc8a8Chris Lattner llvm::ConstantInt::get(CGF.Int32Ty, (SizeInBytes + 7) & ~7); 2288c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov overflow_arg_area = CGF.Builder.CreateGEP(overflow_arg_area, Offset, 2289c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov "overflow_arg_area.next"); 2290c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov CGF.Builder.CreateStore(overflow_arg_area, overflow_arg_area_p); 2291c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 2292c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // AMD64-ABI 3.5.7p5: Step 11. Return the fetched type. 2293c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov return Res; 2294c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov} 2295c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 2296c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikovllvm::Value *X86_64ABIInfo::EmitVAArg(llvm::Value *VAListAddr, QualType Ty, 2297c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov CodeGenFunction &CGF) const { 2298c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // Assume that va_list type is correct; should be pointer to LLVM type: 2299c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // struct { 2300c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // i32 gp_offset; 2301c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // i32 fp_offset; 2302c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // i8* overflow_arg_area; 2303c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // i8* reg_save_area; 2304c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // }; 230599aaae87ae972ac2dd4cccd8b4886537aabaff43Bill Wendling unsigned neededInt, neededSSE; 23068bea82f6699e4384ef823cdc8800ad5db271177cMichael J. Spencer 2307a14db75641f377ef8b033c67653cd95ac4c36fe3Chris Lattner Ty = CGF.getContext().getCanonicalType(Ty); 2308edfac0302490d84419eb958c812c533b8df29785Daniel Dunbar ABIArgInfo AI = classifyArgumentType(Ty, 0, neededInt, neededSSE); 2309c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 2310c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // AMD64-ABI 3.5.7p5: Step 1. Determine whether type may be passed 2311c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // in the registers. If not go to step 7. 2312c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov if (!neededInt && !neededSSE) 2313c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov return EmitVAArgFromMemory(VAListAddr, Ty, CGF); 2314c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 2315c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // AMD64-ABI 3.5.7p5: Step 2. Compute num_gp to hold the number of 2316c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // general purpose registers needed to pass type and num_fp to hold 2317c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // the number of floating point registers needed. 2318c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 2319c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // AMD64-ABI 3.5.7p5: Step 3. Verify whether arguments fit into 2320c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // registers. In the case: l->gp_offset > 48 - num_gp * 8 or 2321c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // l->fp_offset > 304 - num_fp * 16 go to step 7. 2322c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // 2323c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // NOTE: 304 is a typo, there are (6 * 8 + 8 * 16) = 176 bytes of 2324c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // register save space). 2325c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 2326c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov llvm::Value *InRegs = 0; 2327c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov llvm::Value *gp_offset_p = 0, *gp_offset = 0; 2328c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov llvm::Value *fp_offset_p = 0, *fp_offset = 0; 2329c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov if (neededInt) { 2330c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov gp_offset_p = CGF.Builder.CreateStructGEP(VAListAddr, 0, "gp_offset_p"); 2331c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov gp_offset = CGF.Builder.CreateLoad(gp_offset_p, "gp_offset"); 23321090a9ba0902380dbd97d0a500daa4c373712df9Chris Lattner InRegs = llvm::ConstantInt::get(CGF.Int32Ty, 48 - neededInt * 8); 23331090a9ba0902380dbd97d0a500daa4c373712df9Chris Lattner InRegs = CGF.Builder.CreateICmpULE(gp_offset, InRegs, "fits_in_gp"); 2334c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov } 2335c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 2336c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov if (neededSSE) { 2337c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov fp_offset_p = CGF.Builder.CreateStructGEP(VAListAddr, 1, "fp_offset_p"); 2338c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov fp_offset = CGF.Builder.CreateLoad(fp_offset_p, "fp_offset"); 2339c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov llvm::Value *FitsInFP = 23401090a9ba0902380dbd97d0a500daa4c373712df9Chris Lattner llvm::ConstantInt::get(CGF.Int32Ty, 176 - neededSSE * 16); 23411090a9ba0902380dbd97d0a500daa4c373712df9Chris Lattner FitsInFP = CGF.Builder.CreateICmpULE(fp_offset, FitsInFP, "fits_in_fp"); 2342c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov InRegs = InRegs ? CGF.Builder.CreateAnd(InRegs, FitsInFP) : FitsInFP; 2343c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov } 2344c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 2345c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov llvm::BasicBlock *InRegBlock = CGF.createBasicBlock("vaarg.in_reg"); 2346c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov llvm::BasicBlock *InMemBlock = CGF.createBasicBlock("vaarg.in_mem"); 2347c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov llvm::BasicBlock *ContBlock = CGF.createBasicBlock("vaarg.end"); 2348c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov CGF.Builder.CreateCondBr(InRegs, InRegBlock, InMemBlock); 2349c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 2350c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // Emit code to load the value if it was passed in registers. 2351c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 2352c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov CGF.EmitBlock(InRegBlock); 2353c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 2354c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // AMD64-ABI 3.5.7p5: Step 4. Fetch type from l->reg_save_area with 2355c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // an offset of l->gp_offset and/or l->fp_offset. This may require 2356c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // copying to a temporary location in case the parameter is passed 2357c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // in different register classes or requires an alignment greater 2358c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // than 8 for general purpose registers and 16 for XMM registers. 2359c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // 2360c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // FIXME: This really results in shameful code when we end up needing to 2361c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // collect arguments from different places; often what should result in a 2362c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // simple assembling of a structure from scattered addresses has many more 2363c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // loads than necessary. Can we clean this up? 23642acc6e3feda5e4f7d9009bdcf8b1cd777fecfe2dChris Lattner llvm::Type *LTy = CGF.ConvertTypeForMem(Ty); 2365c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov llvm::Value *RegAddr = 2366c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov CGF.Builder.CreateLoad(CGF.Builder.CreateStructGEP(VAListAddr, 3), 2367c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov "reg_save_area"); 2368c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov if (neededInt && neededSSE) { 2369c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // FIXME: Cleanup. 2370800588fd230d2c37ddce8fbf4a3881352715d700Chris Lattner assert(AI.isDirect() && "Unexpected ABI info for mixed regs"); 23712acc6e3feda5e4f7d9009bdcf8b1cd777fecfe2dChris Lattner llvm::StructType *ST = cast<llvm::StructType>(AI.getCoerceToType()); 2372c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov llvm::Value *Tmp = CGF.CreateTempAlloca(ST); 2373c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov assert(ST->getNumElements() == 2 && "Unexpected ABI info for mixed regs"); 23742acc6e3feda5e4f7d9009bdcf8b1cd777fecfe2dChris Lattner llvm::Type *TyLo = ST->getElementType(0); 23752acc6e3feda5e4f7d9009bdcf8b1cd777fecfe2dChris Lattner llvm::Type *TyHi = ST->getElementType(1); 2376a8b7a7d3eaa51dd200cba1e5541f2542d24d7a6eChris Lattner assert((TyLo->isFPOrFPVectorTy() ^ TyHi->isFPOrFPVectorTy()) && 2377c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov "Unexpected ABI info for mixed regs"); 23782acc6e3feda5e4f7d9009bdcf8b1cd777fecfe2dChris Lattner llvm::Type *PTyLo = llvm::PointerType::getUnqual(TyLo); 23792acc6e3feda5e4f7d9009bdcf8b1cd777fecfe2dChris Lattner llvm::Type *PTyHi = llvm::PointerType::getUnqual(TyHi); 2380c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov llvm::Value *GPAddr = CGF.Builder.CreateGEP(RegAddr, gp_offset); 2381c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov llvm::Value *FPAddr = CGF.Builder.CreateGEP(RegAddr, fp_offset); 2382f177d9d6c27fbbcee8c00fd90b8306985c03c54aDuncan Sands llvm::Value *RegLoAddr = TyLo->isFloatingPointTy() ? FPAddr : GPAddr; 2383f177d9d6c27fbbcee8c00fd90b8306985c03c54aDuncan Sands llvm::Value *RegHiAddr = TyLo->isFloatingPointTy() ? GPAddr : FPAddr; 2384c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov llvm::Value *V = 2385c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov CGF.Builder.CreateLoad(CGF.Builder.CreateBitCast(RegLoAddr, PTyLo)); 2386c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov CGF.Builder.CreateStore(V, CGF.Builder.CreateStructGEP(Tmp, 0)); 2387c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov V = CGF.Builder.CreateLoad(CGF.Builder.CreateBitCast(RegHiAddr, PTyHi)); 2388c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov CGF.Builder.CreateStore(V, CGF.Builder.CreateStructGEP(Tmp, 1)); 2389c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 2390a1cf15f4680e5cf39e72e28c5ea854fcba792e84Owen Anderson RegAddr = CGF.Builder.CreateBitCast(Tmp, 239196e0fc726c6fe7538522c60743705d5e696b40afOwen Anderson llvm::PointerType::getUnqual(LTy)); 2392c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov } else if (neededInt) { 2393c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov RegAddr = CGF.Builder.CreateGEP(RegAddr, gp_offset); 2394c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov RegAddr = CGF.Builder.CreateBitCast(RegAddr, 239596e0fc726c6fe7538522c60743705d5e696b40afOwen Anderson llvm::PointerType::getUnqual(LTy)); 2396dce5ad0cf70ba74e1ecdbb5e81f1a81d97821636Chris Lattner } else if (neededSSE == 1) { 2397dce5ad0cf70ba74e1ecdbb5e81f1a81d97821636Chris Lattner RegAddr = CGF.Builder.CreateGEP(RegAddr, fp_offset); 2398dce5ad0cf70ba74e1ecdbb5e81f1a81d97821636Chris Lattner RegAddr = CGF.Builder.CreateBitCast(RegAddr, 2399dce5ad0cf70ba74e1ecdbb5e81f1a81d97821636Chris Lattner llvm::PointerType::getUnqual(LTy)); 2400c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov } else { 2401dce5ad0cf70ba74e1ecdbb5e81f1a81d97821636Chris Lattner assert(neededSSE == 2 && "Invalid number of needed registers!"); 2402dce5ad0cf70ba74e1ecdbb5e81f1a81d97821636Chris Lattner // SSE registers are spaced 16 bytes apart in the register save 2403dce5ad0cf70ba74e1ecdbb5e81f1a81d97821636Chris Lattner // area, we need to collect the two eightbytes together. 2404dce5ad0cf70ba74e1ecdbb5e81f1a81d97821636Chris Lattner llvm::Value *RegAddrLo = CGF.Builder.CreateGEP(RegAddr, fp_offset); 24051090a9ba0902380dbd97d0a500daa4c373712df9Chris Lattner llvm::Value *RegAddrHi = CGF.Builder.CreateConstGEP1_32(RegAddrLo, 16); 24068b418685e9e4f02f4eb2a76e1ec063e07552b68dChris Lattner llvm::Type *DoubleTy = CGF.DoubleTy; 24072acc6e3feda5e4f7d9009bdcf8b1cd777fecfe2dChris Lattner llvm::Type *DblPtrTy = 2408dce5ad0cf70ba74e1ecdbb5e81f1a81d97821636Chris Lattner llvm::PointerType::getUnqual(DoubleTy); 24092acc6e3feda5e4f7d9009bdcf8b1cd777fecfe2dChris Lattner llvm::StructType *ST = llvm::StructType::get(DoubleTy, 2410dce5ad0cf70ba74e1ecdbb5e81f1a81d97821636Chris Lattner DoubleTy, NULL); 2411dce5ad0cf70ba74e1ecdbb5e81f1a81d97821636Chris Lattner llvm::Value *V, *Tmp = CGF.CreateTempAlloca(ST); 2412dce5ad0cf70ba74e1ecdbb5e81f1a81d97821636Chris Lattner V = CGF.Builder.CreateLoad(CGF.Builder.CreateBitCast(RegAddrLo, 2413dce5ad0cf70ba74e1ecdbb5e81f1a81d97821636Chris Lattner DblPtrTy)); 2414dce5ad0cf70ba74e1ecdbb5e81f1a81d97821636Chris Lattner CGF.Builder.CreateStore(V, CGF.Builder.CreateStructGEP(Tmp, 0)); 2415dce5ad0cf70ba74e1ecdbb5e81f1a81d97821636Chris Lattner V = CGF.Builder.CreateLoad(CGF.Builder.CreateBitCast(RegAddrHi, 2416dce5ad0cf70ba74e1ecdbb5e81f1a81d97821636Chris Lattner DblPtrTy)); 2417dce5ad0cf70ba74e1ecdbb5e81f1a81d97821636Chris Lattner CGF.Builder.CreateStore(V, CGF.Builder.CreateStructGEP(Tmp, 1)); 2418dce5ad0cf70ba74e1ecdbb5e81f1a81d97821636Chris Lattner RegAddr = CGF.Builder.CreateBitCast(Tmp, 2419dce5ad0cf70ba74e1ecdbb5e81f1a81d97821636Chris Lattner llvm::PointerType::getUnqual(LTy)); 2420c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov } 2421c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 2422c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // AMD64-ABI 3.5.7p5: Step 5. Set: 2423c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // l->gp_offset = l->gp_offset + num_gp * 8 2424c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // l->fp_offset = l->fp_offset + num_fp * 16. 2425c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov if (neededInt) { 242677b89b87c3b9220fea1bc80f6d6598d2003cc8a8Chris Lattner llvm::Value *Offset = llvm::ConstantInt::get(CGF.Int32Ty, neededInt * 8); 2427c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov CGF.Builder.CreateStore(CGF.Builder.CreateAdd(gp_offset, Offset), 2428c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov gp_offset_p); 2429c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov } 2430c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov if (neededSSE) { 243177b89b87c3b9220fea1bc80f6d6598d2003cc8a8Chris Lattner llvm::Value *Offset = llvm::ConstantInt::get(CGF.Int32Ty, neededSSE * 16); 2432c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov CGF.Builder.CreateStore(CGF.Builder.CreateAdd(fp_offset, Offset), 2433c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov fp_offset_p); 2434c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov } 2435c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov CGF.EmitBranch(ContBlock); 2436c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 2437c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // Emit code to load the value if it was passed in memory. 2438c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 2439c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov CGF.EmitBlock(InMemBlock); 2440c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov llvm::Value *MemAddr = EmitVAArgFromMemory(VAListAddr, Ty, CGF); 2441c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 2442c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // Return the appropriate result. 2443c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 2444c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov CGF.EmitBlock(ContBlock); 2445bbf3bacb3e0c1ebb3e8a4a8b1330404a7e379315Jay Foad llvm::PHINode *ResAddr = CGF.Builder.CreatePHI(RegAddr->getType(), 2, 2446c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov "vaarg.addr"); 2447c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov ResAddr->addIncoming(RegAddr, InRegBlock); 2448c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov ResAddr->addIncoming(MemAddr, InMemBlock); 2449c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov return ResAddr; 2450c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov} 2451c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 2452a75732201b19059a0e56a88b0eb5a0e5dd3c6ca3NAKAMURA TakumiABIArgInfo WinX86_64ABIInfo::classify(QualType Ty) const { 2453a75732201b19059a0e56a88b0eb5a0e5dd3c6ca3NAKAMURA Takumi 2454a75732201b19059a0e56a88b0eb5a0e5dd3c6ca3NAKAMURA Takumi if (Ty->isVoidType()) 2455a75732201b19059a0e56a88b0eb5a0e5dd3c6ca3NAKAMURA Takumi return ABIArgInfo::getIgnore(); 2456a75732201b19059a0e56a88b0eb5a0e5dd3c6ca3NAKAMURA Takumi 2457a75732201b19059a0e56a88b0eb5a0e5dd3c6ca3NAKAMURA Takumi if (const EnumType *EnumTy = Ty->getAs<EnumType>()) 2458a75732201b19059a0e56a88b0eb5a0e5dd3c6ca3NAKAMURA Takumi Ty = EnumTy->getDecl()->getIntegerType(); 2459a75732201b19059a0e56a88b0eb5a0e5dd3c6ca3NAKAMURA Takumi 2460a75732201b19059a0e56a88b0eb5a0e5dd3c6ca3NAKAMURA Takumi uint64_t Size = getContext().getTypeSize(Ty); 2461a75732201b19059a0e56a88b0eb5a0e5dd3c6ca3NAKAMURA Takumi 2462a75732201b19059a0e56a88b0eb5a0e5dd3c6ca3NAKAMURA Takumi if (const RecordType *RT = Ty->getAs<RecordType>()) { 2463ff8be0e08e409af53130d12ce36019b35288fb78NAKAMURA Takumi if (hasNonTrivialDestructorOrCopyConstructor(RT) || 2464ff8be0e08e409af53130d12ce36019b35288fb78NAKAMURA Takumi RT->getDecl()->hasFlexibleArrayMember()) 2465a75732201b19059a0e56a88b0eb5a0e5dd3c6ca3NAKAMURA Takumi return ABIArgInfo::getIndirect(0, /*ByVal=*/false); 2466a75732201b19059a0e56a88b0eb5a0e5dd3c6ca3NAKAMURA Takumi 24676f17433b2d50262856ab09f52af96c6132b01012NAKAMURA Takumi // FIXME: mingw-w64-gcc emits 128-bit struct as i128 24686f17433b2d50262856ab09f52af96c6132b01012NAKAMURA Takumi if (Size == 128 && 246955fc7e2b8005ba87a81664d065e9b9e2fff1b1afEli Friedman getContext().getTargetInfo().getTriple().getOS() 247055fc7e2b8005ba87a81664d065e9b9e2fff1b1afEli Friedman == llvm::Triple::MinGW32) 24716f17433b2d50262856ab09f52af96c6132b01012NAKAMURA Takumi return ABIArgInfo::getDirect(llvm::IntegerType::get(getVMContext(), 24726f17433b2d50262856ab09f52af96c6132b01012NAKAMURA Takumi Size)); 24736f17433b2d50262856ab09f52af96c6132b01012NAKAMURA Takumi 24746f17433b2d50262856ab09f52af96c6132b01012NAKAMURA Takumi // MS x64 ABI requirement: "Any argument that doesn't fit in 8 bytes, or is 24756f17433b2d50262856ab09f52af96c6132b01012NAKAMURA Takumi // not 1, 2, 4, or 8 bytes, must be passed by reference." 24766f17433b2d50262856ab09f52af96c6132b01012NAKAMURA Takumi if (Size <= 64 && 2477ff8be0e08e409af53130d12ce36019b35288fb78NAKAMURA Takumi (Size & (Size - 1)) == 0) 2478a75732201b19059a0e56a88b0eb5a0e5dd3c6ca3NAKAMURA Takumi return ABIArgInfo::getDirect(llvm::IntegerType::get(getVMContext(), 2479a75732201b19059a0e56a88b0eb5a0e5dd3c6ca3NAKAMURA Takumi Size)); 2480a75732201b19059a0e56a88b0eb5a0e5dd3c6ca3NAKAMURA Takumi 2481a75732201b19059a0e56a88b0eb5a0e5dd3c6ca3NAKAMURA Takumi return ABIArgInfo::getIndirect(0, /*ByVal=*/false); 2482a75732201b19059a0e56a88b0eb5a0e5dd3c6ca3NAKAMURA Takumi } 2483a75732201b19059a0e56a88b0eb5a0e5dd3c6ca3NAKAMURA Takumi 2484a75732201b19059a0e56a88b0eb5a0e5dd3c6ca3NAKAMURA Takumi if (Ty->isPromotableIntegerType()) 2485a75732201b19059a0e56a88b0eb5a0e5dd3c6ca3NAKAMURA Takumi return ABIArgInfo::getExtend(); 2486a75732201b19059a0e56a88b0eb5a0e5dd3c6ca3NAKAMURA Takumi 2487a75732201b19059a0e56a88b0eb5a0e5dd3c6ca3NAKAMURA Takumi return ABIArgInfo::getDirect(); 2488a75732201b19059a0e56a88b0eb5a0e5dd3c6ca3NAKAMURA Takumi} 2489a75732201b19059a0e56a88b0eb5a0e5dd3c6ca3NAKAMURA Takumi 2490a75732201b19059a0e56a88b0eb5a0e5dd3c6ca3NAKAMURA Takumivoid WinX86_64ABIInfo::computeInfo(CGFunctionInfo &FI) const { 2491a75732201b19059a0e56a88b0eb5a0e5dd3c6ca3NAKAMURA Takumi 2492a75732201b19059a0e56a88b0eb5a0e5dd3c6ca3NAKAMURA Takumi QualType RetTy = FI.getReturnType(); 2493a75732201b19059a0e56a88b0eb5a0e5dd3c6ca3NAKAMURA Takumi FI.getReturnInfo() = classify(RetTy); 2494a75732201b19059a0e56a88b0eb5a0e5dd3c6ca3NAKAMURA Takumi 2495a75732201b19059a0e56a88b0eb5a0e5dd3c6ca3NAKAMURA Takumi for (CGFunctionInfo::arg_iterator it = FI.arg_begin(), ie = FI.arg_end(); 2496a75732201b19059a0e56a88b0eb5a0e5dd3c6ca3NAKAMURA Takumi it != ie; ++it) 2497a75732201b19059a0e56a88b0eb5a0e5dd3c6ca3NAKAMURA Takumi it->info = classify(it->type); 2498a75732201b19059a0e56a88b0eb5a0e5dd3c6ca3NAKAMURA Takumi} 2499a75732201b19059a0e56a88b0eb5a0e5dd3c6ca3NAKAMURA Takumi 2500f13721dd91dda7675e499331a2770308ad20ca61Chris Lattnerllvm::Value *WinX86_64ABIInfo::EmitVAArg(llvm::Value *VAListAddr, QualType Ty, 2501f13721dd91dda7675e499331a2770308ad20ca61Chris Lattner CodeGenFunction &CGF) const { 25028b418685e9e4f02f4eb2a76e1ec063e07552b68dChris Lattner llvm::Type *BPP = CGF.Int8PtrPtrTy; 2503f13721dd91dda7675e499331a2770308ad20ca61Chris Lattner 2504f13721dd91dda7675e499331a2770308ad20ca61Chris Lattner CGBuilderTy &Builder = CGF.Builder; 2505f13721dd91dda7675e499331a2770308ad20ca61Chris Lattner llvm::Value *VAListAddrAsBPP = Builder.CreateBitCast(VAListAddr, BPP, 2506f13721dd91dda7675e499331a2770308ad20ca61Chris Lattner "ap"); 2507f13721dd91dda7675e499331a2770308ad20ca61Chris Lattner llvm::Value *Addr = Builder.CreateLoad(VAListAddrAsBPP, "ap.cur"); 2508f13721dd91dda7675e499331a2770308ad20ca61Chris Lattner llvm::Type *PTy = 2509f13721dd91dda7675e499331a2770308ad20ca61Chris Lattner llvm::PointerType::getUnqual(CGF.ConvertType(Ty)); 2510f13721dd91dda7675e499331a2770308ad20ca61Chris Lattner llvm::Value *AddrTyped = Builder.CreateBitCast(Addr, PTy); 2511f13721dd91dda7675e499331a2770308ad20ca61Chris Lattner 2512f13721dd91dda7675e499331a2770308ad20ca61Chris Lattner uint64_t Offset = 2513f13721dd91dda7675e499331a2770308ad20ca61Chris Lattner llvm::RoundUpToAlignment(CGF.getContext().getTypeSize(Ty) / 8, 8); 2514f13721dd91dda7675e499331a2770308ad20ca61Chris Lattner llvm::Value *NextAddr = 2515f13721dd91dda7675e499331a2770308ad20ca61Chris Lattner Builder.CreateGEP(Addr, llvm::ConstantInt::get(CGF.Int32Ty, Offset), 2516f13721dd91dda7675e499331a2770308ad20ca61Chris Lattner "ap.next"); 2517f13721dd91dda7675e499331a2770308ad20ca61Chris Lattner Builder.CreateStore(NextAddr, VAListAddrAsBPP); 2518dce5ad0cf70ba74e1ecdbb5e81f1a81d97821636Chris Lattner 2519f13721dd91dda7675e499331a2770308ad20ca61Chris Lattner return AddrTyped; 2520f13721dd91dda7675e499331a2770308ad20ca61Chris Lattner} 2521dce5ad0cf70ba74e1ecdbb5e81f1a81d97821636Chris Lattner 2522ec853ba1087f606e9685cb1e800616565ba35093John McCall// PowerPC-32 2523ec853ba1087f606e9685cb1e800616565ba35093John McCall 2524ec853ba1087f606e9685cb1e800616565ba35093John McCallnamespace { 2525ec853ba1087f606e9685cb1e800616565ba35093John McCallclass PPC32TargetCodeGenInfo : public DefaultTargetCodeGenInfo { 2526ec853ba1087f606e9685cb1e800616565ba35093John McCallpublic: 2527ea0443212e7ec6ff82e2f174e8e948a6eb0e0876Chris Lattner PPC32TargetCodeGenInfo(CodeGenTypes &CGT) : DefaultTargetCodeGenInfo(CGT) {} 25288bea82f6699e4384ef823cdc8800ad5db271177cMichael J. Spencer 2529ec853ba1087f606e9685cb1e800616565ba35093John McCall int getDwarfEHStackPointer(CodeGen::CodeGenModule &M) const { 2530ec853ba1087f606e9685cb1e800616565ba35093John McCall // This is recovered from gcc output. 2531ec853ba1087f606e9685cb1e800616565ba35093John McCall return 1; // r1 is the dedicated stack pointer 2532ec853ba1087f606e9685cb1e800616565ba35093John McCall } 2533ec853ba1087f606e9685cb1e800616565ba35093John McCall 2534ec853ba1087f606e9685cb1e800616565ba35093John McCall bool initDwarfEHRegSizeTable(CodeGen::CodeGenFunction &CGF, 25358bea82f6699e4384ef823cdc8800ad5db271177cMichael J. Spencer llvm::Value *Address) const; 2536ec853ba1087f606e9685cb1e800616565ba35093John McCall}; 2537ec853ba1087f606e9685cb1e800616565ba35093John McCall 2538ec853ba1087f606e9685cb1e800616565ba35093John McCall} 2539ec853ba1087f606e9685cb1e800616565ba35093John McCall 2540ec853ba1087f606e9685cb1e800616565ba35093John McCallbool 2541ec853ba1087f606e9685cb1e800616565ba35093John McCallPPC32TargetCodeGenInfo::initDwarfEHRegSizeTable(CodeGen::CodeGenFunction &CGF, 2542ec853ba1087f606e9685cb1e800616565ba35093John McCall llvm::Value *Address) const { 2543ec853ba1087f606e9685cb1e800616565ba35093John McCall // This is calculated from the LLVM and GCC tables and verified 2544ec853ba1087f606e9685cb1e800616565ba35093John McCall // against gcc output. AFAIK all ABIs use the same encoding. 2545ec853ba1087f606e9685cb1e800616565ba35093John McCall 2546ec853ba1087f606e9685cb1e800616565ba35093John McCall CodeGen::CGBuilderTy &Builder = CGF.Builder; 2547ec853ba1087f606e9685cb1e800616565ba35093John McCall 25488b418685e9e4f02f4eb2a76e1ec063e07552b68dChris Lattner llvm::IntegerType *i8 = CGF.Int8Ty; 2549ec853ba1087f606e9685cb1e800616565ba35093John McCall llvm::Value *Four8 = llvm::ConstantInt::get(i8, 4); 2550ec853ba1087f606e9685cb1e800616565ba35093John McCall llvm::Value *Eight8 = llvm::ConstantInt::get(i8, 8); 2551ec853ba1087f606e9685cb1e800616565ba35093John McCall llvm::Value *Sixteen8 = llvm::ConstantInt::get(i8, 16); 2552ec853ba1087f606e9685cb1e800616565ba35093John McCall 2553ec853ba1087f606e9685cb1e800616565ba35093John McCall // 0-31: r0-31, the 4-byte general-purpose registers 2554aeeb7011a875d3dd439e9fa07dc3ac54d97785b9John McCall AssignToArrayRange(Builder, Address, Four8, 0, 31); 2555ec853ba1087f606e9685cb1e800616565ba35093John McCall 2556ec853ba1087f606e9685cb1e800616565ba35093John McCall // 32-63: fp0-31, the 8-byte floating-point registers 2557aeeb7011a875d3dd439e9fa07dc3ac54d97785b9John McCall AssignToArrayRange(Builder, Address, Eight8, 32, 63); 2558ec853ba1087f606e9685cb1e800616565ba35093John McCall 2559ec853ba1087f606e9685cb1e800616565ba35093John McCall // 64-76 are various 4-byte special-purpose registers: 2560ec853ba1087f606e9685cb1e800616565ba35093John McCall // 64: mq 2561ec853ba1087f606e9685cb1e800616565ba35093John McCall // 65: lr 2562ec853ba1087f606e9685cb1e800616565ba35093John McCall // 66: ctr 2563ec853ba1087f606e9685cb1e800616565ba35093John McCall // 67: ap 2564ec853ba1087f606e9685cb1e800616565ba35093John McCall // 68-75 cr0-7 2565ec853ba1087f606e9685cb1e800616565ba35093John McCall // 76: xer 2566aeeb7011a875d3dd439e9fa07dc3ac54d97785b9John McCall AssignToArrayRange(Builder, Address, Four8, 64, 76); 2567ec853ba1087f606e9685cb1e800616565ba35093John McCall 2568ec853ba1087f606e9685cb1e800616565ba35093John McCall // 77-108: v0-31, the 16-byte vector registers 2569aeeb7011a875d3dd439e9fa07dc3ac54d97785b9John McCall AssignToArrayRange(Builder, Address, Sixteen8, 77, 108); 2570ec853ba1087f606e9685cb1e800616565ba35093John McCall 2571ec853ba1087f606e9685cb1e800616565ba35093John McCall // 109: vrsave 2572ec853ba1087f606e9685cb1e800616565ba35093John McCall // 110: vscr 2573ec853ba1087f606e9685cb1e800616565ba35093John McCall // 111: spe_acc 2574ec853ba1087f606e9685cb1e800616565ba35093John McCall // 112: spefscr 2575ec853ba1087f606e9685cb1e800616565ba35093John McCall // 113: sfp 2576aeeb7011a875d3dd439e9fa07dc3ac54d97785b9John McCall AssignToArrayRange(Builder, Address, Four8, 109, 113); 2577ec853ba1087f606e9685cb1e800616565ba35093John McCall 25788bea82f6699e4384ef823cdc8800ad5db271177cMichael J. Spencer return false; 2579ec853ba1087f606e9685cb1e800616565ba35093John McCall} 2580ec853ba1087f606e9685cb1e800616565ba35093John McCall 25810fbc4b97bd763850ecd72ad79b22b1ad85c5d965Roman Divacky// PowerPC-64 25820fbc4b97bd763850ecd72ad79b22b1ad85c5d965Roman Divacky 25830fbc4b97bd763850ecd72ad79b22b1ad85c5d965Roman Divackynamespace { 25842fc107f5652a526d9c2972dc3b386e5d86769e44Bill Schmidt/// PPC64_SVR4_ABIInfo - The 64-bit PowerPC ELF (SVR4) ABI information. 25852fc107f5652a526d9c2972dc3b386e5d86769e44Bill Schmidtclass PPC64_SVR4_ABIInfo : public DefaultABIInfo { 25862fc107f5652a526d9c2972dc3b386e5d86769e44Bill Schmidt 25872fc107f5652a526d9c2972dc3b386e5d86769e44Bill Schmidtpublic: 25882fc107f5652a526d9c2972dc3b386e5d86769e44Bill Schmidt PPC64_SVR4_ABIInfo(CodeGen::CodeGenTypes &CGT) : DefaultABIInfo(CGT) {} 25892fc107f5652a526d9c2972dc3b386e5d86769e44Bill Schmidt 25902fc107f5652a526d9c2972dc3b386e5d86769e44Bill Schmidt // TODO: Could override computeInfo to model the ABI more completely if 25912fc107f5652a526d9c2972dc3b386e5d86769e44Bill Schmidt // it would be helpful. Example: We might remove the byVal flag from 25922fc107f5652a526d9c2972dc3b386e5d86769e44Bill Schmidt // aggregate arguments that fit in a register to avoid pushing them to 25932fc107f5652a526d9c2972dc3b386e5d86769e44Bill Schmidt // memory on function entry. Note that this is a performance optimization, 25942fc107f5652a526d9c2972dc3b386e5d86769e44Bill Schmidt // not a compliance issue. In general we prefer to keep ABI details in 25952fc107f5652a526d9c2972dc3b386e5d86769e44Bill Schmidt // the back end where possible, but modifying an argument flag seems like 25962fc107f5652a526d9c2972dc3b386e5d86769e44Bill Schmidt // a good thing to do before invoking the back end. 25972fc107f5652a526d9c2972dc3b386e5d86769e44Bill Schmidt 25982fc107f5652a526d9c2972dc3b386e5d86769e44Bill Schmidt virtual llvm::Value *EmitVAArg(llvm::Value *VAListAddr, 25992fc107f5652a526d9c2972dc3b386e5d86769e44Bill Schmidt QualType Ty, 26002fc107f5652a526d9c2972dc3b386e5d86769e44Bill Schmidt CodeGenFunction &CGF) const; 26012fc107f5652a526d9c2972dc3b386e5d86769e44Bill Schmidt}; 26022fc107f5652a526d9c2972dc3b386e5d86769e44Bill Schmidt 26032fc107f5652a526d9c2972dc3b386e5d86769e44Bill Schmidtclass PPC64_SVR4_TargetCodeGenInfo : public TargetCodeGenInfo { 26042fc107f5652a526d9c2972dc3b386e5d86769e44Bill Schmidtpublic: 26052fc107f5652a526d9c2972dc3b386e5d86769e44Bill Schmidt PPC64_SVR4_TargetCodeGenInfo(CodeGenTypes &CGT) 26062fc107f5652a526d9c2972dc3b386e5d86769e44Bill Schmidt : TargetCodeGenInfo(new PPC64_SVR4_ABIInfo(CGT)) {} 26072fc107f5652a526d9c2972dc3b386e5d86769e44Bill Schmidt 26082fc107f5652a526d9c2972dc3b386e5d86769e44Bill Schmidt int getDwarfEHStackPointer(CodeGen::CodeGenModule &M) const { 26092fc107f5652a526d9c2972dc3b386e5d86769e44Bill Schmidt // This is recovered from gcc output. 26102fc107f5652a526d9c2972dc3b386e5d86769e44Bill Schmidt return 1; // r1 is the dedicated stack pointer 26112fc107f5652a526d9c2972dc3b386e5d86769e44Bill Schmidt } 26122fc107f5652a526d9c2972dc3b386e5d86769e44Bill Schmidt 26132fc107f5652a526d9c2972dc3b386e5d86769e44Bill Schmidt bool initDwarfEHRegSizeTable(CodeGen::CodeGenFunction &CGF, 26142fc107f5652a526d9c2972dc3b386e5d86769e44Bill Schmidt llvm::Value *Address) const; 26152fc107f5652a526d9c2972dc3b386e5d86769e44Bill Schmidt}; 26162fc107f5652a526d9c2972dc3b386e5d86769e44Bill Schmidt 26170fbc4b97bd763850ecd72ad79b22b1ad85c5d965Roman Divackyclass PPC64TargetCodeGenInfo : public DefaultTargetCodeGenInfo { 26180fbc4b97bd763850ecd72ad79b22b1ad85c5d965Roman Divackypublic: 26190fbc4b97bd763850ecd72ad79b22b1ad85c5d965Roman Divacky PPC64TargetCodeGenInfo(CodeGenTypes &CGT) : DefaultTargetCodeGenInfo(CGT) {} 26200fbc4b97bd763850ecd72ad79b22b1ad85c5d965Roman Divacky 26210fbc4b97bd763850ecd72ad79b22b1ad85c5d965Roman Divacky int getDwarfEHStackPointer(CodeGen::CodeGenModule &M) const { 26220fbc4b97bd763850ecd72ad79b22b1ad85c5d965Roman Divacky // This is recovered from gcc output. 26230fbc4b97bd763850ecd72ad79b22b1ad85c5d965Roman Divacky return 1; // r1 is the dedicated stack pointer 26240fbc4b97bd763850ecd72ad79b22b1ad85c5d965Roman Divacky } 26250fbc4b97bd763850ecd72ad79b22b1ad85c5d965Roman Divacky 26260fbc4b97bd763850ecd72ad79b22b1ad85c5d965Roman Divacky bool initDwarfEHRegSizeTable(CodeGen::CodeGenFunction &CGF, 26270fbc4b97bd763850ecd72ad79b22b1ad85c5d965Roman Divacky llvm::Value *Address) const; 26280fbc4b97bd763850ecd72ad79b22b1ad85c5d965Roman Divacky}; 26290fbc4b97bd763850ecd72ad79b22b1ad85c5d965Roman Divacky 26300fbc4b97bd763850ecd72ad79b22b1ad85c5d965Roman Divacky} 26310fbc4b97bd763850ecd72ad79b22b1ad85c5d965Roman Divacky 26322fc107f5652a526d9c2972dc3b386e5d86769e44Bill Schmidt// Based on ARMABIInfo::EmitVAArg, adjusted for 64-bit machine. 26332fc107f5652a526d9c2972dc3b386e5d86769e44Bill Schmidtllvm::Value *PPC64_SVR4_ABIInfo::EmitVAArg(llvm::Value *VAListAddr, 26342fc107f5652a526d9c2972dc3b386e5d86769e44Bill Schmidt QualType Ty, 26352fc107f5652a526d9c2972dc3b386e5d86769e44Bill Schmidt CodeGenFunction &CGF) const { 26362fc107f5652a526d9c2972dc3b386e5d86769e44Bill Schmidt llvm::Type *BP = CGF.Int8PtrTy; 26372fc107f5652a526d9c2972dc3b386e5d86769e44Bill Schmidt llvm::Type *BPP = CGF.Int8PtrPtrTy; 26382fc107f5652a526d9c2972dc3b386e5d86769e44Bill Schmidt 26392fc107f5652a526d9c2972dc3b386e5d86769e44Bill Schmidt CGBuilderTy &Builder = CGF.Builder; 26402fc107f5652a526d9c2972dc3b386e5d86769e44Bill Schmidt llvm::Value *VAListAddrAsBPP = Builder.CreateBitCast(VAListAddr, BPP, "ap"); 26412fc107f5652a526d9c2972dc3b386e5d86769e44Bill Schmidt llvm::Value *Addr = Builder.CreateLoad(VAListAddrAsBPP, "ap.cur"); 26422fc107f5652a526d9c2972dc3b386e5d86769e44Bill Schmidt 26432fc107f5652a526d9c2972dc3b386e5d86769e44Bill Schmidt // Handle address alignment for type alignment > 64 bits. Although 26442fc107f5652a526d9c2972dc3b386e5d86769e44Bill Schmidt // long double normally requires 16-byte alignment, this is not the 26452fc107f5652a526d9c2972dc3b386e5d86769e44Bill Schmidt // case when it is passed as an argument; so handle that special case. 26462fc107f5652a526d9c2972dc3b386e5d86769e44Bill Schmidt const BuiltinType *BT = Ty->getAs<BuiltinType>(); 26472fc107f5652a526d9c2972dc3b386e5d86769e44Bill Schmidt unsigned TyAlign = CGF.getContext().getTypeAlign(Ty) / 8; 26482fc107f5652a526d9c2972dc3b386e5d86769e44Bill Schmidt 26492fc107f5652a526d9c2972dc3b386e5d86769e44Bill Schmidt if (TyAlign > 8 && (!BT || !BT->isFloatingPoint())) { 26502fc107f5652a526d9c2972dc3b386e5d86769e44Bill Schmidt assert((TyAlign & (TyAlign - 1)) == 0 && 26512fc107f5652a526d9c2972dc3b386e5d86769e44Bill Schmidt "Alignment is not power of 2!"); 26522fc107f5652a526d9c2972dc3b386e5d86769e44Bill Schmidt llvm::Value *AddrAsInt = Builder.CreatePtrToInt(Addr, CGF.Int64Ty); 26532fc107f5652a526d9c2972dc3b386e5d86769e44Bill Schmidt AddrAsInt = Builder.CreateAdd(AddrAsInt, Builder.getInt64(TyAlign - 1)); 26542fc107f5652a526d9c2972dc3b386e5d86769e44Bill Schmidt AddrAsInt = Builder.CreateAnd(AddrAsInt, Builder.getInt64(~(TyAlign - 1))); 26552fc107f5652a526d9c2972dc3b386e5d86769e44Bill Schmidt Addr = Builder.CreateIntToPtr(AddrAsInt, BP); 26562fc107f5652a526d9c2972dc3b386e5d86769e44Bill Schmidt } 26572fc107f5652a526d9c2972dc3b386e5d86769e44Bill Schmidt 26582fc107f5652a526d9c2972dc3b386e5d86769e44Bill Schmidt // Update the va_list pointer. 26592fc107f5652a526d9c2972dc3b386e5d86769e44Bill Schmidt unsigned SizeInBytes = CGF.getContext().getTypeSize(Ty) / 8; 26602fc107f5652a526d9c2972dc3b386e5d86769e44Bill Schmidt unsigned Offset = llvm::RoundUpToAlignment(SizeInBytes, 8); 26612fc107f5652a526d9c2972dc3b386e5d86769e44Bill Schmidt llvm::Value *NextAddr = 26622fc107f5652a526d9c2972dc3b386e5d86769e44Bill Schmidt Builder.CreateGEP(Addr, llvm::ConstantInt::get(CGF.Int64Ty, Offset), 26632fc107f5652a526d9c2972dc3b386e5d86769e44Bill Schmidt "ap.next"); 26642fc107f5652a526d9c2972dc3b386e5d86769e44Bill Schmidt Builder.CreateStore(NextAddr, VAListAddrAsBPP); 26652fc107f5652a526d9c2972dc3b386e5d86769e44Bill Schmidt 26662fc107f5652a526d9c2972dc3b386e5d86769e44Bill Schmidt // If the argument is smaller than 8 bytes, it is right-adjusted in 26672fc107f5652a526d9c2972dc3b386e5d86769e44Bill Schmidt // its doubleword slot. Adjust the pointer to pick it up from the 26682fc107f5652a526d9c2972dc3b386e5d86769e44Bill Schmidt // correct offset. 26692fc107f5652a526d9c2972dc3b386e5d86769e44Bill Schmidt if (SizeInBytes < 8) { 26702fc107f5652a526d9c2972dc3b386e5d86769e44Bill Schmidt llvm::Value *AddrAsInt = Builder.CreatePtrToInt(Addr, CGF.Int64Ty); 26712fc107f5652a526d9c2972dc3b386e5d86769e44Bill Schmidt AddrAsInt = Builder.CreateAdd(AddrAsInt, Builder.getInt64(8 - SizeInBytes)); 26722fc107f5652a526d9c2972dc3b386e5d86769e44Bill Schmidt Addr = Builder.CreateIntToPtr(AddrAsInt, BP); 26732fc107f5652a526d9c2972dc3b386e5d86769e44Bill Schmidt } 26742fc107f5652a526d9c2972dc3b386e5d86769e44Bill Schmidt 26752fc107f5652a526d9c2972dc3b386e5d86769e44Bill Schmidt llvm::Type *PTy = llvm::PointerType::getUnqual(CGF.ConvertType(Ty)); 26762fc107f5652a526d9c2972dc3b386e5d86769e44Bill Schmidt return Builder.CreateBitCast(Addr, PTy); 26772fc107f5652a526d9c2972dc3b386e5d86769e44Bill Schmidt} 26782fc107f5652a526d9c2972dc3b386e5d86769e44Bill Schmidt 26792fc107f5652a526d9c2972dc3b386e5d86769e44Bill Schmidtstatic bool 26802fc107f5652a526d9c2972dc3b386e5d86769e44Bill SchmidtPPC64_initDwarfEHRegSizeTable(CodeGen::CodeGenFunction &CGF, 26812fc107f5652a526d9c2972dc3b386e5d86769e44Bill Schmidt llvm::Value *Address) { 26820fbc4b97bd763850ecd72ad79b22b1ad85c5d965Roman Divacky // This is calculated from the LLVM and GCC tables and verified 26830fbc4b97bd763850ecd72ad79b22b1ad85c5d965Roman Divacky // against gcc output. AFAIK all ABIs use the same encoding. 26840fbc4b97bd763850ecd72ad79b22b1ad85c5d965Roman Divacky 26850fbc4b97bd763850ecd72ad79b22b1ad85c5d965Roman Divacky CodeGen::CGBuilderTy &Builder = CGF.Builder; 26860fbc4b97bd763850ecd72ad79b22b1ad85c5d965Roman Divacky 26870fbc4b97bd763850ecd72ad79b22b1ad85c5d965Roman Divacky llvm::IntegerType *i8 = CGF.Int8Ty; 26880fbc4b97bd763850ecd72ad79b22b1ad85c5d965Roman Divacky llvm::Value *Four8 = llvm::ConstantInt::get(i8, 4); 26890fbc4b97bd763850ecd72ad79b22b1ad85c5d965Roman Divacky llvm::Value *Eight8 = llvm::ConstantInt::get(i8, 8); 26900fbc4b97bd763850ecd72ad79b22b1ad85c5d965Roman Divacky llvm::Value *Sixteen8 = llvm::ConstantInt::get(i8, 16); 26910fbc4b97bd763850ecd72ad79b22b1ad85c5d965Roman Divacky 26920fbc4b97bd763850ecd72ad79b22b1ad85c5d965Roman Divacky // 0-31: r0-31, the 8-byte general-purpose registers 26930fbc4b97bd763850ecd72ad79b22b1ad85c5d965Roman Divacky AssignToArrayRange(Builder, Address, Eight8, 0, 31); 26940fbc4b97bd763850ecd72ad79b22b1ad85c5d965Roman Divacky 26950fbc4b97bd763850ecd72ad79b22b1ad85c5d965Roman Divacky // 32-63: fp0-31, the 8-byte floating-point registers 26960fbc4b97bd763850ecd72ad79b22b1ad85c5d965Roman Divacky AssignToArrayRange(Builder, Address, Eight8, 32, 63); 26970fbc4b97bd763850ecd72ad79b22b1ad85c5d965Roman Divacky 26980fbc4b97bd763850ecd72ad79b22b1ad85c5d965Roman Divacky // 64-76 are various 4-byte special-purpose registers: 26990fbc4b97bd763850ecd72ad79b22b1ad85c5d965Roman Divacky // 64: mq 27000fbc4b97bd763850ecd72ad79b22b1ad85c5d965Roman Divacky // 65: lr 27010fbc4b97bd763850ecd72ad79b22b1ad85c5d965Roman Divacky // 66: ctr 27020fbc4b97bd763850ecd72ad79b22b1ad85c5d965Roman Divacky // 67: ap 27030fbc4b97bd763850ecd72ad79b22b1ad85c5d965Roman Divacky // 68-75 cr0-7 27040fbc4b97bd763850ecd72ad79b22b1ad85c5d965Roman Divacky // 76: xer 27050fbc4b97bd763850ecd72ad79b22b1ad85c5d965Roman Divacky AssignToArrayRange(Builder, Address, Four8, 64, 76); 27060fbc4b97bd763850ecd72ad79b22b1ad85c5d965Roman Divacky 27070fbc4b97bd763850ecd72ad79b22b1ad85c5d965Roman Divacky // 77-108: v0-31, the 16-byte vector registers 27080fbc4b97bd763850ecd72ad79b22b1ad85c5d965Roman Divacky AssignToArrayRange(Builder, Address, Sixteen8, 77, 108); 27090fbc4b97bd763850ecd72ad79b22b1ad85c5d965Roman Divacky 27100fbc4b97bd763850ecd72ad79b22b1ad85c5d965Roman Divacky // 109: vrsave 27110fbc4b97bd763850ecd72ad79b22b1ad85c5d965Roman Divacky // 110: vscr 27120fbc4b97bd763850ecd72ad79b22b1ad85c5d965Roman Divacky // 111: spe_acc 27130fbc4b97bd763850ecd72ad79b22b1ad85c5d965Roman Divacky // 112: spefscr 27140fbc4b97bd763850ecd72ad79b22b1ad85c5d965Roman Divacky // 113: sfp 27150fbc4b97bd763850ecd72ad79b22b1ad85c5d965Roman Divacky AssignToArrayRange(Builder, Address, Four8, 109, 113); 27160fbc4b97bd763850ecd72ad79b22b1ad85c5d965Roman Divacky 27170fbc4b97bd763850ecd72ad79b22b1ad85c5d965Roman Divacky return false; 27180fbc4b97bd763850ecd72ad79b22b1ad85c5d965Roman Divacky} 2719ec853ba1087f606e9685cb1e800616565ba35093John McCall 27202fc107f5652a526d9c2972dc3b386e5d86769e44Bill Schmidtbool 27212fc107f5652a526d9c2972dc3b386e5d86769e44Bill SchmidtPPC64_SVR4_TargetCodeGenInfo::initDwarfEHRegSizeTable( 27222fc107f5652a526d9c2972dc3b386e5d86769e44Bill Schmidt CodeGen::CodeGenFunction &CGF, 27232fc107f5652a526d9c2972dc3b386e5d86769e44Bill Schmidt llvm::Value *Address) const { 27242fc107f5652a526d9c2972dc3b386e5d86769e44Bill Schmidt 27252fc107f5652a526d9c2972dc3b386e5d86769e44Bill Schmidt return PPC64_initDwarfEHRegSizeTable(CGF, Address); 27262fc107f5652a526d9c2972dc3b386e5d86769e44Bill Schmidt} 27272fc107f5652a526d9c2972dc3b386e5d86769e44Bill Schmidt 27282fc107f5652a526d9c2972dc3b386e5d86769e44Bill Schmidtbool 27292fc107f5652a526d9c2972dc3b386e5d86769e44Bill SchmidtPPC64TargetCodeGenInfo::initDwarfEHRegSizeTable(CodeGen::CodeGenFunction &CGF, 27302fc107f5652a526d9c2972dc3b386e5d86769e44Bill Schmidt llvm::Value *Address) const { 27312fc107f5652a526d9c2972dc3b386e5d86769e44Bill Schmidt 27322fc107f5652a526d9c2972dc3b386e5d86769e44Bill Schmidt return PPC64_initDwarfEHRegSizeTable(CGF, Address); 27332fc107f5652a526d9c2972dc3b386e5d86769e44Bill Schmidt} 27342fc107f5652a526d9c2972dc3b386e5d86769e44Bill Schmidt 2735dce5ad0cf70ba74e1ecdbb5e81f1a81d97821636Chris Lattner//===----------------------------------------------------------------------===// 273634d91fddd0252d64456cdcea0bd22073f006f4e2Daniel Dunbar// ARM ABI Implementation 2737dce5ad0cf70ba74e1ecdbb5e81f1a81d97821636Chris Lattner//===----------------------------------------------------------------------===// 273834d91fddd0252d64456cdcea0bd22073f006f4e2Daniel Dunbar 273934d91fddd0252d64456cdcea0bd22073f006f4e2Daniel Dunbarnamespace { 274034d91fddd0252d64456cdcea0bd22073f006f4e2Daniel Dunbar 2741c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikovclass ARMABIInfo : public ABIInfo { 27425e7bacef79f7725f4abc45e2a5eccedae40dfcd3Daniel Dunbarpublic: 27435e7bacef79f7725f4abc45e2a5eccedae40dfcd3Daniel Dunbar enum ABIKind { 27445e7bacef79f7725f4abc45e2a5eccedae40dfcd3Daniel Dunbar APCS = 0, 27455e7bacef79f7725f4abc45e2a5eccedae40dfcd3Daniel Dunbar AAPCS = 1, 27465e7bacef79f7725f4abc45e2a5eccedae40dfcd3Daniel Dunbar AAPCS_VFP 27475e7bacef79f7725f4abc45e2a5eccedae40dfcd3Daniel Dunbar }; 27485e7bacef79f7725f4abc45e2a5eccedae40dfcd3Daniel Dunbar 27495e7bacef79f7725f4abc45e2a5eccedae40dfcd3Daniel Dunbarprivate: 27505e7bacef79f7725f4abc45e2a5eccedae40dfcd3Daniel Dunbar ABIKind Kind; 27515e7bacef79f7725f4abc45e2a5eccedae40dfcd3Daniel Dunbar 27525e7bacef79f7725f4abc45e2a5eccedae40dfcd3Daniel Dunbarpublic: 2753ea0443212e7ec6ff82e2f174e8e948a6eb0e0876Chris Lattner ARMABIInfo(CodeGenTypes &CGT, ABIKind _Kind) : ABIInfo(CGT), Kind(_Kind) {} 27545e7bacef79f7725f4abc45e2a5eccedae40dfcd3Daniel Dunbar 275549e34be6ae0c25b9843610cdd2fd6fea9cd8b870John McCall bool isEABI() const { 275655fc7e2b8005ba87a81664d065e9b9e2fff1b1afEli Friedman StringRef Env = 275755fc7e2b8005ba87a81664d065e9b9e2fff1b1afEli Friedman getContext().getTargetInfo().getTriple().getEnvironmentName(); 275894a7142f74bb4a9daa53c22087b19d4568073109Logan Chien return (Env == "gnueabi" || Env == "eabi" || 275994a7142f74bb4a9daa53c22087b19d4568073109Logan Chien Env == "android" || Env == "androideabi"); 276049e34be6ae0c25b9843610cdd2fd6fea9cd8b870John McCall } 276149e34be6ae0c25b9843610cdd2fd6fea9cd8b870John McCall 27625e7bacef79f7725f4abc45e2a5eccedae40dfcd3Daniel Dunbarprivate: 27635e7bacef79f7725f4abc45e2a5eccedae40dfcd3Daniel Dunbar ABIKind getABIKind() const { return Kind; } 27645e7bacef79f7725f4abc45e2a5eccedae40dfcd3Daniel Dunbar 2765a3c109bbf6e198f463fbe204da4d25b40dab65c4Chris Lattner ABIArgInfo classifyReturnType(QualType RetTy) const; 2766a3c109bbf6e198f463fbe204da4d25b40dab65c4Chris Lattner ABIArgInfo classifyArgumentType(QualType RetTy) const; 2767c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 2768ee5dcd064a811edc90f6c1fb31a837b6c961fed7Chris Lattner virtual void computeInfo(CGFunctionInfo &FI) const; 2769c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 2770c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov virtual llvm::Value *EmitVAArg(llvm::Value *VAListAddr, QualType Ty, 2771c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov CodeGenFunction &CGF) const; 2772c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov}; 2773c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 277482d0a418c8699fc6f4a9417457ffe93d43bba1c1Anton Korobeynikovclass ARMTargetCodeGenInfo : public TargetCodeGenInfo { 277582d0a418c8699fc6f4a9417457ffe93d43bba1c1Anton Korobeynikovpublic: 2776ea0443212e7ec6ff82e2f174e8e948a6eb0e0876Chris Lattner ARMTargetCodeGenInfo(CodeGenTypes &CGT, ARMABIInfo::ABIKind K) 2777ea0443212e7ec6ff82e2f174e8e948a6eb0e0876Chris Lattner :TargetCodeGenInfo(new ARMABIInfo(CGT, K)) {} 27786374c3307e2d73348f7b8cc73eeeb0998ad0ac94John McCall 277949e34be6ae0c25b9843610cdd2fd6fea9cd8b870John McCall const ARMABIInfo &getABIInfo() const { 278049e34be6ae0c25b9843610cdd2fd6fea9cd8b870John McCall return static_cast<const ARMABIInfo&>(TargetCodeGenInfo::getABIInfo()); 278149e34be6ae0c25b9843610cdd2fd6fea9cd8b870John McCall } 278249e34be6ae0c25b9843610cdd2fd6fea9cd8b870John McCall 27836374c3307e2d73348f7b8cc73eeeb0998ad0ac94John McCall int getDwarfEHStackPointer(CodeGen::CodeGenModule &M) const { 27846374c3307e2d73348f7b8cc73eeeb0998ad0ac94John McCall return 13; 27856374c3307e2d73348f7b8cc73eeeb0998ad0ac94John McCall } 278609345d1c2adf95ea90f06911dbb4f12372b7f24cRoman Divacky 27875f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner StringRef getARCRetainAutoreleasedReturnValueMarker() const { 2788f85e193739c953358c865005855253af4f68a497John McCall return "mov\tr7, r7\t\t@ marker for objc_retainAutoreleaseReturnValue"; 2789f85e193739c953358c865005855253af4f68a497John McCall } 2790f85e193739c953358c865005855253af4f68a497John McCall 279109345d1c2adf95ea90f06911dbb4f12372b7f24cRoman Divacky bool initDwarfEHRegSizeTable(CodeGen::CodeGenFunction &CGF, 279209345d1c2adf95ea90f06911dbb4f12372b7f24cRoman Divacky llvm::Value *Address) const { 27938b418685e9e4f02f4eb2a76e1ec063e07552b68dChris Lattner llvm::Value *Four8 = llvm::ConstantInt::get(CGF.Int8Ty, 4); 279409345d1c2adf95ea90f06911dbb4f12372b7f24cRoman Divacky 279509345d1c2adf95ea90f06911dbb4f12372b7f24cRoman Divacky // 0-15 are the 16 integer registers. 27968b418685e9e4f02f4eb2a76e1ec063e07552b68dChris Lattner AssignToArrayRange(CGF.Builder, Address, Four8, 0, 15); 279709345d1c2adf95ea90f06911dbb4f12372b7f24cRoman Divacky return false; 279809345d1c2adf95ea90f06911dbb4f12372b7f24cRoman Divacky } 279949e34be6ae0c25b9843610cdd2fd6fea9cd8b870John McCall 280049e34be6ae0c25b9843610cdd2fd6fea9cd8b870John McCall unsigned getSizeOfUnwindException() const { 280149e34be6ae0c25b9843610cdd2fd6fea9cd8b870John McCall if (getABIInfo().isEABI()) return 88; 280249e34be6ae0c25b9843610cdd2fd6fea9cd8b870John McCall return TargetCodeGenInfo::getSizeOfUnwindException(); 280349e34be6ae0c25b9843610cdd2fd6fea9cd8b870John McCall } 280482d0a418c8699fc6f4a9417457ffe93d43bba1c1Anton Korobeynikov}; 280582d0a418c8699fc6f4a9417457ffe93d43bba1c1Anton Korobeynikov 280634d91fddd0252d64456cdcea0bd22073f006f4e2Daniel Dunbar} 280734d91fddd0252d64456cdcea0bd22073f006f4e2Daniel Dunbar 2808ee5dcd064a811edc90f6c1fb31a837b6c961fed7Chris Lattnervoid ARMABIInfo::computeInfo(CGFunctionInfo &FI) const { 2809a3c109bbf6e198f463fbe204da4d25b40dab65c4Chris Lattner FI.getReturnInfo() = classifyReturnType(FI.getReturnType()); 2810c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov for (CGFunctionInfo::arg_iterator it = FI.arg_begin(), ie = FI.arg_end(); 2811a3c109bbf6e198f463fbe204da4d25b40dab65c4Chris Lattner it != ie; ++it) 2812a3c109bbf6e198f463fbe204da4d25b40dab65c4Chris Lattner it->info = classifyArgumentType(it->type); 28135e7bacef79f7725f4abc45e2a5eccedae40dfcd3Daniel Dunbar 2814414d8967e1d760ea1e19a4aca96b13777a8cf8c5Anton Korobeynikov // Always honor user-specified calling convention. 2815414d8967e1d760ea1e19a4aca96b13777a8cf8c5Anton Korobeynikov if (FI.getCallingConvention() != llvm::CallingConv::C) 2816414d8967e1d760ea1e19a4aca96b13777a8cf8c5Anton Korobeynikov return; 2817414d8967e1d760ea1e19a4aca96b13777a8cf8c5Anton Korobeynikov 2818414d8967e1d760ea1e19a4aca96b13777a8cf8c5Anton Korobeynikov // Calling convention as default by an ABI. 281925117ab35c1a033846073183314c68ef07d1701aRafael Espindola llvm::CallingConv::ID DefaultCC; 282049e34be6ae0c25b9843610cdd2fd6fea9cd8b870John McCall if (isEABI()) 282125117ab35c1a033846073183314c68ef07d1701aRafael Espindola DefaultCC = llvm::CallingConv::ARM_AAPCS; 28221ed1a594e9befc91ebf00d81b41a2fdfab862657Rafael Espindola else 28231ed1a594e9befc91ebf00d81b41a2fdfab862657Rafael Espindola DefaultCC = llvm::CallingConv::ARM_APCS; 282425117ab35c1a033846073183314c68ef07d1701aRafael Espindola 2825414d8967e1d760ea1e19a4aca96b13777a8cf8c5Anton Korobeynikov // If user did not ask for specific calling convention explicitly (e.g. via 2826414d8967e1d760ea1e19a4aca96b13777a8cf8c5Anton Korobeynikov // pcs attribute), set effective calling convention if it's different than ABI 2827414d8967e1d760ea1e19a4aca96b13777a8cf8c5Anton Korobeynikov // default. 28285e7bacef79f7725f4abc45e2a5eccedae40dfcd3Daniel Dunbar switch (getABIKind()) { 28295e7bacef79f7725f4abc45e2a5eccedae40dfcd3Daniel Dunbar case APCS: 283025117ab35c1a033846073183314c68ef07d1701aRafael Espindola if (DefaultCC != llvm::CallingConv::ARM_APCS) 283125117ab35c1a033846073183314c68ef07d1701aRafael Espindola FI.setEffectiveCallingConvention(llvm::CallingConv::ARM_APCS); 28325e7bacef79f7725f4abc45e2a5eccedae40dfcd3Daniel Dunbar break; 28335e7bacef79f7725f4abc45e2a5eccedae40dfcd3Daniel Dunbar case AAPCS: 283425117ab35c1a033846073183314c68ef07d1701aRafael Espindola if (DefaultCC != llvm::CallingConv::ARM_AAPCS) 283525117ab35c1a033846073183314c68ef07d1701aRafael Espindola FI.setEffectiveCallingConvention(llvm::CallingConv::ARM_AAPCS); 28365e7bacef79f7725f4abc45e2a5eccedae40dfcd3Daniel Dunbar break; 28375e7bacef79f7725f4abc45e2a5eccedae40dfcd3Daniel Dunbar case AAPCS_VFP: 2838414d8967e1d760ea1e19a4aca96b13777a8cf8c5Anton Korobeynikov if (DefaultCC != llvm::CallingConv::ARM_AAPCS_VFP) 2839414d8967e1d760ea1e19a4aca96b13777a8cf8c5Anton Korobeynikov FI.setEffectiveCallingConvention(llvm::CallingConv::ARM_AAPCS_VFP); 28405e7bacef79f7725f4abc45e2a5eccedae40dfcd3Daniel Dunbar break; 28415e7bacef79f7725f4abc45e2a5eccedae40dfcd3Daniel Dunbar } 2842c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov} 2843c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 2844194f06a476d299a7a70e5ff1d152f5895dc0a76cBob Wilson/// isHomogeneousAggregate - Return true if a type is an AAPCS-VFP homogeneous 2845194f06a476d299a7a70e5ff1d152f5895dc0a76cBob Wilson/// aggregate. If HAMembers is non-null, the number of base elements 2846194f06a476d299a7a70e5ff1d152f5895dc0a76cBob Wilson/// contained in the type is returned through it; this is used for the 2847194f06a476d299a7a70e5ff1d152f5895dc0a76cBob Wilson/// recursive calls that check aggregate component types. 2848194f06a476d299a7a70e5ff1d152f5895dc0a76cBob Wilsonstatic bool isHomogeneousAggregate(QualType Ty, const Type *&Base, 2849194f06a476d299a7a70e5ff1d152f5895dc0a76cBob Wilson ASTContext &Context, 2850194f06a476d299a7a70e5ff1d152f5895dc0a76cBob Wilson uint64_t *HAMembers = 0) { 2851eaf856db5d1a272dc7188937206ef4572836f82aAnton Korobeynikov uint64_t Members = 0; 2852194f06a476d299a7a70e5ff1d152f5895dc0a76cBob Wilson if (const ConstantArrayType *AT = Context.getAsConstantArrayType(Ty)) { 2853194f06a476d299a7a70e5ff1d152f5895dc0a76cBob Wilson if (!isHomogeneousAggregate(AT->getElementType(), Base, Context, &Members)) 2854194f06a476d299a7a70e5ff1d152f5895dc0a76cBob Wilson return false; 2855194f06a476d299a7a70e5ff1d152f5895dc0a76cBob Wilson Members *= AT->getSize().getZExtValue(); 2856194f06a476d299a7a70e5ff1d152f5895dc0a76cBob Wilson } else if (const RecordType *RT = Ty->getAs<RecordType>()) { 2857194f06a476d299a7a70e5ff1d152f5895dc0a76cBob Wilson const RecordDecl *RD = RT->getDecl(); 2858eaf856db5d1a272dc7188937206ef4572836f82aAnton Korobeynikov if (RD->hasFlexibleArrayMember()) 2859194f06a476d299a7a70e5ff1d152f5895dc0a76cBob Wilson return false; 2860eaf856db5d1a272dc7188937206ef4572836f82aAnton Korobeynikov 2861194f06a476d299a7a70e5ff1d152f5895dc0a76cBob Wilson Members = 0; 2862194f06a476d299a7a70e5ff1d152f5895dc0a76cBob Wilson for (RecordDecl::field_iterator i = RD->field_begin(), e = RD->field_end(); 2863194f06a476d299a7a70e5ff1d152f5895dc0a76cBob Wilson i != e; ++i) { 2864581deb3da481053c4993c7600f97acf7768caac5David Blaikie const FieldDecl *FD = *i; 2865194f06a476d299a7a70e5ff1d152f5895dc0a76cBob Wilson uint64_t FldMembers; 2866194f06a476d299a7a70e5ff1d152f5895dc0a76cBob Wilson if (!isHomogeneousAggregate(FD->getType(), Base, Context, &FldMembers)) 2867194f06a476d299a7a70e5ff1d152f5895dc0a76cBob Wilson return false; 2868eaf856db5d1a272dc7188937206ef4572836f82aAnton Korobeynikov 2869eaf856db5d1a272dc7188937206ef4572836f82aAnton Korobeynikov Members = (RD->isUnion() ? 2870eaf856db5d1a272dc7188937206ef4572836f82aAnton Korobeynikov std::max(Members, FldMembers) : Members + FldMembers); 2871194f06a476d299a7a70e5ff1d152f5895dc0a76cBob Wilson } 2872194f06a476d299a7a70e5ff1d152f5895dc0a76cBob Wilson } else { 2873194f06a476d299a7a70e5ff1d152f5895dc0a76cBob Wilson Members = 1; 2874194f06a476d299a7a70e5ff1d152f5895dc0a76cBob Wilson if (const ComplexType *CT = Ty->getAs<ComplexType>()) { 2875194f06a476d299a7a70e5ff1d152f5895dc0a76cBob Wilson Members = 2; 2876194f06a476d299a7a70e5ff1d152f5895dc0a76cBob Wilson Ty = CT->getElementType(); 2877194f06a476d299a7a70e5ff1d152f5895dc0a76cBob Wilson } 2878194f06a476d299a7a70e5ff1d152f5895dc0a76cBob Wilson 2879194f06a476d299a7a70e5ff1d152f5895dc0a76cBob Wilson // Homogeneous aggregates for AAPCS-VFP must have base types of float, 2880194f06a476d299a7a70e5ff1d152f5895dc0a76cBob Wilson // double, or 64-bit or 128-bit vectors. 2881194f06a476d299a7a70e5ff1d152f5895dc0a76cBob Wilson if (const BuiltinType *BT = Ty->getAs<BuiltinType>()) { 2882194f06a476d299a7a70e5ff1d152f5895dc0a76cBob Wilson if (BT->getKind() != BuiltinType::Float && 2883adfa45ffd67d1959cb1ff8cec88ad2ff3ffb7798Tim Northover BT->getKind() != BuiltinType::Double && 2884adfa45ffd67d1959cb1ff8cec88ad2ff3ffb7798Tim Northover BT->getKind() != BuiltinType::LongDouble) 2885194f06a476d299a7a70e5ff1d152f5895dc0a76cBob Wilson return false; 2886194f06a476d299a7a70e5ff1d152f5895dc0a76cBob Wilson } else if (const VectorType *VT = Ty->getAs<VectorType>()) { 2887194f06a476d299a7a70e5ff1d152f5895dc0a76cBob Wilson unsigned VecSize = Context.getTypeSize(VT); 2888194f06a476d299a7a70e5ff1d152f5895dc0a76cBob Wilson if (VecSize != 64 && VecSize != 128) 2889194f06a476d299a7a70e5ff1d152f5895dc0a76cBob Wilson return false; 2890194f06a476d299a7a70e5ff1d152f5895dc0a76cBob Wilson } else { 2891194f06a476d299a7a70e5ff1d152f5895dc0a76cBob Wilson return false; 2892194f06a476d299a7a70e5ff1d152f5895dc0a76cBob Wilson } 2893194f06a476d299a7a70e5ff1d152f5895dc0a76cBob Wilson 2894194f06a476d299a7a70e5ff1d152f5895dc0a76cBob Wilson // The base type must be the same for all members. Vector types of the 2895194f06a476d299a7a70e5ff1d152f5895dc0a76cBob Wilson // same total size are treated as being equivalent here. 2896194f06a476d299a7a70e5ff1d152f5895dc0a76cBob Wilson const Type *TyPtr = Ty.getTypePtr(); 2897194f06a476d299a7a70e5ff1d152f5895dc0a76cBob Wilson if (!Base) 2898194f06a476d299a7a70e5ff1d152f5895dc0a76cBob Wilson Base = TyPtr; 2899194f06a476d299a7a70e5ff1d152f5895dc0a76cBob Wilson if (Base != TyPtr && 2900194f06a476d299a7a70e5ff1d152f5895dc0a76cBob Wilson (!Base->isVectorType() || !TyPtr->isVectorType() || 2901194f06a476d299a7a70e5ff1d152f5895dc0a76cBob Wilson Context.getTypeSize(Base) != Context.getTypeSize(TyPtr))) 2902194f06a476d299a7a70e5ff1d152f5895dc0a76cBob Wilson return false; 2903194f06a476d299a7a70e5ff1d152f5895dc0a76cBob Wilson } 2904194f06a476d299a7a70e5ff1d152f5895dc0a76cBob Wilson 2905194f06a476d299a7a70e5ff1d152f5895dc0a76cBob Wilson // Homogeneous Aggregates can have at most 4 members of the base type. 2906194f06a476d299a7a70e5ff1d152f5895dc0a76cBob Wilson if (HAMembers) 2907194f06a476d299a7a70e5ff1d152f5895dc0a76cBob Wilson *HAMembers = Members; 2908eaf856db5d1a272dc7188937206ef4572836f82aAnton Korobeynikov 2909eaf856db5d1a272dc7188937206ef4572836f82aAnton Korobeynikov return (Members > 0 && Members <= 4); 2910194f06a476d299a7a70e5ff1d152f5895dc0a76cBob Wilson} 2911194f06a476d299a7a70e5ff1d152f5895dc0a76cBob Wilson 2912a3c109bbf6e198f463fbe204da4d25b40dab65c4Chris LattnerABIArgInfo ARMABIInfo::classifyArgumentType(QualType Ty) const { 2913d608cdb7c044365cf4e8764ade1e11e99c176078John McCall if (!isAggregateTypeForABI(Ty)) { 2914aa74a1e49f7c4b89539830290f76fe2c3e97187fDouglas Gregor // Treat an enum type as its underlying type. 2915aa74a1e49f7c4b89539830290f76fe2c3e97187fDouglas Gregor if (const EnumType *EnumTy = Ty->getAs<EnumType>()) 2916aa74a1e49f7c4b89539830290f76fe2c3e97187fDouglas Gregor Ty = EnumTy->getDecl()->getIntegerType(); 2917aa74a1e49f7c4b89539830290f76fe2c3e97187fDouglas Gregor 2918cc6fa88666ca2f287df4a600eb31a4087bab9c13Anton Korobeynikov return (Ty->isPromotableIntegerType() ? 2919cc6fa88666ca2f287df4a600eb31a4087bab9c13Anton Korobeynikov ABIArgInfo::getExtend() : ABIArgInfo::getDirect()); 2920aa74a1e49f7c4b89539830290f76fe2c3e97187fDouglas Gregor } 292198303b93ae335bbb4731f6f1f8164d3c70648346Daniel Dunbar 2922420255710694e958fa04bed1d80d96508949879eDaniel Dunbar // Ignore empty records. 2923a3c109bbf6e198f463fbe204da4d25b40dab65c4Chris Lattner if (isEmptyRecord(getContext(), Ty, true)) 2924420255710694e958fa04bed1d80d96508949879eDaniel Dunbar return ABIArgInfo::getIgnore(); 2925420255710694e958fa04bed1d80d96508949879eDaniel Dunbar 29260eb1d9733801764cd8b692c67e117e4feeecf013Rafael Espindola // Structures with either a non-trivial destructor or a non-trivial 29270eb1d9733801764cd8b692c67e117e4feeecf013Rafael Espindola // copy constructor are always indirect. 29280eb1d9733801764cd8b692c67e117e4feeecf013Rafael Espindola if (isRecordWithNonTrivialDestructorOrCopyConstructor(Ty)) 29290eb1d9733801764cd8b692c67e117e4feeecf013Rafael Espindola return ABIArgInfo::getIndirect(0, /*ByVal=*/false); 29300eb1d9733801764cd8b692c67e117e4feeecf013Rafael Espindola 2931194f06a476d299a7a70e5ff1d152f5895dc0a76cBob Wilson if (getABIKind() == ARMABIInfo::AAPCS_VFP) { 2932194f06a476d299a7a70e5ff1d152f5895dc0a76cBob Wilson // Homogeneous Aggregates need to be expanded. 2933194f06a476d299a7a70e5ff1d152f5895dc0a76cBob Wilson const Type *Base = 0; 2934eaf856db5d1a272dc7188937206ef4572836f82aAnton Korobeynikov if (isHomogeneousAggregate(Ty, Base, getContext())) { 2935eaf856db5d1a272dc7188937206ef4572836f82aAnton Korobeynikov assert(Base && "Base class should be set for homogeneous aggregate"); 2936194f06a476d299a7a70e5ff1d152f5895dc0a76cBob Wilson return ABIArgInfo::getExpand(); 2937eaf856db5d1a272dc7188937206ef4572836f82aAnton Korobeynikov } 2938194f06a476d299a7a70e5ff1d152f5895dc0a76cBob Wilson } 2939194f06a476d299a7a70e5ff1d152f5895dc0a76cBob Wilson 2940634b3d26969f139a25b223074567ba5ab7ba7dd9Manman Ren // Support byval for ARM. 2941634b3d26969f139a25b223074567ba5ab7ba7dd9Manman Ren if (getContext().getTypeSizeInChars(Ty) > CharUnits::fromQuantity(64) || 2942634b3d26969f139a25b223074567ba5ab7ba7dd9Manman Ren getContext().getTypeAlign(Ty) > 64) { 2943634b3d26969f139a25b223074567ba5ab7ba7dd9Manman Ren return ABIArgInfo::getIndirect(0, /*ByVal=*/true); 294479f30981fcd25c6ff88807372a2744af02a7690eEli Friedman } 294579f30981fcd25c6ff88807372a2744af02a7690eEli Friedman 29468aa87c71d9bfec14e135c683b0d7b9de999dbcb0Daniel Dunbar // Otherwise, pass by coercing to a structure of the appropriate size. 29472acc6e3feda5e4f7d9009bdcf8b1cd777fecfe2dChris Lattner llvm::Type* ElemTy; 2948c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov unsigned SizeRegs; 294979f30981fcd25c6ff88807372a2744af02a7690eEli Friedman // FIXME: Try to match the types of the arguments more accurately where 295079f30981fcd25c6ff88807372a2744af02a7690eEli Friedman // we can. 295179f30981fcd25c6ff88807372a2744af02a7690eEli Friedman if (getContext().getTypeAlign(Ty) <= 32) { 295253fc1a6151ec31350309f479c0d2252366e4815cBob Wilson ElemTy = llvm::Type::getInt32Ty(getVMContext()); 295353fc1a6151ec31350309f479c0d2252366e4815cBob Wilson SizeRegs = (getContext().getTypeSize(Ty) + 31) / 32; 295478eb76e2eefdc381dd4a97bc8ee628ae975aff35Manman Ren } else { 295578eb76e2eefdc381dd4a97bc8ee628ae975aff35Manman Ren ElemTy = llvm::Type::getInt64Ty(getVMContext()); 295678eb76e2eefdc381dd4a97bc8ee628ae975aff35Manman Ren SizeRegs = (getContext().getTypeSize(Ty) + 63) / 64; 2957c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov } 2958b7f62d01369c2a6e4af5dd2a76052ae65892161dStuart Hastings 29599cbe4f0ba01ec304e1e3d071c071f7bca33631c0Chris Lattner llvm::Type *STy = 29607650d95a1a616ea300f37126a8dfc93dc19a662aChris Lattner llvm::StructType::get(llvm::ArrayType::get(ElemTy, SizeRegs), NULL); 2961b7f62d01369c2a6e4af5dd2a76052ae65892161dStuart Hastings return ABIArgInfo::getDirect(STy); 2962c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov} 2963c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 2964a3c109bbf6e198f463fbe204da4d25b40dab65c4Chris Lattnerstatic bool isIntegerLikeType(QualType Ty, ASTContext &Context, 296598303b93ae335bbb4731f6f1f8164d3c70648346Daniel Dunbar llvm::LLVMContext &VMContext) { 296698303b93ae335bbb4731f6f1f8164d3c70648346Daniel Dunbar // APCS, C Language Calling Conventions, Non-Simple Return Values: A structure 296798303b93ae335bbb4731f6f1f8164d3c70648346Daniel Dunbar // is called integer-like if its size is less than or equal to one word, and 296898303b93ae335bbb4731f6f1f8164d3c70648346Daniel Dunbar // the offset of each of its addressable sub-fields is zero. 296998303b93ae335bbb4731f6f1f8164d3c70648346Daniel Dunbar 297098303b93ae335bbb4731f6f1f8164d3c70648346Daniel Dunbar uint64_t Size = Context.getTypeSize(Ty); 297198303b93ae335bbb4731f6f1f8164d3c70648346Daniel Dunbar 297298303b93ae335bbb4731f6f1f8164d3c70648346Daniel Dunbar // Check that the type fits in a word. 297398303b93ae335bbb4731f6f1f8164d3c70648346Daniel Dunbar if (Size > 32) 297498303b93ae335bbb4731f6f1f8164d3c70648346Daniel Dunbar return false; 297598303b93ae335bbb4731f6f1f8164d3c70648346Daniel Dunbar 297698303b93ae335bbb4731f6f1f8164d3c70648346Daniel Dunbar // FIXME: Handle vector types! 297798303b93ae335bbb4731f6f1f8164d3c70648346Daniel Dunbar if (Ty->isVectorType()) 297898303b93ae335bbb4731f6f1f8164d3c70648346Daniel Dunbar return false; 297998303b93ae335bbb4731f6f1f8164d3c70648346Daniel Dunbar 2980b0d58196808aba4b3d1a7488bd5566f3c0a83e89Daniel Dunbar // Float types are never treated as "integer like". 2981b0d58196808aba4b3d1a7488bd5566f3c0a83e89Daniel Dunbar if (Ty->isRealFloatingType()) 2982b0d58196808aba4b3d1a7488bd5566f3c0a83e89Daniel Dunbar return false; 2983b0d58196808aba4b3d1a7488bd5566f3c0a83e89Daniel Dunbar 298498303b93ae335bbb4731f6f1f8164d3c70648346Daniel Dunbar // If this is a builtin or pointer type then it is ok. 2985183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall if (Ty->getAs<BuiltinType>() || Ty->isPointerType()) 298698303b93ae335bbb4731f6f1f8164d3c70648346Daniel Dunbar return true; 298798303b93ae335bbb4731f6f1f8164d3c70648346Daniel Dunbar 29884581581881d3f7349bf5a4b39d761bce688f9164Daniel Dunbar // Small complex integer types are "integer like". 29894581581881d3f7349bf5a4b39d761bce688f9164Daniel Dunbar if (const ComplexType *CT = Ty->getAs<ComplexType>()) 29904581581881d3f7349bf5a4b39d761bce688f9164Daniel Dunbar return isIntegerLikeType(CT->getElementType(), Context, VMContext); 299198303b93ae335bbb4731f6f1f8164d3c70648346Daniel Dunbar 299298303b93ae335bbb4731f6f1f8164d3c70648346Daniel Dunbar // Single element and zero sized arrays should be allowed, by the definition 299398303b93ae335bbb4731f6f1f8164d3c70648346Daniel Dunbar // above, but they are not. 299498303b93ae335bbb4731f6f1f8164d3c70648346Daniel Dunbar 299598303b93ae335bbb4731f6f1f8164d3c70648346Daniel Dunbar // Otherwise, it must be a record type. 299698303b93ae335bbb4731f6f1f8164d3c70648346Daniel Dunbar const RecordType *RT = Ty->getAs<RecordType>(); 299798303b93ae335bbb4731f6f1f8164d3c70648346Daniel Dunbar if (!RT) return false; 299898303b93ae335bbb4731f6f1f8164d3c70648346Daniel Dunbar 299998303b93ae335bbb4731f6f1f8164d3c70648346Daniel Dunbar // Ignore records with flexible arrays. 300098303b93ae335bbb4731f6f1f8164d3c70648346Daniel Dunbar const RecordDecl *RD = RT->getDecl(); 300198303b93ae335bbb4731f6f1f8164d3c70648346Daniel Dunbar if (RD->hasFlexibleArrayMember()) 300298303b93ae335bbb4731f6f1f8164d3c70648346Daniel Dunbar return false; 300398303b93ae335bbb4731f6f1f8164d3c70648346Daniel Dunbar 300498303b93ae335bbb4731f6f1f8164d3c70648346Daniel Dunbar // Check that all sub-fields are at offset 0, and are themselves "integer 300598303b93ae335bbb4731f6f1f8164d3c70648346Daniel Dunbar // like". 300698303b93ae335bbb4731f6f1f8164d3c70648346Daniel Dunbar const ASTRecordLayout &Layout = Context.getASTRecordLayout(RD); 300798303b93ae335bbb4731f6f1f8164d3c70648346Daniel Dunbar 300898303b93ae335bbb4731f6f1f8164d3c70648346Daniel Dunbar bool HadField = false; 300998303b93ae335bbb4731f6f1f8164d3c70648346Daniel Dunbar unsigned idx = 0; 301098303b93ae335bbb4731f6f1f8164d3c70648346Daniel Dunbar for (RecordDecl::field_iterator i = RD->field_begin(), e = RD->field_end(); 301198303b93ae335bbb4731f6f1f8164d3c70648346Daniel Dunbar i != e; ++i, ++idx) { 3012581deb3da481053c4993c7600f97acf7768caac5David Blaikie const FieldDecl *FD = *i; 301398303b93ae335bbb4731f6f1f8164d3c70648346Daniel Dunbar 3014679855a6e14fbc6c6838c566aa74c32f52f4f946Daniel Dunbar // Bit-fields are not addressable, we only need to verify they are "integer 3015679855a6e14fbc6c6838c566aa74c32f52f4f946Daniel Dunbar // like". We still have to disallow a subsequent non-bitfield, for example: 3016679855a6e14fbc6c6838c566aa74c32f52f4f946Daniel Dunbar // struct { int : 0; int x } 3017679855a6e14fbc6c6838c566aa74c32f52f4f946Daniel Dunbar // is non-integer like according to gcc. 3018679855a6e14fbc6c6838c566aa74c32f52f4f946Daniel Dunbar if (FD->isBitField()) { 3019679855a6e14fbc6c6838c566aa74c32f52f4f946Daniel Dunbar if (!RD->isUnion()) 3020679855a6e14fbc6c6838c566aa74c32f52f4f946Daniel Dunbar HadField = true; 3021679855a6e14fbc6c6838c566aa74c32f52f4f946Daniel Dunbar 3022679855a6e14fbc6c6838c566aa74c32f52f4f946Daniel Dunbar if (!isIntegerLikeType(FD->getType(), Context, VMContext)) 3023679855a6e14fbc6c6838c566aa74c32f52f4f946Daniel Dunbar return false; 302498303b93ae335bbb4731f6f1f8164d3c70648346Daniel Dunbar 3025679855a6e14fbc6c6838c566aa74c32f52f4f946Daniel Dunbar continue; 302698303b93ae335bbb4731f6f1f8164d3c70648346Daniel Dunbar } 302798303b93ae335bbb4731f6f1f8164d3c70648346Daniel Dunbar 3028679855a6e14fbc6c6838c566aa74c32f52f4f946Daniel Dunbar // Check if this field is at offset 0. 3029679855a6e14fbc6c6838c566aa74c32f52f4f946Daniel Dunbar if (Layout.getFieldOffset(idx) != 0) 3030679855a6e14fbc6c6838c566aa74c32f52f4f946Daniel Dunbar return false; 3031679855a6e14fbc6c6838c566aa74c32f52f4f946Daniel Dunbar 303298303b93ae335bbb4731f6f1f8164d3c70648346Daniel Dunbar if (!isIntegerLikeType(FD->getType(), Context, VMContext)) 303398303b93ae335bbb4731f6f1f8164d3c70648346Daniel Dunbar return false; 30348bea82f6699e4384ef823cdc8800ad5db271177cMichael J. Spencer 3035679855a6e14fbc6c6838c566aa74c32f52f4f946Daniel Dunbar // Only allow at most one field in a structure. This doesn't match the 3036679855a6e14fbc6c6838c566aa74c32f52f4f946Daniel Dunbar // wording above, but follows gcc in situations with a field following an 3037679855a6e14fbc6c6838c566aa74c32f52f4f946Daniel Dunbar // empty structure. 303898303b93ae335bbb4731f6f1f8164d3c70648346Daniel Dunbar if (!RD->isUnion()) { 303998303b93ae335bbb4731f6f1f8164d3c70648346Daniel Dunbar if (HadField) 304098303b93ae335bbb4731f6f1f8164d3c70648346Daniel Dunbar return false; 304198303b93ae335bbb4731f6f1f8164d3c70648346Daniel Dunbar 304298303b93ae335bbb4731f6f1f8164d3c70648346Daniel Dunbar HadField = true; 304398303b93ae335bbb4731f6f1f8164d3c70648346Daniel Dunbar } 304498303b93ae335bbb4731f6f1f8164d3c70648346Daniel Dunbar } 304598303b93ae335bbb4731f6f1f8164d3c70648346Daniel Dunbar 304698303b93ae335bbb4731f6f1f8164d3c70648346Daniel Dunbar return true; 304798303b93ae335bbb4731f6f1f8164d3c70648346Daniel Dunbar} 304898303b93ae335bbb4731f6f1f8164d3c70648346Daniel Dunbar 3049a3c109bbf6e198f463fbe204da4d25b40dab65c4Chris LattnerABIArgInfo ARMABIInfo::classifyReturnType(QualType RetTy) const { 305098303b93ae335bbb4731f6f1f8164d3c70648346Daniel Dunbar if (RetTy->isVoidType()) 3051c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov return ABIArgInfo::getIgnore(); 305298303b93ae335bbb4731f6f1f8164d3c70648346Daniel Dunbar 3053f554b1cc3083d9ed1fb9b52a305025f744e90d08Daniel Dunbar // Large vector types should be returned via memory. 3054f554b1cc3083d9ed1fb9b52a305025f744e90d08Daniel Dunbar if (RetTy->isVectorType() && getContext().getTypeSize(RetTy) > 128) 3055f554b1cc3083d9ed1fb9b52a305025f744e90d08Daniel Dunbar return ABIArgInfo::getIndirect(0); 3056f554b1cc3083d9ed1fb9b52a305025f744e90d08Daniel Dunbar 3057d608cdb7c044365cf4e8764ade1e11e99c176078John McCall if (!isAggregateTypeForABI(RetTy)) { 3058aa74a1e49f7c4b89539830290f76fe2c3e97187fDouglas Gregor // Treat an enum type as its underlying type. 3059aa74a1e49f7c4b89539830290f76fe2c3e97187fDouglas Gregor if (const EnumType *EnumTy = RetTy->getAs<EnumType>()) 3060aa74a1e49f7c4b89539830290f76fe2c3e97187fDouglas Gregor RetTy = EnumTy->getDecl()->getIntegerType(); 3061aa74a1e49f7c4b89539830290f76fe2c3e97187fDouglas Gregor 3062cc6fa88666ca2f287df4a600eb31a4087bab9c13Anton Korobeynikov return (RetTy->isPromotableIntegerType() ? 3063cc6fa88666ca2f287df4a600eb31a4087bab9c13Anton Korobeynikov ABIArgInfo::getExtend() : ABIArgInfo::getDirect()); 3064aa74a1e49f7c4b89539830290f76fe2c3e97187fDouglas Gregor } 306598303b93ae335bbb4731f6f1f8164d3c70648346Daniel Dunbar 30660eb1d9733801764cd8b692c67e117e4feeecf013Rafael Espindola // Structures with either a non-trivial destructor or a non-trivial 30670eb1d9733801764cd8b692c67e117e4feeecf013Rafael Espindola // copy constructor are always indirect. 30680eb1d9733801764cd8b692c67e117e4feeecf013Rafael Espindola if (isRecordWithNonTrivialDestructorOrCopyConstructor(RetTy)) 30690eb1d9733801764cd8b692c67e117e4feeecf013Rafael Espindola return ABIArgInfo::getIndirect(0, /*ByVal=*/false); 30700eb1d9733801764cd8b692c67e117e4feeecf013Rafael Espindola 307198303b93ae335bbb4731f6f1f8164d3c70648346Daniel Dunbar // Are we following APCS? 307298303b93ae335bbb4731f6f1f8164d3c70648346Daniel Dunbar if (getABIKind() == APCS) { 3073a3c109bbf6e198f463fbe204da4d25b40dab65c4Chris Lattner if (isEmptyRecord(getContext(), RetTy, false)) 307498303b93ae335bbb4731f6f1f8164d3c70648346Daniel Dunbar return ABIArgInfo::getIgnore(); 307598303b93ae335bbb4731f6f1f8164d3c70648346Daniel Dunbar 30764cc753f4503931763cfb762a95928b44fcbe64e9Daniel Dunbar // Complex types are all returned as packed integers. 30774cc753f4503931763cfb762a95928b44fcbe64e9Daniel Dunbar // 30784cc753f4503931763cfb762a95928b44fcbe64e9Daniel Dunbar // FIXME: Consider using 2 x vector types if the back end handles them 30794cc753f4503931763cfb762a95928b44fcbe64e9Daniel Dunbar // correctly. 30804cc753f4503931763cfb762a95928b44fcbe64e9Daniel Dunbar if (RetTy->isAnyComplexType()) 3081800588fd230d2c37ddce8fbf4a3881352715d700Chris Lattner return ABIArgInfo::getDirect(llvm::IntegerType::get(getVMContext(), 3082a3c109bbf6e198f463fbe204da4d25b40dab65c4Chris Lattner getContext().getTypeSize(RetTy))); 30834cc753f4503931763cfb762a95928b44fcbe64e9Daniel Dunbar 308498303b93ae335bbb4731f6f1f8164d3c70648346Daniel Dunbar // Integer like structures are returned in r0. 3085a3c109bbf6e198f463fbe204da4d25b40dab65c4Chris Lattner if (isIntegerLikeType(RetTy, getContext(), getVMContext())) { 308698303b93ae335bbb4731f6f1f8164d3c70648346Daniel Dunbar // Return in the smallest viable integer type. 3087a3c109bbf6e198f463fbe204da4d25b40dab65c4Chris Lattner uint64_t Size = getContext().getTypeSize(RetTy); 308898303b93ae335bbb4731f6f1f8164d3c70648346Daniel Dunbar if (Size <= 8) 3089800588fd230d2c37ddce8fbf4a3881352715d700Chris Lattner return ABIArgInfo::getDirect(llvm::Type::getInt8Ty(getVMContext())); 309098303b93ae335bbb4731f6f1f8164d3c70648346Daniel Dunbar if (Size <= 16) 3091800588fd230d2c37ddce8fbf4a3881352715d700Chris Lattner return ABIArgInfo::getDirect(llvm::Type::getInt16Ty(getVMContext())); 3092800588fd230d2c37ddce8fbf4a3881352715d700Chris Lattner return ABIArgInfo::getDirect(llvm::Type::getInt32Ty(getVMContext())); 309398303b93ae335bbb4731f6f1f8164d3c70648346Daniel Dunbar } 309498303b93ae335bbb4731f6f1f8164d3c70648346Daniel Dunbar 309598303b93ae335bbb4731f6f1f8164d3c70648346Daniel Dunbar // Otherwise return in memory. 309698303b93ae335bbb4731f6f1f8164d3c70648346Daniel Dunbar return ABIArgInfo::getIndirect(0); 3097c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov } 309898303b93ae335bbb4731f6f1f8164d3c70648346Daniel Dunbar 309998303b93ae335bbb4731f6f1f8164d3c70648346Daniel Dunbar // Otherwise this is an AAPCS variant. 310098303b93ae335bbb4731f6f1f8164d3c70648346Daniel Dunbar 3101a3c109bbf6e198f463fbe204da4d25b40dab65c4Chris Lattner if (isEmptyRecord(getContext(), RetTy, true)) 310216a0808b7992db2c2ba78b387e1732bbb0fb371bDaniel Dunbar return ABIArgInfo::getIgnore(); 310316a0808b7992db2c2ba78b387e1732bbb0fb371bDaniel Dunbar 31043b694fab31d3a7a8379996cbe7ef8d53f7d677bcBob Wilson // Check for homogeneous aggregates with AAPCS-VFP. 31053b694fab31d3a7a8379996cbe7ef8d53f7d677bcBob Wilson if (getABIKind() == AAPCS_VFP) { 31063b694fab31d3a7a8379996cbe7ef8d53f7d677bcBob Wilson const Type *Base = 0; 3107eaf856db5d1a272dc7188937206ef4572836f82aAnton Korobeynikov if (isHomogeneousAggregate(RetTy, Base, getContext())) { 3108eaf856db5d1a272dc7188937206ef4572836f82aAnton Korobeynikov assert(Base && "Base class should be set for homogeneous aggregate"); 31093b694fab31d3a7a8379996cbe7ef8d53f7d677bcBob Wilson // Homogeneous Aggregates are returned directly. 31103b694fab31d3a7a8379996cbe7ef8d53f7d677bcBob Wilson return ABIArgInfo::getDirect(); 3111eaf856db5d1a272dc7188937206ef4572836f82aAnton Korobeynikov } 31123b694fab31d3a7a8379996cbe7ef8d53f7d677bcBob Wilson } 31133b694fab31d3a7a8379996cbe7ef8d53f7d677bcBob Wilson 311498303b93ae335bbb4731f6f1f8164d3c70648346Daniel Dunbar // Aggregates <= 4 bytes are returned in r0; other aggregates 311598303b93ae335bbb4731f6f1f8164d3c70648346Daniel Dunbar // are returned indirectly. 3116a3c109bbf6e198f463fbe204da4d25b40dab65c4Chris Lattner uint64_t Size = getContext().getTypeSize(RetTy); 311716a0808b7992db2c2ba78b387e1732bbb0fb371bDaniel Dunbar if (Size <= 32) { 311816a0808b7992db2c2ba78b387e1732bbb0fb371bDaniel Dunbar // Return in the smallest viable integer type. 311916a0808b7992db2c2ba78b387e1732bbb0fb371bDaniel Dunbar if (Size <= 8) 3120800588fd230d2c37ddce8fbf4a3881352715d700Chris Lattner return ABIArgInfo::getDirect(llvm::Type::getInt8Ty(getVMContext())); 312116a0808b7992db2c2ba78b387e1732bbb0fb371bDaniel Dunbar if (Size <= 16) 3122800588fd230d2c37ddce8fbf4a3881352715d700Chris Lattner return ABIArgInfo::getDirect(llvm::Type::getInt16Ty(getVMContext())); 3123800588fd230d2c37ddce8fbf4a3881352715d700Chris Lattner return ABIArgInfo::getDirect(llvm::Type::getInt32Ty(getVMContext())); 312416a0808b7992db2c2ba78b387e1732bbb0fb371bDaniel Dunbar } 312516a0808b7992db2c2ba78b387e1732bbb0fb371bDaniel Dunbar 312698303b93ae335bbb4731f6f1f8164d3c70648346Daniel Dunbar return ABIArgInfo::getIndirect(0); 3127c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov} 3128c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 3129c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikovllvm::Value *ARMABIInfo::EmitVAArg(llvm::Value *VAListAddr, QualType Ty, 313077b89b87c3b9220fea1bc80f6d6598d2003cc8a8Chris Lattner CodeGenFunction &CGF) const { 31318b418685e9e4f02f4eb2a76e1ec063e07552b68dChris Lattner llvm::Type *BP = CGF.Int8PtrTy; 31328b418685e9e4f02f4eb2a76e1ec063e07552b68dChris Lattner llvm::Type *BPP = CGF.Int8PtrPtrTy; 3133c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 3134c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov CGBuilderTy &Builder = CGF.Builder; 31358b418685e9e4f02f4eb2a76e1ec063e07552b68dChris Lattner llvm::Value *VAListAddrAsBPP = Builder.CreateBitCast(VAListAddr, BPP, "ap"); 3136c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov llvm::Value *Addr = Builder.CreateLoad(VAListAddrAsBPP, "ap.cur"); 3137e164c180527354acc16c1b9b2c5a5ed4a1e484d4Rafael Espindola // Handle address alignment for type alignment > 32 bits 3138e164c180527354acc16c1b9b2c5a5ed4a1e484d4Rafael Espindola uint64_t TyAlign = CGF.getContext().getTypeAlign(Ty) / 8; 3139e164c180527354acc16c1b9b2c5a5ed4a1e484d4Rafael Espindola if (TyAlign > 4) { 3140e164c180527354acc16c1b9b2c5a5ed4a1e484d4Rafael Espindola assert((TyAlign & (TyAlign - 1)) == 0 && 3141e164c180527354acc16c1b9b2c5a5ed4a1e484d4Rafael Espindola "Alignment is not power of 2!"); 3142e164c180527354acc16c1b9b2c5a5ed4a1e484d4Rafael Espindola llvm::Value *AddrAsInt = Builder.CreatePtrToInt(Addr, CGF.Int32Ty); 3143e164c180527354acc16c1b9b2c5a5ed4a1e484d4Rafael Espindola AddrAsInt = Builder.CreateAdd(AddrAsInt, Builder.getInt32(TyAlign - 1)); 3144e164c180527354acc16c1b9b2c5a5ed4a1e484d4Rafael Espindola AddrAsInt = Builder.CreateAnd(AddrAsInt, Builder.getInt32(~(TyAlign - 1))); 3145e164c180527354acc16c1b9b2c5a5ed4a1e484d4Rafael Espindola Addr = Builder.CreateIntToPtr(AddrAsInt, BP); 3146e164c180527354acc16c1b9b2c5a5ed4a1e484d4Rafael Espindola } 3147c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov llvm::Type *PTy = 314896e0fc726c6fe7538522c60743705d5e696b40afOwen Anderson llvm::PointerType::getUnqual(CGF.ConvertType(Ty)); 3149c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov llvm::Value *AddrTyped = Builder.CreateBitCast(Addr, PTy); 3150c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 3151c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov uint64_t Offset = 3152c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov llvm::RoundUpToAlignment(CGF.getContext().getTypeSize(Ty) / 8, 4); 3153c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov llvm::Value *NextAddr = 315477b89b87c3b9220fea1bc80f6d6598d2003cc8a8Chris Lattner Builder.CreateGEP(Addr, llvm::ConstantInt::get(CGF.Int32Ty, Offset), 3155c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov "ap.next"); 3156c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov Builder.CreateStore(NextAddr, VAListAddrAsBPP); 3157c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 3158c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov return AddrTyped; 3159c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov} 3160c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 3161dce5ad0cf70ba74e1ecdbb5e81f1a81d97821636Chris Lattner//===----------------------------------------------------------------------===// 31622c585b991596859f39860b6094247ba027a03530Justin Holewinski// NVPTX ABI Implementation 31630259c3a3df3c2f3b9de7e3845df1eea3ac04e1aaJustin Holewinski//===----------------------------------------------------------------------===// 31640259c3a3df3c2f3b9de7e3845df1eea3ac04e1aaJustin Holewinski 31650259c3a3df3c2f3b9de7e3845df1eea3ac04e1aaJustin Holewinskinamespace { 31660259c3a3df3c2f3b9de7e3845df1eea3ac04e1aaJustin Holewinski 31672c585b991596859f39860b6094247ba027a03530Justin Holewinskiclass NVPTXABIInfo : public ABIInfo { 31680259c3a3df3c2f3b9de7e3845df1eea3ac04e1aaJustin Holewinskipublic: 31692c585b991596859f39860b6094247ba027a03530Justin Holewinski NVPTXABIInfo(CodeGenTypes &CGT) : ABIInfo(CGT) {} 31700259c3a3df3c2f3b9de7e3845df1eea3ac04e1aaJustin Holewinski 31710259c3a3df3c2f3b9de7e3845df1eea3ac04e1aaJustin Holewinski ABIArgInfo classifyReturnType(QualType RetTy) const; 31720259c3a3df3c2f3b9de7e3845df1eea3ac04e1aaJustin Holewinski ABIArgInfo classifyArgumentType(QualType Ty) const; 31730259c3a3df3c2f3b9de7e3845df1eea3ac04e1aaJustin Holewinski 31740259c3a3df3c2f3b9de7e3845df1eea3ac04e1aaJustin Holewinski virtual void computeInfo(CGFunctionInfo &FI) const; 31750259c3a3df3c2f3b9de7e3845df1eea3ac04e1aaJustin Holewinski virtual llvm::Value *EmitVAArg(llvm::Value *VAListAddr, QualType Ty, 31760259c3a3df3c2f3b9de7e3845df1eea3ac04e1aaJustin Holewinski CodeGenFunction &CFG) const; 31770259c3a3df3c2f3b9de7e3845df1eea3ac04e1aaJustin Holewinski}; 31780259c3a3df3c2f3b9de7e3845df1eea3ac04e1aaJustin Holewinski 31792c585b991596859f39860b6094247ba027a03530Justin Holewinskiclass NVPTXTargetCodeGenInfo : public TargetCodeGenInfo { 31800259c3a3df3c2f3b9de7e3845df1eea3ac04e1aaJustin Holewinskipublic: 31812c585b991596859f39860b6094247ba027a03530Justin Holewinski NVPTXTargetCodeGenInfo(CodeGenTypes &CGT) 31822c585b991596859f39860b6094247ba027a03530Justin Holewinski : TargetCodeGenInfo(new NVPTXABIInfo(CGT)) {} 3183818eafb6ac56c87b80b34be29ca115cd309026d2Justin Holewinski 31842f7aa998c0d6494301c12c4fceb6134a1bc248abPeter Collingbourne virtual void SetTargetAttributes(const Decl *D, llvm::GlobalValue *GV, 31852f7aa998c0d6494301c12c4fceb6134a1bc248abPeter Collingbourne CodeGen::CodeGenModule &M) const; 31860259c3a3df3c2f3b9de7e3845df1eea3ac04e1aaJustin Holewinski}; 31870259c3a3df3c2f3b9de7e3845df1eea3ac04e1aaJustin Holewinski 31882c585b991596859f39860b6094247ba027a03530Justin HolewinskiABIArgInfo NVPTXABIInfo::classifyReturnType(QualType RetTy) const { 31890259c3a3df3c2f3b9de7e3845df1eea3ac04e1aaJustin Holewinski if (RetTy->isVoidType()) 31900259c3a3df3c2f3b9de7e3845df1eea3ac04e1aaJustin Holewinski return ABIArgInfo::getIgnore(); 31910259c3a3df3c2f3b9de7e3845df1eea3ac04e1aaJustin Holewinski if (isAggregateTypeForABI(RetTy)) 31920259c3a3df3c2f3b9de7e3845df1eea3ac04e1aaJustin Holewinski return ABIArgInfo::getIndirect(0); 31930259c3a3df3c2f3b9de7e3845df1eea3ac04e1aaJustin Holewinski return ABIArgInfo::getDirect(); 31940259c3a3df3c2f3b9de7e3845df1eea3ac04e1aaJustin Holewinski} 31950259c3a3df3c2f3b9de7e3845df1eea3ac04e1aaJustin Holewinski 31962c585b991596859f39860b6094247ba027a03530Justin HolewinskiABIArgInfo NVPTXABIInfo::classifyArgumentType(QualType Ty) const { 31970259c3a3df3c2f3b9de7e3845df1eea3ac04e1aaJustin Holewinski if (isAggregateTypeForABI(Ty)) 31980259c3a3df3c2f3b9de7e3845df1eea3ac04e1aaJustin Holewinski return ABIArgInfo::getIndirect(0); 31990259c3a3df3c2f3b9de7e3845df1eea3ac04e1aaJustin Holewinski 32000259c3a3df3c2f3b9de7e3845df1eea3ac04e1aaJustin Holewinski return ABIArgInfo::getDirect(); 32010259c3a3df3c2f3b9de7e3845df1eea3ac04e1aaJustin Holewinski} 32020259c3a3df3c2f3b9de7e3845df1eea3ac04e1aaJustin Holewinski 32032c585b991596859f39860b6094247ba027a03530Justin Holewinskivoid NVPTXABIInfo::computeInfo(CGFunctionInfo &FI) const { 32040259c3a3df3c2f3b9de7e3845df1eea3ac04e1aaJustin Holewinski FI.getReturnInfo() = classifyReturnType(FI.getReturnType()); 32050259c3a3df3c2f3b9de7e3845df1eea3ac04e1aaJustin Holewinski for (CGFunctionInfo::arg_iterator it = FI.arg_begin(), ie = FI.arg_end(); 32060259c3a3df3c2f3b9de7e3845df1eea3ac04e1aaJustin Holewinski it != ie; ++it) 32070259c3a3df3c2f3b9de7e3845df1eea3ac04e1aaJustin Holewinski it->info = classifyArgumentType(it->type); 32080259c3a3df3c2f3b9de7e3845df1eea3ac04e1aaJustin Holewinski 32090259c3a3df3c2f3b9de7e3845df1eea3ac04e1aaJustin Holewinski // Always honor user-specified calling convention. 32100259c3a3df3c2f3b9de7e3845df1eea3ac04e1aaJustin Holewinski if (FI.getCallingConvention() != llvm::CallingConv::C) 32110259c3a3df3c2f3b9de7e3845df1eea3ac04e1aaJustin Holewinski return; 32120259c3a3df3c2f3b9de7e3845df1eea3ac04e1aaJustin Holewinski 32130259c3a3df3c2f3b9de7e3845df1eea3ac04e1aaJustin Holewinski // Calling convention as default by an ABI. 32142c585b991596859f39860b6094247ba027a03530Justin Holewinski // We're still using the PTX_Kernel/PTX_Device calling conventions here, 32152c585b991596859f39860b6094247ba027a03530Justin Holewinski // but we should switch to NVVM metadata later on. 32160259c3a3df3c2f3b9de7e3845df1eea3ac04e1aaJustin Holewinski llvm::CallingConv::ID DefaultCC; 32174e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie const LangOptions &LangOpts = getContext().getLangOpts(); 3218744d90bfe2a43847764a707b1bee7ef1e30ad5f2Peter Collingbourne if (LangOpts.OpenCL || LangOpts.CUDA) { 3219744d90bfe2a43847764a707b1bee7ef1e30ad5f2Peter Collingbourne // If we are in OpenCL or CUDA mode, then default to device functions 32200259c3a3df3c2f3b9de7e3845df1eea3ac04e1aaJustin Holewinski DefaultCC = llvm::CallingConv::PTX_Device; 3221818eafb6ac56c87b80b34be29ca115cd309026d2Justin Holewinski } else { 3222818eafb6ac56c87b80b34be29ca115cd309026d2Justin Holewinski // If we are in standard C/C++ mode, use the triple to decide on the default 3223818eafb6ac56c87b80b34be29ca115cd309026d2Justin Holewinski StringRef Env = 3224818eafb6ac56c87b80b34be29ca115cd309026d2Justin Holewinski getContext().getTargetInfo().getTriple().getEnvironmentName(); 3225818eafb6ac56c87b80b34be29ca115cd309026d2Justin Holewinski if (Env == "device") 3226818eafb6ac56c87b80b34be29ca115cd309026d2Justin Holewinski DefaultCC = llvm::CallingConv::PTX_Device; 3227818eafb6ac56c87b80b34be29ca115cd309026d2Justin Holewinski else 3228818eafb6ac56c87b80b34be29ca115cd309026d2Justin Holewinski DefaultCC = llvm::CallingConv::PTX_Kernel; 3229818eafb6ac56c87b80b34be29ca115cd309026d2Justin Holewinski } 32300259c3a3df3c2f3b9de7e3845df1eea3ac04e1aaJustin Holewinski FI.setEffectiveCallingConvention(DefaultCC); 3231818eafb6ac56c87b80b34be29ca115cd309026d2Justin Holewinski 32320259c3a3df3c2f3b9de7e3845df1eea3ac04e1aaJustin Holewinski} 32330259c3a3df3c2f3b9de7e3845df1eea3ac04e1aaJustin Holewinski 32342c585b991596859f39860b6094247ba027a03530Justin Holewinskillvm::Value *NVPTXABIInfo::EmitVAArg(llvm::Value *VAListAddr, QualType Ty, 32352c585b991596859f39860b6094247ba027a03530Justin Holewinski CodeGenFunction &CFG) const { 32362c585b991596859f39860b6094247ba027a03530Justin Holewinski llvm_unreachable("NVPTX does not support varargs"); 32370259c3a3df3c2f3b9de7e3845df1eea3ac04e1aaJustin Holewinski} 32380259c3a3df3c2f3b9de7e3845df1eea3ac04e1aaJustin Holewinski 32392c585b991596859f39860b6094247ba027a03530Justin Holewinskivoid NVPTXTargetCodeGenInfo:: 32402c585b991596859f39860b6094247ba027a03530Justin HolewinskiSetTargetAttributes(const Decl *D, llvm::GlobalValue *GV, 32412c585b991596859f39860b6094247ba027a03530Justin Holewinski CodeGen::CodeGenModule &M) const{ 3242818eafb6ac56c87b80b34be29ca115cd309026d2Justin Holewinski const FunctionDecl *FD = dyn_cast<FunctionDecl>(D); 3243818eafb6ac56c87b80b34be29ca115cd309026d2Justin Holewinski if (!FD) return; 3244818eafb6ac56c87b80b34be29ca115cd309026d2Justin Holewinski 3245818eafb6ac56c87b80b34be29ca115cd309026d2Justin Holewinski llvm::Function *F = cast<llvm::Function>(GV); 3246818eafb6ac56c87b80b34be29ca115cd309026d2Justin Holewinski 3247818eafb6ac56c87b80b34be29ca115cd309026d2Justin Holewinski // Perform special handling in OpenCL mode 32484e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (M.getLangOpts().OpenCL) { 3249818eafb6ac56c87b80b34be29ca115cd309026d2Justin Holewinski // Use OpenCL function attributes to set proper calling conventions 3250818eafb6ac56c87b80b34be29ca115cd309026d2Justin Holewinski // By default, all functions are device functions 3251818eafb6ac56c87b80b34be29ca115cd309026d2Justin Holewinski if (FD->hasAttr<OpenCLKernelAttr>()) { 3252818eafb6ac56c87b80b34be29ca115cd309026d2Justin Holewinski // OpenCL __kernel functions get a kernel calling convention 3253744d90bfe2a43847764a707b1bee7ef1e30ad5f2Peter Collingbourne F->setCallingConv(llvm::CallingConv::PTX_Kernel); 3254818eafb6ac56c87b80b34be29ca115cd309026d2Justin Holewinski // And kernel functions are not subject to inlining 3255818eafb6ac56c87b80b34be29ca115cd309026d2Justin Holewinski F->addFnAttr(llvm::Attribute::NoInline); 3256818eafb6ac56c87b80b34be29ca115cd309026d2Justin Holewinski } 3257744d90bfe2a43847764a707b1bee7ef1e30ad5f2Peter Collingbourne } 3258818eafb6ac56c87b80b34be29ca115cd309026d2Justin Holewinski 3259744d90bfe2a43847764a707b1bee7ef1e30ad5f2Peter Collingbourne // Perform special handling in CUDA mode. 32604e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (M.getLangOpts().CUDA) { 3261744d90bfe2a43847764a707b1bee7ef1e30ad5f2Peter Collingbourne // CUDA __global__ functions get a kernel calling convention. Since 3262744d90bfe2a43847764a707b1bee7ef1e30ad5f2Peter Collingbourne // __global__ functions cannot be called from the device, we do not 3263744d90bfe2a43847764a707b1bee7ef1e30ad5f2Peter Collingbourne // need to set the noinline attribute. 3264744d90bfe2a43847764a707b1bee7ef1e30ad5f2Peter Collingbourne if (FD->getAttr<CUDAGlobalAttr>()) 3265744d90bfe2a43847764a707b1bee7ef1e30ad5f2Peter Collingbourne F->setCallingConv(llvm::CallingConv::PTX_Kernel); 3266818eafb6ac56c87b80b34be29ca115cd309026d2Justin Holewinski } 3267818eafb6ac56c87b80b34be29ca115cd309026d2Justin Holewinski} 3268818eafb6ac56c87b80b34be29ca115cd309026d2Justin Holewinski 32690259c3a3df3c2f3b9de7e3845df1eea3ac04e1aaJustin Holewinski} 32700259c3a3df3c2f3b9de7e3845df1eea3ac04e1aaJustin Holewinski 32710259c3a3df3c2f3b9de7e3845df1eea3ac04e1aaJustin Holewinski//===----------------------------------------------------------------------===// 3272276fdf408050d205f3a7f34c1e788224a67d2098Wesley Peck// MBlaze ABI Implementation 3273276fdf408050d205f3a7f34c1e788224a67d2098Wesley Peck//===----------------------------------------------------------------------===// 3274276fdf408050d205f3a7f34c1e788224a67d2098Wesley Peck 3275276fdf408050d205f3a7f34c1e788224a67d2098Wesley Pecknamespace { 3276276fdf408050d205f3a7f34c1e788224a67d2098Wesley Peck 3277276fdf408050d205f3a7f34c1e788224a67d2098Wesley Peckclass MBlazeABIInfo : public ABIInfo { 3278276fdf408050d205f3a7f34c1e788224a67d2098Wesley Peckpublic: 3279276fdf408050d205f3a7f34c1e788224a67d2098Wesley Peck MBlazeABIInfo(CodeGenTypes &CGT) : ABIInfo(CGT) {} 3280276fdf408050d205f3a7f34c1e788224a67d2098Wesley Peck 3281276fdf408050d205f3a7f34c1e788224a67d2098Wesley Peck bool isPromotableIntegerType(QualType Ty) const; 3282276fdf408050d205f3a7f34c1e788224a67d2098Wesley Peck 3283276fdf408050d205f3a7f34c1e788224a67d2098Wesley Peck ABIArgInfo classifyReturnType(QualType RetTy) const; 3284276fdf408050d205f3a7f34c1e788224a67d2098Wesley Peck ABIArgInfo classifyArgumentType(QualType RetTy) const; 3285276fdf408050d205f3a7f34c1e788224a67d2098Wesley Peck 3286276fdf408050d205f3a7f34c1e788224a67d2098Wesley Peck virtual void computeInfo(CGFunctionInfo &FI) const { 3287276fdf408050d205f3a7f34c1e788224a67d2098Wesley Peck FI.getReturnInfo() = classifyReturnType(FI.getReturnType()); 3288276fdf408050d205f3a7f34c1e788224a67d2098Wesley Peck for (CGFunctionInfo::arg_iterator it = FI.arg_begin(), ie = FI.arg_end(); 3289276fdf408050d205f3a7f34c1e788224a67d2098Wesley Peck it != ie; ++it) 3290276fdf408050d205f3a7f34c1e788224a67d2098Wesley Peck it->info = classifyArgumentType(it->type); 3291276fdf408050d205f3a7f34c1e788224a67d2098Wesley Peck } 3292276fdf408050d205f3a7f34c1e788224a67d2098Wesley Peck 3293276fdf408050d205f3a7f34c1e788224a67d2098Wesley Peck virtual llvm::Value *EmitVAArg(llvm::Value *VAListAddr, QualType Ty, 3294276fdf408050d205f3a7f34c1e788224a67d2098Wesley Peck CodeGenFunction &CGF) const; 3295276fdf408050d205f3a7f34c1e788224a67d2098Wesley Peck}; 3296276fdf408050d205f3a7f34c1e788224a67d2098Wesley Peck 3297276fdf408050d205f3a7f34c1e788224a67d2098Wesley Peckclass MBlazeTargetCodeGenInfo : public TargetCodeGenInfo { 3298276fdf408050d205f3a7f34c1e788224a67d2098Wesley Peckpublic: 3299276fdf408050d205f3a7f34c1e788224a67d2098Wesley Peck MBlazeTargetCodeGenInfo(CodeGenTypes &CGT) 3300276fdf408050d205f3a7f34c1e788224a67d2098Wesley Peck : TargetCodeGenInfo(new MBlazeABIInfo(CGT)) {} 3301276fdf408050d205f3a7f34c1e788224a67d2098Wesley Peck void SetTargetAttributes(const Decl *D, llvm::GlobalValue *GV, 3302276fdf408050d205f3a7f34c1e788224a67d2098Wesley Peck CodeGen::CodeGenModule &M) const; 3303276fdf408050d205f3a7f34c1e788224a67d2098Wesley Peck}; 3304276fdf408050d205f3a7f34c1e788224a67d2098Wesley Peck 3305276fdf408050d205f3a7f34c1e788224a67d2098Wesley Peck} 3306276fdf408050d205f3a7f34c1e788224a67d2098Wesley Peck 3307276fdf408050d205f3a7f34c1e788224a67d2098Wesley Peckbool MBlazeABIInfo::isPromotableIntegerType(QualType Ty) const { 3308276fdf408050d205f3a7f34c1e788224a67d2098Wesley Peck // MBlaze ABI requires all 8 and 16 bit quantities to be extended. 3309276fdf408050d205f3a7f34c1e788224a67d2098Wesley Peck if (const BuiltinType *BT = Ty->getAs<BuiltinType>()) 3310276fdf408050d205f3a7f34c1e788224a67d2098Wesley Peck switch (BT->getKind()) { 3311276fdf408050d205f3a7f34c1e788224a67d2098Wesley Peck case BuiltinType::Bool: 3312276fdf408050d205f3a7f34c1e788224a67d2098Wesley Peck case BuiltinType::Char_S: 3313276fdf408050d205f3a7f34c1e788224a67d2098Wesley Peck case BuiltinType::Char_U: 3314276fdf408050d205f3a7f34c1e788224a67d2098Wesley Peck case BuiltinType::SChar: 3315276fdf408050d205f3a7f34c1e788224a67d2098Wesley Peck case BuiltinType::UChar: 3316276fdf408050d205f3a7f34c1e788224a67d2098Wesley Peck case BuiltinType::Short: 3317276fdf408050d205f3a7f34c1e788224a67d2098Wesley Peck case BuiltinType::UShort: 3318276fdf408050d205f3a7f34c1e788224a67d2098Wesley Peck return true; 3319276fdf408050d205f3a7f34c1e788224a67d2098Wesley Peck default: 3320276fdf408050d205f3a7f34c1e788224a67d2098Wesley Peck return false; 3321276fdf408050d205f3a7f34c1e788224a67d2098Wesley Peck } 3322276fdf408050d205f3a7f34c1e788224a67d2098Wesley Peck return false; 3323276fdf408050d205f3a7f34c1e788224a67d2098Wesley Peck} 3324276fdf408050d205f3a7f34c1e788224a67d2098Wesley Peck 3325276fdf408050d205f3a7f34c1e788224a67d2098Wesley Peckllvm::Value *MBlazeABIInfo::EmitVAArg(llvm::Value *VAListAddr, QualType Ty, 3326276fdf408050d205f3a7f34c1e788224a67d2098Wesley Peck CodeGenFunction &CGF) const { 3327276fdf408050d205f3a7f34c1e788224a67d2098Wesley Peck // FIXME: Implement 3328276fdf408050d205f3a7f34c1e788224a67d2098Wesley Peck return 0; 3329276fdf408050d205f3a7f34c1e788224a67d2098Wesley Peck} 3330276fdf408050d205f3a7f34c1e788224a67d2098Wesley Peck 3331276fdf408050d205f3a7f34c1e788224a67d2098Wesley Peck 3332276fdf408050d205f3a7f34c1e788224a67d2098Wesley PeckABIArgInfo MBlazeABIInfo::classifyReturnType(QualType RetTy) const { 3333276fdf408050d205f3a7f34c1e788224a67d2098Wesley Peck if (RetTy->isVoidType()) 3334276fdf408050d205f3a7f34c1e788224a67d2098Wesley Peck return ABIArgInfo::getIgnore(); 3335276fdf408050d205f3a7f34c1e788224a67d2098Wesley Peck if (isAggregateTypeForABI(RetTy)) 3336276fdf408050d205f3a7f34c1e788224a67d2098Wesley Peck return ABIArgInfo::getIndirect(0); 3337276fdf408050d205f3a7f34c1e788224a67d2098Wesley Peck 3338276fdf408050d205f3a7f34c1e788224a67d2098Wesley Peck return (isPromotableIntegerType(RetTy) ? 3339276fdf408050d205f3a7f34c1e788224a67d2098Wesley Peck ABIArgInfo::getExtend() : ABIArgInfo::getDirect()); 3340276fdf408050d205f3a7f34c1e788224a67d2098Wesley Peck} 3341276fdf408050d205f3a7f34c1e788224a67d2098Wesley Peck 3342276fdf408050d205f3a7f34c1e788224a67d2098Wesley PeckABIArgInfo MBlazeABIInfo::classifyArgumentType(QualType Ty) const { 3343276fdf408050d205f3a7f34c1e788224a67d2098Wesley Peck if (isAggregateTypeForABI(Ty)) 3344276fdf408050d205f3a7f34c1e788224a67d2098Wesley Peck return ABIArgInfo::getIndirect(0); 3345276fdf408050d205f3a7f34c1e788224a67d2098Wesley Peck 3346276fdf408050d205f3a7f34c1e788224a67d2098Wesley Peck return (isPromotableIntegerType(Ty) ? 3347276fdf408050d205f3a7f34c1e788224a67d2098Wesley Peck ABIArgInfo::getExtend() : ABIArgInfo::getDirect()); 3348276fdf408050d205f3a7f34c1e788224a67d2098Wesley Peck} 3349276fdf408050d205f3a7f34c1e788224a67d2098Wesley Peck 3350276fdf408050d205f3a7f34c1e788224a67d2098Wesley Peckvoid MBlazeTargetCodeGenInfo::SetTargetAttributes(const Decl *D, 3351276fdf408050d205f3a7f34c1e788224a67d2098Wesley Peck llvm::GlobalValue *GV, 3352276fdf408050d205f3a7f34c1e788224a67d2098Wesley Peck CodeGen::CodeGenModule &M) 3353276fdf408050d205f3a7f34c1e788224a67d2098Wesley Peck const { 3354276fdf408050d205f3a7f34c1e788224a67d2098Wesley Peck const FunctionDecl *FD = dyn_cast<FunctionDecl>(D); 3355276fdf408050d205f3a7f34c1e788224a67d2098Wesley Peck if (!FD) return; 3356125b4cb35536e45201f8f2cb19ee620e3ad67c49NAKAMURA Takumi 3357276fdf408050d205f3a7f34c1e788224a67d2098Wesley Peck llvm::CallingConv::ID CC = llvm::CallingConv::C; 3358276fdf408050d205f3a7f34c1e788224a67d2098Wesley Peck if (FD->hasAttr<MBlazeInterruptHandlerAttr>()) 3359276fdf408050d205f3a7f34c1e788224a67d2098Wesley Peck CC = llvm::CallingConv::MBLAZE_INTR; 3360276fdf408050d205f3a7f34c1e788224a67d2098Wesley Peck else if (FD->hasAttr<MBlazeSaveVolatilesAttr>()) 3361276fdf408050d205f3a7f34c1e788224a67d2098Wesley Peck CC = llvm::CallingConv::MBLAZE_SVOL; 3362276fdf408050d205f3a7f34c1e788224a67d2098Wesley Peck 3363276fdf408050d205f3a7f34c1e788224a67d2098Wesley Peck if (CC != llvm::CallingConv::C) { 3364276fdf408050d205f3a7f34c1e788224a67d2098Wesley Peck // Handle 'interrupt_handler' attribute: 3365276fdf408050d205f3a7f34c1e788224a67d2098Wesley Peck llvm::Function *F = cast<llvm::Function>(GV); 3366276fdf408050d205f3a7f34c1e788224a67d2098Wesley Peck 3367276fdf408050d205f3a7f34c1e788224a67d2098Wesley Peck // Step 1: Set ISR calling convention. 3368276fdf408050d205f3a7f34c1e788224a67d2098Wesley Peck F->setCallingConv(CC); 3369276fdf408050d205f3a7f34c1e788224a67d2098Wesley Peck 3370276fdf408050d205f3a7f34c1e788224a67d2098Wesley Peck // Step 2: Add attributes goodness. 3371276fdf408050d205f3a7f34c1e788224a67d2098Wesley Peck F->addFnAttr(llvm::Attribute::NoInline); 3372276fdf408050d205f3a7f34c1e788224a67d2098Wesley Peck } 3373276fdf408050d205f3a7f34c1e788224a67d2098Wesley Peck 3374276fdf408050d205f3a7f34c1e788224a67d2098Wesley Peck // Step 3: Emit _interrupt_handler alias. 3375276fdf408050d205f3a7f34c1e788224a67d2098Wesley Peck if (CC == llvm::CallingConv::MBLAZE_INTR) 3376276fdf408050d205f3a7f34c1e788224a67d2098Wesley Peck new llvm::GlobalAlias(GV->getType(), llvm::Function::ExternalLinkage, 3377276fdf408050d205f3a7f34c1e788224a67d2098Wesley Peck "_interrupt_handler", GV, &M.getModule()); 3378276fdf408050d205f3a7f34c1e788224a67d2098Wesley Peck} 3379276fdf408050d205f3a7f34c1e788224a67d2098Wesley Peck 3380276fdf408050d205f3a7f34c1e788224a67d2098Wesley Peck 3381276fdf408050d205f3a7f34c1e788224a67d2098Wesley Peck//===----------------------------------------------------------------------===// 338282d0a418c8699fc6f4a9417457ffe93d43bba1c1Anton Korobeynikov// MSP430 ABI Implementation 3383dce5ad0cf70ba74e1ecdbb5e81f1a81d97821636Chris Lattner//===----------------------------------------------------------------------===// 338482d0a418c8699fc6f4a9417457ffe93d43bba1c1Anton Korobeynikov 338582d0a418c8699fc6f4a9417457ffe93d43bba1c1Anton Korobeynikovnamespace { 338682d0a418c8699fc6f4a9417457ffe93d43bba1c1Anton Korobeynikov 338782d0a418c8699fc6f4a9417457ffe93d43bba1c1Anton Korobeynikovclass MSP430TargetCodeGenInfo : public TargetCodeGenInfo { 338882d0a418c8699fc6f4a9417457ffe93d43bba1c1Anton Korobeynikovpublic: 3389ea0443212e7ec6ff82e2f174e8e948a6eb0e0876Chris Lattner MSP430TargetCodeGenInfo(CodeGenTypes &CGT) 3390ea0443212e7ec6ff82e2f174e8e948a6eb0e0876Chris Lattner : TargetCodeGenInfo(new DefaultABIInfo(CGT)) {} 339182d0a418c8699fc6f4a9417457ffe93d43bba1c1Anton Korobeynikov void SetTargetAttributes(const Decl *D, llvm::GlobalValue *GV, 339282d0a418c8699fc6f4a9417457ffe93d43bba1c1Anton Korobeynikov CodeGen::CodeGenModule &M) const; 339382d0a418c8699fc6f4a9417457ffe93d43bba1c1Anton Korobeynikov}; 339482d0a418c8699fc6f4a9417457ffe93d43bba1c1Anton Korobeynikov 3395c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov} 3396c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 339782d0a418c8699fc6f4a9417457ffe93d43bba1c1Anton Korobeynikovvoid MSP430TargetCodeGenInfo::SetTargetAttributes(const Decl *D, 339882d0a418c8699fc6f4a9417457ffe93d43bba1c1Anton Korobeynikov llvm::GlobalValue *GV, 339982d0a418c8699fc6f4a9417457ffe93d43bba1c1Anton Korobeynikov CodeGen::CodeGenModule &M) const { 340082d0a418c8699fc6f4a9417457ffe93d43bba1c1Anton Korobeynikov if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(D)) { 340182d0a418c8699fc6f4a9417457ffe93d43bba1c1Anton Korobeynikov if (const MSP430InterruptAttr *attr = FD->getAttr<MSP430InterruptAttr>()) { 340282d0a418c8699fc6f4a9417457ffe93d43bba1c1Anton Korobeynikov // Handle 'interrupt' attribute: 340382d0a418c8699fc6f4a9417457ffe93d43bba1c1Anton Korobeynikov llvm::Function *F = cast<llvm::Function>(GV); 340482d0a418c8699fc6f4a9417457ffe93d43bba1c1Anton Korobeynikov 340582d0a418c8699fc6f4a9417457ffe93d43bba1c1Anton Korobeynikov // Step 1: Set ISR calling convention. 340682d0a418c8699fc6f4a9417457ffe93d43bba1c1Anton Korobeynikov F->setCallingConv(llvm::CallingConv::MSP430_INTR); 340782d0a418c8699fc6f4a9417457ffe93d43bba1c1Anton Korobeynikov 340882d0a418c8699fc6f4a9417457ffe93d43bba1c1Anton Korobeynikov // Step 2: Add attributes goodness. 340982d0a418c8699fc6f4a9417457ffe93d43bba1c1Anton Korobeynikov F->addFnAttr(llvm::Attribute::NoInline); 341082d0a418c8699fc6f4a9417457ffe93d43bba1c1Anton Korobeynikov 341182d0a418c8699fc6f4a9417457ffe93d43bba1c1Anton Korobeynikov // Step 3: Emit ISR vector alias. 341282d0a418c8699fc6f4a9417457ffe93d43bba1c1Anton Korobeynikov unsigned Num = attr->getNumber() + 0xffe0; 341382d0a418c8699fc6f4a9417457ffe93d43bba1c1Anton Korobeynikov new llvm::GlobalAlias(GV->getType(), llvm::Function::ExternalLinkage, 34145f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner "vector_" + Twine::utohexstr(Num), 341582d0a418c8699fc6f4a9417457ffe93d43bba1c1Anton Korobeynikov GV, &M.getModule()); 341682d0a418c8699fc6f4a9417457ffe93d43bba1c1Anton Korobeynikov } 341782d0a418c8699fc6f4a9417457ffe93d43bba1c1Anton Korobeynikov } 3418c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov} 3419c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 3420dce5ad0cf70ba74e1ecdbb5e81f1a81d97821636Chris Lattner//===----------------------------------------------------------------------===// 3421aeeb7011a875d3dd439e9fa07dc3ac54d97785b9John McCall// MIPS ABI Implementation. This works for both little-endian and 3422aeeb7011a875d3dd439e9fa07dc3ac54d97785b9John McCall// big-endian variants. 3423dce5ad0cf70ba74e1ecdbb5e81f1a81d97821636Chris Lattner//===----------------------------------------------------------------------===// 3424dce5ad0cf70ba74e1ecdbb5e81f1a81d97821636Chris Lattner 3425aeeb7011a875d3dd439e9fa07dc3ac54d97785b9John McCallnamespace { 3426619e8875d29cc019c7360595f66b9f91b3439494Akira Hatanakaclass MipsABIInfo : public ABIInfo { 3427c0e3b665344a39bd733e0d9f55bf0f1937922289Akira Hatanaka bool IsO32; 3428c359f2029d19016560a422551704ccc2419be0b1Akira Hatanaka unsigned MinABIStackAlignInBytes, StackAlignInBytes; 3429c359f2029d19016560a422551704ccc2419be0b1Akira Hatanaka void CoerceToIntArgs(uint64_t TySize, 3430c359f2029d19016560a422551704ccc2419be0b1Akira Hatanaka SmallVector<llvm::Type*, 8> &ArgList) const; 343191338cf4129cfdb85af7e9ef396ab09621da10ecAkira Hatanaka llvm::Type* HandleAggregates(QualType Ty, uint64_t TySize) const; 3432c7ecc2e3691e484cffcfec7fcefef18b2bd23e5fAkira Hatanaka llvm::Type* returnAggregateInRegs(QualType RetTy, uint64_t Size) const; 3433a33fd393d5255716e904fed021f87260095ed00aAkira Hatanaka llvm::Type* getPaddingType(uint64_t Align, uint64_t Offset) const; 3434619e8875d29cc019c7360595f66b9f91b3439494Akira Hatanakapublic: 3435b551dd31f6b15aa959127ee906084fcf5bf0154eAkira Hatanaka MipsABIInfo(CodeGenTypes &CGT, bool _IsO32) : 3436c359f2029d19016560a422551704ccc2419be0b1Akira Hatanaka ABIInfo(CGT), IsO32(_IsO32), MinABIStackAlignInBytes(IsO32 ? 4 : 8), 3437c359f2029d19016560a422551704ccc2419be0b1Akira Hatanaka StackAlignInBytes(IsO32 ? 8 : 16) {} 3438619e8875d29cc019c7360595f66b9f91b3439494Akira Hatanaka 3439619e8875d29cc019c7360595f66b9f91b3439494Akira Hatanaka ABIArgInfo classifyReturnType(QualType RetTy) const; 3440f0cc2087b18c48b17c2f647c88a3e7eef19285fdAkira Hatanaka ABIArgInfo classifyArgumentType(QualType RetTy, uint64_t &Offset) const; 3441619e8875d29cc019c7360595f66b9f91b3439494Akira Hatanaka virtual void computeInfo(CGFunctionInfo &FI) const; 3442619e8875d29cc019c7360595f66b9f91b3439494Akira Hatanaka virtual llvm::Value *EmitVAArg(llvm::Value *VAListAddr, QualType Ty, 3443619e8875d29cc019c7360595f66b9f91b3439494Akira Hatanaka CodeGenFunction &CGF) const; 3444619e8875d29cc019c7360595f66b9f91b3439494Akira Hatanaka}; 3445619e8875d29cc019c7360595f66b9f91b3439494Akira Hatanaka 3446aeeb7011a875d3dd439e9fa07dc3ac54d97785b9John McCallclass MIPSTargetCodeGenInfo : public TargetCodeGenInfo { 3447e624fa02b2c2c614b3a27a25516885fc64e07001Akira Hatanaka unsigned SizeOfUnwindException; 3448aeeb7011a875d3dd439e9fa07dc3ac54d97785b9John McCallpublic: 3449c0e3b665344a39bd733e0d9f55bf0f1937922289Akira Hatanaka MIPSTargetCodeGenInfo(CodeGenTypes &CGT, bool IsO32) 3450c0e3b665344a39bd733e0d9f55bf0f1937922289Akira Hatanaka : TargetCodeGenInfo(new MipsABIInfo(CGT, IsO32)), 3451c0e3b665344a39bd733e0d9f55bf0f1937922289Akira Hatanaka SizeOfUnwindException(IsO32 ? 24 : 32) {} 3452aeeb7011a875d3dd439e9fa07dc3ac54d97785b9John McCall 3453aeeb7011a875d3dd439e9fa07dc3ac54d97785b9John McCall int getDwarfEHStackPointer(CodeGen::CodeGenModule &CGM) const { 3454aeeb7011a875d3dd439e9fa07dc3ac54d97785b9John McCall return 29; 3455aeeb7011a875d3dd439e9fa07dc3ac54d97785b9John McCall } 3456aeeb7011a875d3dd439e9fa07dc3ac54d97785b9John McCall 3457aeeb7011a875d3dd439e9fa07dc3ac54d97785b9John McCall bool initDwarfEHRegSizeTable(CodeGen::CodeGenFunction &CGF, 34588bea82f6699e4384ef823cdc8800ad5db271177cMichael J. Spencer llvm::Value *Address) const; 345949e34be6ae0c25b9843610cdd2fd6fea9cd8b870John McCall 346049e34be6ae0c25b9843610cdd2fd6fea9cd8b870John McCall unsigned getSizeOfUnwindException() const { 3461e624fa02b2c2c614b3a27a25516885fc64e07001Akira Hatanaka return SizeOfUnwindException; 346249e34be6ae0c25b9843610cdd2fd6fea9cd8b870John McCall } 3463aeeb7011a875d3dd439e9fa07dc3ac54d97785b9John McCall}; 3464aeeb7011a875d3dd439e9fa07dc3ac54d97785b9John McCall} 3465aeeb7011a875d3dd439e9fa07dc3ac54d97785b9John McCall 3466c359f2029d19016560a422551704ccc2419be0b1Akira Hatanakavoid MipsABIInfo::CoerceToIntArgs(uint64_t TySize, 3467c359f2029d19016560a422551704ccc2419be0b1Akira Hatanaka SmallVector<llvm::Type*, 8> &ArgList) const { 3468c359f2029d19016560a422551704ccc2419be0b1Akira Hatanaka llvm::IntegerType *IntTy = 3469c359f2029d19016560a422551704ccc2419be0b1Akira Hatanaka llvm::IntegerType::get(getVMContext(), MinABIStackAlignInBytes * 8); 347091338cf4129cfdb85af7e9ef396ab09621da10ecAkira Hatanaka 347191338cf4129cfdb85af7e9ef396ab09621da10ecAkira Hatanaka // Add (TySize / MinABIStackAlignInBytes) args of IntTy. 347291338cf4129cfdb85af7e9ef396ab09621da10ecAkira Hatanaka for (unsigned N = TySize / (MinABIStackAlignInBytes * 8); N; --N) 347391338cf4129cfdb85af7e9ef396ab09621da10ecAkira Hatanaka ArgList.push_back(IntTy); 347491338cf4129cfdb85af7e9ef396ab09621da10ecAkira Hatanaka 347591338cf4129cfdb85af7e9ef396ab09621da10ecAkira Hatanaka // If necessary, add one more integer type to ArgList. 347691338cf4129cfdb85af7e9ef396ab09621da10ecAkira Hatanaka unsigned R = TySize % (MinABIStackAlignInBytes * 8); 347791338cf4129cfdb85af7e9ef396ab09621da10ecAkira Hatanaka 347891338cf4129cfdb85af7e9ef396ab09621da10ecAkira Hatanaka if (R) 347991338cf4129cfdb85af7e9ef396ab09621da10ecAkira Hatanaka ArgList.push_back(llvm::IntegerType::get(getVMContext(), R)); 348091338cf4129cfdb85af7e9ef396ab09621da10ecAkira Hatanaka} 348191338cf4129cfdb85af7e9ef396ab09621da10ecAkira Hatanaka 3482d5a257f39b6f78fb66bb0227486b65592476c572Akira Hatanaka// In N32/64, an aligned double precision floating point field is passed in 3483d5a257f39b6f78fb66bb0227486b65592476c572Akira Hatanaka// a register. 348491338cf4129cfdb85af7e9ef396ab09621da10ecAkira Hatanakallvm::Type* MipsABIInfo::HandleAggregates(QualType Ty, uint64_t TySize) const { 3485c359f2029d19016560a422551704ccc2419be0b1Akira Hatanaka SmallVector<llvm::Type*, 8> ArgList, IntArgList; 3486c359f2029d19016560a422551704ccc2419be0b1Akira Hatanaka 3487c359f2029d19016560a422551704ccc2419be0b1Akira Hatanaka if (IsO32) { 3488c359f2029d19016560a422551704ccc2419be0b1Akira Hatanaka CoerceToIntArgs(TySize, ArgList); 3489c359f2029d19016560a422551704ccc2419be0b1Akira Hatanaka return llvm::StructType::get(getVMContext(), ArgList); 3490c359f2029d19016560a422551704ccc2419be0b1Akira Hatanaka } 3491d5a257f39b6f78fb66bb0227486b65592476c572Akira Hatanaka 34922afd23da0e33a8cd44c1c46b1651c677fdd27151Akira Hatanaka if (Ty->isComplexType()) 34932afd23da0e33a8cd44c1c46b1651c677fdd27151Akira Hatanaka return CGT.ConvertType(Ty); 34946d1080fd1851f18bd40bb46fa074aa1252b13e8eAkira Hatanaka 3495a34e92116581531f7325527d952a9ffcc819d905Akira Hatanaka const RecordType *RT = Ty->getAs<RecordType>(); 3496d5a257f39b6f78fb66bb0227486b65592476c572Akira Hatanaka 3497c359f2029d19016560a422551704ccc2419be0b1Akira Hatanaka // Unions/vectors are passed in integer registers. 3498c359f2029d19016560a422551704ccc2419be0b1Akira Hatanaka if (!RT || !RT->isStructureOrClassType()) { 3499c359f2029d19016560a422551704ccc2419be0b1Akira Hatanaka CoerceToIntArgs(TySize, ArgList); 3500c359f2029d19016560a422551704ccc2419be0b1Akira Hatanaka return llvm::StructType::get(getVMContext(), ArgList); 3501c359f2029d19016560a422551704ccc2419be0b1Akira Hatanaka } 3502d5a257f39b6f78fb66bb0227486b65592476c572Akira Hatanaka 3503d5a257f39b6f78fb66bb0227486b65592476c572Akira Hatanaka const RecordDecl *RD = RT->getDecl(); 3504d5a257f39b6f78fb66bb0227486b65592476c572Akira Hatanaka const ASTRecordLayout &Layout = getContext().getASTRecordLayout(RD); 350591338cf4129cfdb85af7e9ef396ab09621da10ecAkira Hatanaka assert(!(TySize % 8) && "Size of structure must be multiple of 8."); 3506d5a257f39b6f78fb66bb0227486b65592476c572Akira Hatanaka 3507d5a257f39b6f78fb66bb0227486b65592476c572Akira Hatanaka uint64_t LastOffset = 0; 3508d5a257f39b6f78fb66bb0227486b65592476c572Akira Hatanaka unsigned idx = 0; 3509d5a257f39b6f78fb66bb0227486b65592476c572Akira Hatanaka llvm::IntegerType *I64 = llvm::IntegerType::get(getVMContext(), 64); 3510d5a257f39b6f78fb66bb0227486b65592476c572Akira Hatanaka 3511a34e92116581531f7325527d952a9ffcc819d905Akira Hatanaka // Iterate over fields in the struct/class and check if there are any aligned 3512a34e92116581531f7325527d952a9ffcc819d905Akira Hatanaka // double fields. 3513d5a257f39b6f78fb66bb0227486b65592476c572Akira Hatanaka for (RecordDecl::field_iterator i = RD->field_begin(), e = RD->field_end(); 3514d5a257f39b6f78fb66bb0227486b65592476c572Akira Hatanaka i != e; ++i, ++idx) { 3515262bc18e32500558af7cb0afa205b34bd37bafedDavid Blaikie const QualType Ty = i->getType(); 3516d5a257f39b6f78fb66bb0227486b65592476c572Akira Hatanaka const BuiltinType *BT = Ty->getAs<BuiltinType>(); 3517d5a257f39b6f78fb66bb0227486b65592476c572Akira Hatanaka 3518d5a257f39b6f78fb66bb0227486b65592476c572Akira Hatanaka if (!BT || BT->getKind() != BuiltinType::Double) 3519d5a257f39b6f78fb66bb0227486b65592476c572Akira Hatanaka continue; 3520d5a257f39b6f78fb66bb0227486b65592476c572Akira Hatanaka 3521d5a257f39b6f78fb66bb0227486b65592476c572Akira Hatanaka uint64_t Offset = Layout.getFieldOffset(idx); 3522d5a257f39b6f78fb66bb0227486b65592476c572Akira Hatanaka if (Offset % 64) // Ignore doubles that are not aligned. 3523d5a257f39b6f78fb66bb0227486b65592476c572Akira Hatanaka continue; 3524d5a257f39b6f78fb66bb0227486b65592476c572Akira Hatanaka 3525d5a257f39b6f78fb66bb0227486b65592476c572Akira Hatanaka // Add ((Offset - LastOffset) / 64) args of type i64. 3526d5a257f39b6f78fb66bb0227486b65592476c572Akira Hatanaka for (unsigned j = (Offset - LastOffset) / 64; j > 0; --j) 3527d5a257f39b6f78fb66bb0227486b65592476c572Akira Hatanaka ArgList.push_back(I64); 3528d5a257f39b6f78fb66bb0227486b65592476c572Akira Hatanaka 3529d5a257f39b6f78fb66bb0227486b65592476c572Akira Hatanaka // Add double type. 3530d5a257f39b6f78fb66bb0227486b65592476c572Akira Hatanaka ArgList.push_back(llvm::Type::getDoubleTy(getVMContext())); 3531d5a257f39b6f78fb66bb0227486b65592476c572Akira Hatanaka LastOffset = Offset + 64; 3532d5a257f39b6f78fb66bb0227486b65592476c572Akira Hatanaka } 3533d5a257f39b6f78fb66bb0227486b65592476c572Akira Hatanaka 3534c359f2029d19016560a422551704ccc2419be0b1Akira Hatanaka CoerceToIntArgs(TySize - LastOffset, IntArgList); 3535c359f2029d19016560a422551704ccc2419be0b1Akira Hatanaka ArgList.append(IntArgList.begin(), IntArgList.end()); 3536d5a257f39b6f78fb66bb0227486b65592476c572Akira Hatanaka 3537d5a257f39b6f78fb66bb0227486b65592476c572Akira Hatanaka return llvm::StructType::get(getVMContext(), ArgList); 3538d5a257f39b6f78fb66bb0227486b65592476c572Akira Hatanaka} 3539d5a257f39b6f78fb66bb0227486b65592476c572Akira Hatanaka 3540a33fd393d5255716e904fed021f87260095ed00aAkira Hatanakallvm::Type *MipsABIInfo::getPaddingType(uint64_t Align, uint64_t Offset) const { 354191338cf4129cfdb85af7e9ef396ab09621da10ecAkira Hatanaka assert((Offset % MinABIStackAlignInBytes) == 0); 354291338cf4129cfdb85af7e9ef396ab09621da10ecAkira Hatanaka 354391338cf4129cfdb85af7e9ef396ab09621da10ecAkira Hatanaka if ((Align - 1) & Offset) 354491338cf4129cfdb85af7e9ef396ab09621da10ecAkira Hatanaka return llvm::IntegerType::get(getVMContext(), MinABIStackAlignInBytes * 8); 3545a33fd393d5255716e904fed021f87260095ed00aAkira Hatanaka 354691338cf4129cfdb85af7e9ef396ab09621da10ecAkira Hatanaka return 0; 3547a33fd393d5255716e904fed021f87260095ed00aAkira Hatanaka} 35489659d59ec368933050684af573b6d32ab5714332Akira Hatanaka 3549f0cc2087b18c48b17c2f647c88a3e7eef19285fdAkira HatanakaABIArgInfo 3550f0cc2087b18c48b17c2f647c88a3e7eef19285fdAkira HatanakaMipsABIInfo::classifyArgumentType(QualType Ty, uint64_t &Offset) const { 3551a33fd393d5255716e904fed021f87260095ed00aAkira Hatanaka uint64_t OrigOffset = Offset; 355291338cf4129cfdb85af7e9ef396ab09621da10ecAkira Hatanaka uint64_t TySize = getContext().getTypeSize(Ty); 3553a33fd393d5255716e904fed021f87260095ed00aAkira Hatanaka uint64_t Align = getContext().getTypeAlign(Ty) / 8; 355491338cf4129cfdb85af7e9ef396ab09621da10ecAkira Hatanaka 3555c359f2029d19016560a422551704ccc2419be0b1Akira Hatanaka Align = std::min(std::max(Align, (uint64_t)MinABIStackAlignInBytes), 3556c359f2029d19016560a422551704ccc2419be0b1Akira Hatanaka (uint64_t)StackAlignInBytes); 355791338cf4129cfdb85af7e9ef396ab09621da10ecAkira Hatanaka Offset = llvm::RoundUpToAlignment(Offset, Align); 355891338cf4129cfdb85af7e9ef396ab09621da10ecAkira Hatanaka Offset += llvm::RoundUpToAlignment(TySize, Align * 8) / 8; 3559a33fd393d5255716e904fed021f87260095ed00aAkira Hatanaka 3560c359f2029d19016560a422551704ccc2419be0b1Akira Hatanaka if (isAggregateTypeForABI(Ty) || Ty->isVectorType()) { 3561619e8875d29cc019c7360595f66b9f91b3439494Akira Hatanaka // Ignore empty aggregates. 3562f0cc2087b18c48b17c2f647c88a3e7eef19285fdAkira Hatanaka if (TySize == 0) 3563619e8875d29cc019c7360595f66b9f91b3439494Akira Hatanaka return ABIArgInfo::getIgnore(); 3564619e8875d29cc019c7360595f66b9f91b3439494Akira Hatanaka 3565511949bf7ea721556ea3eb2777fc1e36e6c3e243Akira Hatanaka // Records with non trivial destructors/constructors should not be passed 3566511949bf7ea721556ea3eb2777fc1e36e6c3e243Akira Hatanaka // by value. 3567f0cc2087b18c48b17c2f647c88a3e7eef19285fdAkira Hatanaka if (isRecordWithNonTrivialDestructorOrCopyConstructor(Ty)) { 356891338cf4129cfdb85af7e9ef396ab09621da10ecAkira Hatanaka Offset = OrigOffset + MinABIStackAlignInBytes; 3569511949bf7ea721556ea3eb2777fc1e36e6c3e243Akira Hatanaka return ABIArgInfo::getIndirect(0, /*ByVal=*/false); 3570f0cc2087b18c48b17c2f647c88a3e7eef19285fdAkira Hatanaka } 3571511949bf7ea721556ea3eb2777fc1e36e6c3e243Akira Hatanaka 357291338cf4129cfdb85af7e9ef396ab09621da10ecAkira Hatanaka // If we have reached here, aggregates are passed directly by coercing to 357391338cf4129cfdb85af7e9ef396ab09621da10ecAkira Hatanaka // another structure type. Padding is inserted if the offset of the 357491338cf4129cfdb85af7e9ef396ab09621da10ecAkira Hatanaka // aggregate is unaligned. 357591338cf4129cfdb85af7e9ef396ab09621da10ecAkira Hatanaka return ABIArgInfo::getDirect(HandleAggregates(Ty, TySize), 0, 357691338cf4129cfdb85af7e9ef396ab09621da10ecAkira Hatanaka getPaddingType(Align, OrigOffset)); 3577619e8875d29cc019c7360595f66b9f91b3439494Akira Hatanaka } 3578619e8875d29cc019c7360595f66b9f91b3439494Akira Hatanaka 3579619e8875d29cc019c7360595f66b9f91b3439494Akira Hatanaka // Treat an enum type as its underlying type. 3580619e8875d29cc019c7360595f66b9f91b3439494Akira Hatanaka if (const EnumType *EnumTy = Ty->getAs<EnumType>()) 3581619e8875d29cc019c7360595f66b9f91b3439494Akira Hatanaka Ty = EnumTy->getDecl()->getIntegerType(); 3582619e8875d29cc019c7360595f66b9f91b3439494Akira Hatanaka 3583a33fd393d5255716e904fed021f87260095ed00aAkira Hatanaka if (Ty->isPromotableIntegerType()) 3584a33fd393d5255716e904fed021f87260095ed00aAkira Hatanaka return ABIArgInfo::getExtend(); 3585a33fd393d5255716e904fed021f87260095ed00aAkira Hatanaka 3586a33fd393d5255716e904fed021f87260095ed00aAkira Hatanaka return ABIArgInfo::getDirect(0, 0, getPaddingType(Align, OrigOffset)); 3587619e8875d29cc019c7360595f66b9f91b3439494Akira Hatanaka} 3588619e8875d29cc019c7360595f66b9f91b3439494Akira Hatanaka 3589c7ecc2e3691e484cffcfec7fcefef18b2bd23e5fAkira Hatanakallvm::Type* 3590c7ecc2e3691e484cffcfec7fcefef18b2bd23e5fAkira HatanakaMipsABIInfo::returnAggregateInRegs(QualType RetTy, uint64_t Size) const { 3591da54ff306270e179f64d046369419724356d30d7Akira Hatanaka const RecordType *RT = RetTy->getAs<RecordType>(); 3592c359f2029d19016560a422551704ccc2419be0b1Akira Hatanaka SmallVector<llvm::Type*, 8> RTList; 3593c7ecc2e3691e484cffcfec7fcefef18b2bd23e5fAkira Hatanaka 3594da54ff306270e179f64d046369419724356d30d7Akira Hatanaka if (RT && RT->isStructureOrClassType()) { 3595c7ecc2e3691e484cffcfec7fcefef18b2bd23e5fAkira Hatanaka const RecordDecl *RD = RT->getDecl(); 3596da54ff306270e179f64d046369419724356d30d7Akira Hatanaka const ASTRecordLayout &Layout = getContext().getASTRecordLayout(RD); 3597da54ff306270e179f64d046369419724356d30d7Akira Hatanaka unsigned FieldCnt = Layout.getFieldCount(); 3598da54ff306270e179f64d046369419724356d30d7Akira Hatanaka 3599da54ff306270e179f64d046369419724356d30d7Akira Hatanaka // N32/64 returns struct/classes in floating point registers if the 3600da54ff306270e179f64d046369419724356d30d7Akira Hatanaka // following conditions are met: 3601da54ff306270e179f64d046369419724356d30d7Akira Hatanaka // 1. The size of the struct/class is no larger than 128-bit. 3602da54ff306270e179f64d046369419724356d30d7Akira Hatanaka // 2. The struct/class has one or two fields all of which are floating 3603da54ff306270e179f64d046369419724356d30d7Akira Hatanaka // point types. 3604da54ff306270e179f64d046369419724356d30d7Akira Hatanaka // 3. The offset of the first field is zero (this follows what gcc does). 3605da54ff306270e179f64d046369419724356d30d7Akira Hatanaka // 3606da54ff306270e179f64d046369419724356d30d7Akira Hatanaka // Any other composite results are returned in integer registers. 3607da54ff306270e179f64d046369419724356d30d7Akira Hatanaka // 3608da54ff306270e179f64d046369419724356d30d7Akira Hatanaka if (FieldCnt && (FieldCnt <= 2) && !Layout.getFieldOffset(0)) { 3609da54ff306270e179f64d046369419724356d30d7Akira Hatanaka RecordDecl::field_iterator b = RD->field_begin(), e = RD->field_end(); 3610da54ff306270e179f64d046369419724356d30d7Akira Hatanaka for (; b != e; ++b) { 3611262bc18e32500558af7cb0afa205b34bd37bafedDavid Blaikie const BuiltinType *BT = b->getType()->getAs<BuiltinType>(); 3612c7ecc2e3691e484cffcfec7fcefef18b2bd23e5fAkira Hatanaka 3613da54ff306270e179f64d046369419724356d30d7Akira Hatanaka if (!BT || !BT->isFloatingPoint()) 3614da54ff306270e179f64d046369419724356d30d7Akira Hatanaka break; 3615c7ecc2e3691e484cffcfec7fcefef18b2bd23e5fAkira Hatanaka 3616262bc18e32500558af7cb0afa205b34bd37bafedDavid Blaikie RTList.push_back(CGT.ConvertType(b->getType())); 3617da54ff306270e179f64d046369419724356d30d7Akira Hatanaka } 3618c7ecc2e3691e484cffcfec7fcefef18b2bd23e5fAkira Hatanaka 3619da54ff306270e179f64d046369419724356d30d7Akira Hatanaka if (b == e) 3620da54ff306270e179f64d046369419724356d30d7Akira Hatanaka return llvm::StructType::get(getVMContext(), RTList, 3621da54ff306270e179f64d046369419724356d30d7Akira Hatanaka RD->hasAttr<PackedAttr>()); 3622c7ecc2e3691e484cffcfec7fcefef18b2bd23e5fAkira Hatanaka 3623da54ff306270e179f64d046369419724356d30d7Akira Hatanaka RTList.clear(); 3624da54ff306270e179f64d046369419724356d30d7Akira Hatanaka } 3625c7ecc2e3691e484cffcfec7fcefef18b2bd23e5fAkira Hatanaka } 3626c7ecc2e3691e484cffcfec7fcefef18b2bd23e5fAkira Hatanaka 3627c359f2029d19016560a422551704ccc2419be0b1Akira Hatanaka CoerceToIntArgs(Size, RTList); 3628c7ecc2e3691e484cffcfec7fcefef18b2bd23e5fAkira Hatanaka return llvm::StructType::get(getVMContext(), RTList); 3629c7ecc2e3691e484cffcfec7fcefef18b2bd23e5fAkira Hatanaka} 3630c7ecc2e3691e484cffcfec7fcefef18b2bd23e5fAkira Hatanaka 3631619e8875d29cc019c7360595f66b9f91b3439494Akira HatanakaABIArgInfo MipsABIInfo::classifyReturnType(QualType RetTy) const { 3632a8536c086fbac59bd7f9a6493bc99b4a92d585e4Akira Hatanaka uint64_t Size = getContext().getTypeSize(RetTy); 3633a8536c086fbac59bd7f9a6493bc99b4a92d585e4Akira Hatanaka 3634a8536c086fbac59bd7f9a6493bc99b4a92d585e4Akira Hatanaka if (RetTy->isVoidType() || Size == 0) 3635619e8875d29cc019c7360595f66b9f91b3439494Akira Hatanaka return ABIArgInfo::getIgnore(); 3636619e8875d29cc019c7360595f66b9f91b3439494Akira Hatanaka 36378aeb1471ef62a4befba00721925a3717914f21d8Akira Hatanaka if (isAggregateTypeForABI(RetTy) || RetTy->isVectorType()) { 3638c7ecc2e3691e484cffcfec7fcefef18b2bd23e5fAkira Hatanaka if (Size <= 128) { 3639c7ecc2e3691e484cffcfec7fcefef18b2bd23e5fAkira Hatanaka if (RetTy->isAnyComplexType()) 3640c7ecc2e3691e484cffcfec7fcefef18b2bd23e5fAkira Hatanaka return ABIArgInfo::getDirect(); 3641c7ecc2e3691e484cffcfec7fcefef18b2bd23e5fAkira Hatanaka 3642c359f2029d19016560a422551704ccc2419be0b1Akira Hatanaka // O32 returns integer vectors in registers. 3643c359f2029d19016560a422551704ccc2419be0b1Akira Hatanaka if (IsO32 && RetTy->isVectorType() && !RetTy->hasFloatingRepresentation()) 3644c359f2029d19016560a422551704ccc2419be0b1Akira Hatanaka return ABIArgInfo::getDirect(returnAggregateInRegs(RetTy, Size)); 3645c359f2029d19016560a422551704ccc2419be0b1Akira Hatanaka 3646526cdfb2bf51c8c6612504f1d06c02c736d3d126Akira Hatanaka if (!IsO32 && !isRecordWithNonTrivialDestructorOrCopyConstructor(RetTy)) 3647c7ecc2e3691e484cffcfec7fcefef18b2bd23e5fAkira Hatanaka return ABIArgInfo::getDirect(returnAggregateInRegs(RetTy, Size)); 3648c7ecc2e3691e484cffcfec7fcefef18b2bd23e5fAkira Hatanaka } 3649619e8875d29cc019c7360595f66b9f91b3439494Akira Hatanaka 3650619e8875d29cc019c7360595f66b9f91b3439494Akira Hatanaka return ABIArgInfo::getIndirect(0); 3651619e8875d29cc019c7360595f66b9f91b3439494Akira Hatanaka } 3652619e8875d29cc019c7360595f66b9f91b3439494Akira Hatanaka 3653619e8875d29cc019c7360595f66b9f91b3439494Akira Hatanaka // Treat an enum type as its underlying type. 3654619e8875d29cc019c7360595f66b9f91b3439494Akira Hatanaka if (const EnumType *EnumTy = RetTy->getAs<EnumType>()) 3655619e8875d29cc019c7360595f66b9f91b3439494Akira Hatanaka RetTy = EnumTy->getDecl()->getIntegerType(); 3656619e8875d29cc019c7360595f66b9f91b3439494Akira Hatanaka 3657619e8875d29cc019c7360595f66b9f91b3439494Akira Hatanaka return (RetTy->isPromotableIntegerType() ? 3658619e8875d29cc019c7360595f66b9f91b3439494Akira Hatanaka ABIArgInfo::getExtend() : ABIArgInfo::getDirect()); 3659619e8875d29cc019c7360595f66b9f91b3439494Akira Hatanaka} 3660619e8875d29cc019c7360595f66b9f91b3439494Akira Hatanaka 3661619e8875d29cc019c7360595f66b9f91b3439494Akira Hatanakavoid MipsABIInfo::computeInfo(CGFunctionInfo &FI) const { 3662cc66254946ec86a2ec94ff9c8db96b05a364a94fAkira Hatanaka ABIArgInfo &RetInfo = FI.getReturnInfo(); 3663cc66254946ec86a2ec94ff9c8db96b05a364a94fAkira Hatanaka RetInfo = classifyReturnType(FI.getReturnType()); 3664cc66254946ec86a2ec94ff9c8db96b05a364a94fAkira Hatanaka 3665cc66254946ec86a2ec94ff9c8db96b05a364a94fAkira Hatanaka // Check if a pointer to an aggregate is passed as a hidden argument. 366691338cf4129cfdb85af7e9ef396ab09621da10ecAkira Hatanaka uint64_t Offset = RetInfo.isIndirect() ? MinABIStackAlignInBytes : 0; 3667cc66254946ec86a2ec94ff9c8db96b05a364a94fAkira Hatanaka 3668619e8875d29cc019c7360595f66b9f91b3439494Akira Hatanaka for (CGFunctionInfo::arg_iterator it = FI.arg_begin(), ie = FI.arg_end(); 3669619e8875d29cc019c7360595f66b9f91b3439494Akira Hatanaka it != ie; ++it) 3670f0cc2087b18c48b17c2f647c88a3e7eef19285fdAkira Hatanaka it->info = classifyArgumentType(it->type, Offset); 3671619e8875d29cc019c7360595f66b9f91b3439494Akira Hatanaka} 3672619e8875d29cc019c7360595f66b9f91b3439494Akira Hatanaka 3673619e8875d29cc019c7360595f66b9f91b3439494Akira Hatanakallvm::Value* MipsABIInfo::EmitVAArg(llvm::Value *VAListAddr, QualType Ty, 3674619e8875d29cc019c7360595f66b9f91b3439494Akira Hatanaka CodeGenFunction &CGF) const { 36758b418685e9e4f02f4eb2a76e1ec063e07552b68dChris Lattner llvm::Type *BP = CGF.Int8PtrTy; 36768b418685e9e4f02f4eb2a76e1ec063e07552b68dChris Lattner llvm::Type *BPP = CGF.Int8PtrPtrTy; 3677c35e69d758e43563ec3785cdd4472d9f2386cf9aAkira Hatanaka 3678c35e69d758e43563ec3785cdd4472d9f2386cf9aAkira Hatanaka CGBuilderTy &Builder = CGF.Builder; 3679c35e69d758e43563ec3785cdd4472d9f2386cf9aAkira Hatanaka llvm::Value *VAListAddrAsBPP = Builder.CreateBitCast(VAListAddr, BPP, "ap"); 3680c35e69d758e43563ec3785cdd4472d9f2386cf9aAkira Hatanaka llvm::Value *Addr = Builder.CreateLoad(VAListAddrAsBPP, "ap.cur"); 36818f675e4b18fb9b8972847e9f681044184da5586cAkira Hatanaka int64_t TypeAlign = getContext().getTypeAlign(Ty) / 8; 3682c35e69d758e43563ec3785cdd4472d9f2386cf9aAkira Hatanaka llvm::Type *PTy = llvm::PointerType::getUnqual(CGF.ConvertType(Ty)); 3683c35e69d758e43563ec3785cdd4472d9f2386cf9aAkira Hatanaka llvm::Value *AddrTyped; 36848f675e4b18fb9b8972847e9f681044184da5586cAkira Hatanaka unsigned PtrWidth = getContext().getTargetInfo().getPointerWidth(0); 36858f675e4b18fb9b8972847e9f681044184da5586cAkira Hatanaka llvm::IntegerType *IntTy = (PtrWidth == 32) ? CGF.Int32Ty : CGF.Int64Ty; 3686c35e69d758e43563ec3785cdd4472d9f2386cf9aAkira Hatanaka 3687c35e69d758e43563ec3785cdd4472d9f2386cf9aAkira Hatanaka if (TypeAlign > MinABIStackAlignInBytes) { 36888f675e4b18fb9b8972847e9f681044184da5586cAkira Hatanaka llvm::Value *AddrAsInt = CGF.Builder.CreatePtrToInt(Addr, IntTy); 36898f675e4b18fb9b8972847e9f681044184da5586cAkira Hatanaka llvm::Value *Inc = llvm::ConstantInt::get(IntTy, TypeAlign - 1); 36908f675e4b18fb9b8972847e9f681044184da5586cAkira Hatanaka llvm::Value *Mask = llvm::ConstantInt::get(IntTy, -TypeAlign); 36918f675e4b18fb9b8972847e9f681044184da5586cAkira Hatanaka llvm::Value *Add = CGF.Builder.CreateAdd(AddrAsInt, Inc); 3692c35e69d758e43563ec3785cdd4472d9f2386cf9aAkira Hatanaka llvm::Value *And = CGF.Builder.CreateAnd(Add, Mask); 3693c35e69d758e43563ec3785cdd4472d9f2386cf9aAkira Hatanaka AddrTyped = CGF.Builder.CreateIntToPtr(And, PTy); 3694c35e69d758e43563ec3785cdd4472d9f2386cf9aAkira Hatanaka } 3695c35e69d758e43563ec3785cdd4472d9f2386cf9aAkira Hatanaka else 3696c35e69d758e43563ec3785cdd4472d9f2386cf9aAkira Hatanaka AddrTyped = Builder.CreateBitCast(Addr, PTy); 3697c35e69d758e43563ec3785cdd4472d9f2386cf9aAkira Hatanaka 3698c35e69d758e43563ec3785cdd4472d9f2386cf9aAkira Hatanaka llvm::Value *AlignedAddr = Builder.CreateBitCast(AddrTyped, BP); 36998f675e4b18fb9b8972847e9f681044184da5586cAkira Hatanaka TypeAlign = std::max((unsigned)TypeAlign, MinABIStackAlignInBytes); 3700c35e69d758e43563ec3785cdd4472d9f2386cf9aAkira Hatanaka uint64_t Offset = 3701c35e69d758e43563ec3785cdd4472d9f2386cf9aAkira Hatanaka llvm::RoundUpToAlignment(CGF.getContext().getTypeSize(Ty) / 8, TypeAlign); 3702c35e69d758e43563ec3785cdd4472d9f2386cf9aAkira Hatanaka llvm::Value *NextAddr = 37038f675e4b18fb9b8972847e9f681044184da5586cAkira Hatanaka Builder.CreateGEP(AlignedAddr, llvm::ConstantInt::get(IntTy, Offset), 3704c35e69d758e43563ec3785cdd4472d9f2386cf9aAkira Hatanaka "ap.next"); 3705c35e69d758e43563ec3785cdd4472d9f2386cf9aAkira Hatanaka Builder.CreateStore(NextAddr, VAListAddrAsBPP); 3706c35e69d758e43563ec3785cdd4472d9f2386cf9aAkira Hatanaka 3707c35e69d758e43563ec3785cdd4472d9f2386cf9aAkira Hatanaka return AddrTyped; 3708619e8875d29cc019c7360595f66b9f91b3439494Akira Hatanaka} 3709619e8875d29cc019c7360595f66b9f91b3439494Akira Hatanaka 3710aeeb7011a875d3dd439e9fa07dc3ac54d97785b9John McCallbool 3711aeeb7011a875d3dd439e9fa07dc3ac54d97785b9John McCallMIPSTargetCodeGenInfo::initDwarfEHRegSizeTable(CodeGen::CodeGenFunction &CGF, 3712aeeb7011a875d3dd439e9fa07dc3ac54d97785b9John McCall llvm::Value *Address) const { 3713aeeb7011a875d3dd439e9fa07dc3ac54d97785b9John McCall // This information comes from gcc's implementation, which seems to 3714aeeb7011a875d3dd439e9fa07dc3ac54d97785b9John McCall // as canonical as it gets. 3715aeeb7011a875d3dd439e9fa07dc3ac54d97785b9John McCall 3716aeeb7011a875d3dd439e9fa07dc3ac54d97785b9John McCall // Everything on MIPS is 4 bytes. Double-precision FP registers 3717aeeb7011a875d3dd439e9fa07dc3ac54d97785b9John McCall // are aliased to pairs of single-precision FP registers. 37188b418685e9e4f02f4eb2a76e1ec063e07552b68dChris Lattner llvm::Value *Four8 = llvm::ConstantInt::get(CGF.Int8Ty, 4); 3719aeeb7011a875d3dd439e9fa07dc3ac54d97785b9John McCall 3720aeeb7011a875d3dd439e9fa07dc3ac54d97785b9John McCall // 0-31 are the general purpose registers, $0 - $31. 3721aeeb7011a875d3dd439e9fa07dc3ac54d97785b9John McCall // 32-63 are the floating-point registers, $f0 - $f31. 3722aeeb7011a875d3dd439e9fa07dc3ac54d97785b9John McCall // 64 and 65 are the multiply/divide registers, $hi and $lo. 3723aeeb7011a875d3dd439e9fa07dc3ac54d97785b9John McCall // 66 is the (notional, I think) register for signal-handler return. 37248b418685e9e4f02f4eb2a76e1ec063e07552b68dChris Lattner AssignToArrayRange(CGF.Builder, Address, Four8, 0, 65); 3725aeeb7011a875d3dd439e9fa07dc3ac54d97785b9John McCall 3726aeeb7011a875d3dd439e9fa07dc3ac54d97785b9John McCall // 67-74 are the floating-point status registers, $fcc0 - $fcc7. 3727aeeb7011a875d3dd439e9fa07dc3ac54d97785b9John McCall // They are one bit wide and ignored here. 3728aeeb7011a875d3dd439e9fa07dc3ac54d97785b9John McCall 3729aeeb7011a875d3dd439e9fa07dc3ac54d97785b9John McCall // 80-111 are the coprocessor 0 registers, $c0r0 - $c0r31. 3730aeeb7011a875d3dd439e9fa07dc3ac54d97785b9John McCall // (coprocessor 1 is the FP unit) 3731aeeb7011a875d3dd439e9fa07dc3ac54d97785b9John McCall // 112-143 are the coprocessor 2 registers, $c2r0 - $c2r31. 3732aeeb7011a875d3dd439e9fa07dc3ac54d97785b9John McCall // 144-175 are the coprocessor 3 registers, $c3r0 - $c3r31. 3733aeeb7011a875d3dd439e9fa07dc3ac54d97785b9John McCall // 176-181 are the DSP accumulator registers. 37348b418685e9e4f02f4eb2a76e1ec063e07552b68dChris Lattner AssignToArrayRange(CGF.Builder, Address, Four8, 80, 181); 3735aeeb7011a875d3dd439e9fa07dc3ac54d97785b9John McCall return false; 3736aeeb7011a875d3dd439e9fa07dc3ac54d97785b9John McCall} 3737aeeb7011a875d3dd439e9fa07dc3ac54d97785b9John McCall 37382f7aa998c0d6494301c12c4fceb6134a1bc248abPeter Collingbourne//===----------------------------------------------------------------------===// 37392f7aa998c0d6494301c12c4fceb6134a1bc248abPeter Collingbourne// TCE ABI Implementation (see http://tce.cs.tut.fi). Uses mostly the defaults. 37402f7aa998c0d6494301c12c4fceb6134a1bc248abPeter Collingbourne// Currently subclassed only to implement custom OpenCL C function attribute 37412f7aa998c0d6494301c12c4fceb6134a1bc248abPeter Collingbourne// handling. 37422f7aa998c0d6494301c12c4fceb6134a1bc248abPeter Collingbourne//===----------------------------------------------------------------------===// 37432f7aa998c0d6494301c12c4fceb6134a1bc248abPeter Collingbourne 37442f7aa998c0d6494301c12c4fceb6134a1bc248abPeter Collingbournenamespace { 37452f7aa998c0d6494301c12c4fceb6134a1bc248abPeter Collingbourne 37462f7aa998c0d6494301c12c4fceb6134a1bc248abPeter Collingbourneclass TCETargetCodeGenInfo : public DefaultTargetCodeGenInfo { 37472f7aa998c0d6494301c12c4fceb6134a1bc248abPeter Collingbournepublic: 37482f7aa998c0d6494301c12c4fceb6134a1bc248abPeter Collingbourne TCETargetCodeGenInfo(CodeGenTypes &CGT) 37492f7aa998c0d6494301c12c4fceb6134a1bc248abPeter Collingbourne : DefaultTargetCodeGenInfo(CGT) {} 37502f7aa998c0d6494301c12c4fceb6134a1bc248abPeter Collingbourne 37512f7aa998c0d6494301c12c4fceb6134a1bc248abPeter Collingbourne virtual void SetTargetAttributes(const Decl *D, llvm::GlobalValue *GV, 37522f7aa998c0d6494301c12c4fceb6134a1bc248abPeter Collingbourne CodeGen::CodeGenModule &M) const; 37532f7aa998c0d6494301c12c4fceb6134a1bc248abPeter Collingbourne}; 37542f7aa998c0d6494301c12c4fceb6134a1bc248abPeter Collingbourne 37552f7aa998c0d6494301c12c4fceb6134a1bc248abPeter Collingbournevoid TCETargetCodeGenInfo::SetTargetAttributes(const Decl *D, 37562f7aa998c0d6494301c12c4fceb6134a1bc248abPeter Collingbourne llvm::GlobalValue *GV, 37572f7aa998c0d6494301c12c4fceb6134a1bc248abPeter Collingbourne CodeGen::CodeGenModule &M) const { 37582f7aa998c0d6494301c12c4fceb6134a1bc248abPeter Collingbourne const FunctionDecl *FD = dyn_cast<FunctionDecl>(D); 37592f7aa998c0d6494301c12c4fceb6134a1bc248abPeter Collingbourne if (!FD) return; 37602f7aa998c0d6494301c12c4fceb6134a1bc248abPeter Collingbourne 37612f7aa998c0d6494301c12c4fceb6134a1bc248abPeter Collingbourne llvm::Function *F = cast<llvm::Function>(GV); 37622f7aa998c0d6494301c12c4fceb6134a1bc248abPeter Collingbourne 37634e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (M.getLangOpts().OpenCL) { 37642f7aa998c0d6494301c12c4fceb6134a1bc248abPeter Collingbourne if (FD->hasAttr<OpenCLKernelAttr>()) { 37652f7aa998c0d6494301c12c4fceb6134a1bc248abPeter Collingbourne // OpenCL C Kernel functions are not subject to inlining 37662f7aa998c0d6494301c12c4fceb6134a1bc248abPeter Collingbourne F->addFnAttr(llvm::Attribute::NoInline); 37672f7aa998c0d6494301c12c4fceb6134a1bc248abPeter Collingbourne 37682f7aa998c0d6494301c12c4fceb6134a1bc248abPeter Collingbourne if (FD->hasAttr<ReqdWorkGroupSizeAttr>()) { 37692f7aa998c0d6494301c12c4fceb6134a1bc248abPeter Collingbourne 37702f7aa998c0d6494301c12c4fceb6134a1bc248abPeter Collingbourne // Convert the reqd_work_group_size() attributes to metadata. 37712f7aa998c0d6494301c12c4fceb6134a1bc248abPeter Collingbourne llvm::LLVMContext &Context = F->getContext(); 37722f7aa998c0d6494301c12c4fceb6134a1bc248abPeter Collingbourne llvm::NamedMDNode *OpenCLMetadata = 37732f7aa998c0d6494301c12c4fceb6134a1bc248abPeter Collingbourne M.getModule().getOrInsertNamedMetadata("opencl.kernel_wg_size_info"); 37742f7aa998c0d6494301c12c4fceb6134a1bc248abPeter Collingbourne 37752f7aa998c0d6494301c12c4fceb6134a1bc248abPeter Collingbourne SmallVector<llvm::Value*, 5> Operands; 37762f7aa998c0d6494301c12c4fceb6134a1bc248abPeter Collingbourne Operands.push_back(F); 37772f7aa998c0d6494301c12c4fceb6134a1bc248abPeter Collingbourne 37788b418685e9e4f02f4eb2a76e1ec063e07552b68dChris Lattner Operands.push_back(llvm::Constant::getIntegerValue(M.Int32Ty, 37798b418685e9e4f02f4eb2a76e1ec063e07552b68dChris Lattner llvm::APInt(32, 37808b418685e9e4f02f4eb2a76e1ec063e07552b68dChris Lattner FD->getAttr<ReqdWorkGroupSizeAttr>()->getXDim()))); 37818b418685e9e4f02f4eb2a76e1ec063e07552b68dChris Lattner Operands.push_back(llvm::Constant::getIntegerValue(M.Int32Ty, 37828b418685e9e4f02f4eb2a76e1ec063e07552b68dChris Lattner llvm::APInt(32, 37832f7aa998c0d6494301c12c4fceb6134a1bc248abPeter Collingbourne FD->getAttr<ReqdWorkGroupSizeAttr>()->getYDim()))); 37848b418685e9e4f02f4eb2a76e1ec063e07552b68dChris Lattner Operands.push_back(llvm::Constant::getIntegerValue(M.Int32Ty, 37858b418685e9e4f02f4eb2a76e1ec063e07552b68dChris Lattner llvm::APInt(32, 37862f7aa998c0d6494301c12c4fceb6134a1bc248abPeter Collingbourne FD->getAttr<ReqdWorkGroupSizeAttr>()->getZDim()))); 37872f7aa998c0d6494301c12c4fceb6134a1bc248abPeter Collingbourne 37882f7aa998c0d6494301c12c4fceb6134a1bc248abPeter Collingbourne // Add a boolean constant operand for "required" (true) or "hint" (false) 37892f7aa998c0d6494301c12c4fceb6134a1bc248abPeter Collingbourne // for implementing the work_group_size_hint attr later. Currently 37902f7aa998c0d6494301c12c4fceb6134a1bc248abPeter Collingbourne // always true as the hint is not yet implemented. 37918b418685e9e4f02f4eb2a76e1ec063e07552b68dChris Lattner Operands.push_back(llvm::ConstantInt::getTrue(Context)); 37922f7aa998c0d6494301c12c4fceb6134a1bc248abPeter Collingbourne OpenCLMetadata->addOperand(llvm::MDNode::get(Context, Operands)); 37932f7aa998c0d6494301c12c4fceb6134a1bc248abPeter Collingbourne } 37942f7aa998c0d6494301c12c4fceb6134a1bc248abPeter Collingbourne } 37952f7aa998c0d6494301c12c4fceb6134a1bc248abPeter Collingbourne } 37962f7aa998c0d6494301c12c4fceb6134a1bc248abPeter Collingbourne} 37972f7aa998c0d6494301c12c4fceb6134a1bc248abPeter Collingbourne 37982f7aa998c0d6494301c12c4fceb6134a1bc248abPeter Collingbourne} 3799aeeb7011a875d3dd439e9fa07dc3ac54d97785b9John McCall 38009631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum//===----------------------------------------------------------------------===// 38019631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum// Hexagon ABI Implementation 38029631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum//===----------------------------------------------------------------------===// 38039631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum 38049631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicumnamespace { 38059631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum 38069631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicumclass HexagonABIInfo : public ABIInfo { 38079631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum 38089631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum 38099631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicumpublic: 38109631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum HexagonABIInfo(CodeGenTypes &CGT) : ABIInfo(CGT) {} 38119631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum 38129631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicumprivate: 38139631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum 38149631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum ABIArgInfo classifyReturnType(QualType RetTy) const; 38159631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum ABIArgInfo classifyArgumentType(QualType RetTy) const; 38169631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum 38179631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum virtual void computeInfo(CGFunctionInfo &FI) const; 38189631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum 38199631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum virtual llvm::Value *EmitVAArg(llvm::Value *VAListAddr, QualType Ty, 38209631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum CodeGenFunction &CGF) const; 38219631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum}; 38229631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum 38239631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicumclass HexagonTargetCodeGenInfo : public TargetCodeGenInfo { 38249631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicumpublic: 38259631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum HexagonTargetCodeGenInfo(CodeGenTypes &CGT) 38269631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum :TargetCodeGenInfo(new HexagonABIInfo(CGT)) {} 38279631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum 38289631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum int getDwarfEHStackPointer(CodeGen::CodeGenModule &M) const { 38299631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum return 29; 38309631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum } 38319631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum}; 38329631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum 38339631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum} 38349631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum 38359631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicumvoid HexagonABIInfo::computeInfo(CGFunctionInfo &FI) const { 38369631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum FI.getReturnInfo() = classifyReturnType(FI.getReturnType()); 38379631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum for (CGFunctionInfo::arg_iterator it = FI.arg_begin(), ie = FI.arg_end(); 38389631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum it != ie; ++it) 38399631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum it->info = classifyArgumentType(it->type); 38409631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum} 38419631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum 38429631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony LinthicumABIArgInfo HexagonABIInfo::classifyArgumentType(QualType Ty) const { 38439631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum if (!isAggregateTypeForABI(Ty)) { 38449631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum // Treat an enum type as its underlying type. 38459631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum if (const EnumType *EnumTy = Ty->getAs<EnumType>()) 38469631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum Ty = EnumTy->getDecl()->getIntegerType(); 38479631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum 38489631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum return (Ty->isPromotableIntegerType() ? 38499631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum ABIArgInfo::getExtend() : ABIArgInfo::getDirect()); 38509631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum } 38519631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum 38529631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum // Ignore empty records. 38539631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum if (isEmptyRecord(getContext(), Ty, true)) 38549631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum return ABIArgInfo::getIgnore(); 38559631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum 38569631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum // Structures with either a non-trivial destructor or a non-trivial 38579631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum // copy constructor are always indirect. 38589631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum if (isRecordWithNonTrivialDestructorOrCopyConstructor(Ty)) 38599631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum return ABIArgInfo::getIndirect(0, /*ByVal=*/false); 38609631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum 38619631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum uint64_t Size = getContext().getTypeSize(Ty); 38629631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum if (Size > 64) 38639631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum return ABIArgInfo::getIndirect(0, /*ByVal=*/true); 38649631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum // Pass in the smallest viable integer type. 38659631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum else if (Size > 32) 38669631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum return ABIArgInfo::getDirect(llvm::Type::getInt64Ty(getVMContext())); 38679631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum else if (Size > 16) 38689631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum return ABIArgInfo::getDirect(llvm::Type::getInt32Ty(getVMContext())); 38699631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum else if (Size > 8) 38709631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum return ABIArgInfo::getDirect(llvm::Type::getInt16Ty(getVMContext())); 38719631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum else 38729631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum return ABIArgInfo::getDirect(llvm::Type::getInt8Ty(getVMContext())); 38739631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum} 38749631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum 38759631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony LinthicumABIArgInfo HexagonABIInfo::classifyReturnType(QualType RetTy) const { 38769631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum if (RetTy->isVoidType()) 38779631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum return ABIArgInfo::getIgnore(); 38789631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum 38799631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum // Large vector types should be returned via memory. 38809631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum if (RetTy->isVectorType() && getContext().getTypeSize(RetTy) > 64) 38819631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum return ABIArgInfo::getIndirect(0); 38829631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum 38839631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum if (!isAggregateTypeForABI(RetTy)) { 38849631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum // Treat an enum type as its underlying type. 38859631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum if (const EnumType *EnumTy = RetTy->getAs<EnumType>()) 38869631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum RetTy = EnumTy->getDecl()->getIntegerType(); 38879631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum 38889631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum return (RetTy->isPromotableIntegerType() ? 38899631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum ABIArgInfo::getExtend() : ABIArgInfo::getDirect()); 38909631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum } 38919631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum 38929631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum // Structures with either a non-trivial destructor or a non-trivial 38939631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum // copy constructor are always indirect. 38949631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum if (isRecordWithNonTrivialDestructorOrCopyConstructor(RetTy)) 38959631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum return ABIArgInfo::getIndirect(0, /*ByVal=*/false); 38969631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum 38979631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum if (isEmptyRecord(getContext(), RetTy, true)) 38989631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum return ABIArgInfo::getIgnore(); 38999631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum 39009631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum // Aggregates <= 8 bytes are returned in r0; other aggregates 39019631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum // are returned indirectly. 39029631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum uint64_t Size = getContext().getTypeSize(RetTy); 39039631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum if (Size <= 64) { 39049631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum // Return in the smallest viable integer type. 39059631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum if (Size <= 8) 39069631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum return ABIArgInfo::getDirect(llvm::Type::getInt8Ty(getVMContext())); 39079631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum if (Size <= 16) 39089631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum return ABIArgInfo::getDirect(llvm::Type::getInt16Ty(getVMContext())); 39099631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum if (Size <= 32) 39109631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum return ABIArgInfo::getDirect(llvm::Type::getInt32Ty(getVMContext())); 39119631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum return ABIArgInfo::getDirect(llvm::Type::getInt64Ty(getVMContext())); 39129631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum } 39139631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum 39149631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum return ABIArgInfo::getIndirect(0, /*ByVal=*/true); 39159631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum} 39169631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum 39179631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicumllvm::Value *HexagonABIInfo::EmitVAArg(llvm::Value *VAListAddr, QualType Ty, 39188b418685e9e4f02f4eb2a76e1ec063e07552b68dChris Lattner CodeGenFunction &CGF) const { 39199631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum // FIXME: Need to handle alignment 39208b418685e9e4f02f4eb2a76e1ec063e07552b68dChris Lattner llvm::Type *BPP = CGF.Int8PtrPtrTy; 39219631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum 39229631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum CGBuilderTy &Builder = CGF.Builder; 39239631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum llvm::Value *VAListAddrAsBPP = Builder.CreateBitCast(VAListAddr, BPP, 39249631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum "ap"); 39259631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum llvm::Value *Addr = Builder.CreateLoad(VAListAddrAsBPP, "ap.cur"); 39269631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum llvm::Type *PTy = 39279631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum llvm::PointerType::getUnqual(CGF.ConvertType(Ty)); 39289631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum llvm::Value *AddrTyped = Builder.CreateBitCast(Addr, PTy); 39299631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum 39309631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum uint64_t Offset = 39319631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum llvm::RoundUpToAlignment(CGF.getContext().getTypeSize(Ty) / 8, 4); 39329631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum llvm::Value *NextAddr = 39339631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum Builder.CreateGEP(Addr, llvm::ConstantInt::get(CGF.Int32Ty, Offset), 39349631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum "ap.next"); 39359631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum Builder.CreateStore(NextAddr, VAListAddrAsBPP); 39369631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum 39379631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum return AddrTyped; 39389631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum} 39399631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum 39409631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum 3941ea0443212e7ec6ff82e2f174e8e948a6eb0e0876Chris Lattnerconst TargetCodeGenInfo &CodeGenModule::getTargetCodeGenInfo() { 394282d0a418c8699fc6f4a9417457ffe93d43bba1c1Anton Korobeynikov if (TheTargetCodeGenInfo) 394382d0a418c8699fc6f4a9417457ffe93d43bba1c1Anton Korobeynikov return *TheTargetCodeGenInfo; 3944c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 3945bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor const llvm::Triple &Triple = getContext().getTargetInfo().getTriple(); 39461752ee4849f4c37f5e03193e658be92650b0e65aDaniel Dunbar switch (Triple.getArch()) { 39472c0843f166a82f251b20370fadab57878969e7aaDaniel Dunbar default: 3948ea0443212e7ec6ff82e2f174e8e948a6eb0e0876Chris Lattner return *(TheTargetCodeGenInfo = new DefaultTargetCodeGenInfo(Types)); 39492c0843f166a82f251b20370fadab57878969e7aaDaniel Dunbar 39509ed63f8b87b1f7d074d21cc1210fd28d93291beaDerek Schuff case llvm::Triple::le32: 39519ed63f8b87b1f7d074d21cc1210fd28d93291beaDerek Schuff return *(TheTargetCodeGenInfo = new PNaClTargetCodeGenInfo(Types)); 3952aeeb7011a875d3dd439e9fa07dc3ac54d97785b9John McCall case llvm::Triple::mips: 3953aeeb7011a875d3dd439e9fa07dc3ac54d97785b9John McCall case llvm::Triple::mipsel: 3954c0e3b665344a39bd733e0d9f55bf0f1937922289Akira Hatanaka return *(TheTargetCodeGenInfo = new MIPSTargetCodeGenInfo(Types, true)); 3955aeeb7011a875d3dd439e9fa07dc3ac54d97785b9John McCall 39568c6dfbe044155277b06e4345f1b98910692390b6Akira Hatanaka case llvm::Triple::mips64: 39578c6dfbe044155277b06e4345f1b98910692390b6Akira Hatanaka case llvm::Triple::mips64el: 3958c0e3b665344a39bd733e0d9f55bf0f1937922289Akira Hatanaka return *(TheTargetCodeGenInfo = new MIPSTargetCodeGenInfo(Types, false)); 39598c6dfbe044155277b06e4345f1b98910692390b6Akira Hatanaka 396034d91fddd0252d64456cdcea0bd22073f006f4e2Daniel Dunbar case llvm::Triple::arm: 396134d91fddd0252d64456cdcea0bd22073f006f4e2Daniel Dunbar case llvm::Triple::thumb: 396234c1af83e159cfe0f43e7a855e84783f301fc1f1Sandeep Patel { 396334c1af83e159cfe0f43e7a855e84783f301fc1f1Sandeep Patel ARMABIInfo::ABIKind Kind = ARMABIInfo::AAPCS; 39645e7bacef79f7725f4abc45e2a5eccedae40dfcd3Daniel Dunbar 3965bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor if (strcmp(getContext().getTargetInfo().getABI(), "apcs-gnu") == 0) 396634c1af83e159cfe0f43e7a855e84783f301fc1f1Sandeep Patel Kind = ARMABIInfo::APCS; 396734c1af83e159cfe0f43e7a855e84783f301fc1f1Sandeep Patel else if (CodeGenOpts.FloatABI == "hard") 396834c1af83e159cfe0f43e7a855e84783f301fc1f1Sandeep Patel Kind = ARMABIInfo::AAPCS_VFP; 396934c1af83e159cfe0f43e7a855e84783f301fc1f1Sandeep Patel 397034c1af83e159cfe0f43e7a855e84783f301fc1f1Sandeep Patel return *(TheTargetCodeGenInfo = new ARMTargetCodeGenInfo(Types, Kind)); 397134c1af83e159cfe0f43e7a855e84783f301fc1f1Sandeep Patel } 397234d91fddd0252d64456cdcea0bd22073f006f4e2Daniel Dunbar 3973ec853ba1087f606e9685cb1e800616565ba35093John McCall case llvm::Triple::ppc: 3974ea0443212e7ec6ff82e2f174e8e948a6eb0e0876Chris Lattner return *(TheTargetCodeGenInfo = new PPC32TargetCodeGenInfo(Types)); 39750fbc4b97bd763850ecd72ad79b22b1ad85c5d965Roman Divacky case llvm::Triple::ppc64: 39762fc107f5652a526d9c2972dc3b386e5d86769e44Bill Schmidt if (Triple.isOSBinFormatELF()) 39772fc107f5652a526d9c2972dc3b386e5d86769e44Bill Schmidt return *(TheTargetCodeGenInfo = new PPC64_SVR4_TargetCodeGenInfo(Types)); 39782fc107f5652a526d9c2972dc3b386e5d86769e44Bill Schmidt else 39792fc107f5652a526d9c2972dc3b386e5d86769e44Bill Schmidt return *(TheTargetCodeGenInfo = new PPC64TargetCodeGenInfo(Types)); 3980ec853ba1087f606e9685cb1e800616565ba35093John McCall 3981edb66f38dbdc501342aa1f17c8a15a34ed73584dPeter Collingbourne case llvm::Triple::nvptx: 3982edb66f38dbdc501342aa1f17c8a15a34ed73584dPeter Collingbourne case llvm::Triple::nvptx64: 39832c585b991596859f39860b6094247ba027a03530Justin Holewinski return *(TheTargetCodeGenInfo = new NVPTXTargetCodeGenInfo(Types)); 39840259c3a3df3c2f3b9de7e3845df1eea3ac04e1aaJustin Holewinski 3985276fdf408050d205f3a7f34c1e788224a67d2098Wesley Peck case llvm::Triple::mblaze: 3986276fdf408050d205f3a7f34c1e788224a67d2098Wesley Peck return *(TheTargetCodeGenInfo = new MBlazeTargetCodeGenInfo(Types)); 3987276fdf408050d205f3a7f34c1e788224a67d2098Wesley Peck 398882d0a418c8699fc6f4a9417457ffe93d43bba1c1Anton Korobeynikov case llvm::Triple::msp430: 3989ea0443212e7ec6ff82e2f174e8e948a6eb0e0876Chris Lattner return *(TheTargetCodeGenInfo = new MSP430TargetCodeGenInfo(Types)); 399034d91fddd0252d64456cdcea0bd22073f006f4e2Daniel Dunbar 39912f7aa998c0d6494301c12c4fceb6134a1bc248abPeter Collingbourne case llvm::Triple::tce: 39922f7aa998c0d6494301c12c4fceb6134a1bc248abPeter Collingbourne return *(TheTargetCodeGenInfo = new TCETargetCodeGenInfo(Types)); 39932f7aa998c0d6494301c12c4fceb6134a1bc248abPeter Collingbourne 3994c3e0fb406fb6fe83566dc6d8b05362e0a2c1e191Eli Friedman case llvm::Triple::x86: { 3995bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor bool DisableMMX = strcmp(getContext().getTargetInfo().getABI(), "no-mmx") == 0; 3996c3e0fb406fb6fe83566dc6d8b05362e0a2c1e191Eli Friedman 3997db57a4cdb0a6abf3239f3a794a900ce312c5887bDaniel Dunbar if (Triple.isOSDarwin()) 399882d0a418c8699fc6f4a9417457ffe93d43bba1c1Anton Korobeynikov return *(TheTargetCodeGenInfo = 3999b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola new X86_32TargetCodeGenInfo(Types, true, true, DisableMMX, false, 4000b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola CodeGenOpts.NumRegisterParameters)); 4001db57a4cdb0a6abf3239f3a794a900ce312c5887bDaniel Dunbar 4002db57a4cdb0a6abf3239f3a794a900ce312c5887bDaniel Dunbar switch (Triple.getOS()) { 40032c0843f166a82f251b20370fadab57878969e7aaDaniel Dunbar case llvm::Triple::Cygwin: 40042c0843f166a82f251b20370fadab57878969e7aaDaniel Dunbar case llvm::Triple::MinGW32: 4005727e268bd2974a7b16af65a5cfdfe47da9ebeb6cEdward O'Callaghan case llvm::Triple::AuroraUX: 4006727e268bd2974a7b16af65a5cfdfe47da9ebeb6cEdward O'Callaghan case llvm::Triple::DragonFly: 400775c135a511c855d94bbfa7f00dd27a165f61e953David Chisnall case llvm::Triple::FreeBSD: 40082c0843f166a82f251b20370fadab57878969e7aaDaniel Dunbar case llvm::Triple::OpenBSD: 400942f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman case llvm::Triple::Bitrig: 401082d0a418c8699fc6f4a9417457ffe93d43bba1c1Anton Korobeynikov return *(TheTargetCodeGenInfo = 4011b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola new X86_32TargetCodeGenInfo(Types, false, true, DisableMMX, 4012b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola false, 4013b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola CodeGenOpts.NumRegisterParameters)); 401455fc7e2b8005ba87a81664d065e9b9e2fff1b1afEli Friedman 401555fc7e2b8005ba87a81664d065e9b9e2fff1b1afEli Friedman case llvm::Triple::Win32: 401655fc7e2b8005ba87a81664d065e9b9e2fff1b1afEli Friedman return *(TheTargetCodeGenInfo = 4017b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola new X86_32TargetCodeGenInfo(Types, false, true, DisableMMX, true, 4018b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola CodeGenOpts.NumRegisterParameters)); 40192c0843f166a82f251b20370fadab57878969e7aaDaniel Dunbar 40202c0843f166a82f251b20370fadab57878969e7aaDaniel Dunbar default: 402182d0a418c8699fc6f4a9417457ffe93d43bba1c1Anton Korobeynikov return *(TheTargetCodeGenInfo = 4022b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola new X86_32TargetCodeGenInfo(Types, false, false, DisableMMX, 4023b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola false, 4024b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola CodeGenOpts.NumRegisterParameters)); 4025c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov } 4026c3e0fb406fb6fe83566dc6d8b05362e0a2c1e191Eli Friedman } 40272c0843f166a82f251b20370fadab57878969e7aaDaniel Dunbar 4028ee1ad99f1ced9ffee436466ef674d4541c37864eEli Friedman case llvm::Triple::x86_64: { 4029ee1ad99f1ced9ffee436466ef674d4541c37864eEli Friedman bool HasAVX = strcmp(getContext().getTargetInfo().getABI(), "avx") == 0; 4030ee1ad99f1ced9ffee436466ef674d4541c37864eEli Friedman 4031f13721dd91dda7675e499331a2770308ad20ca61Chris Lattner switch (Triple.getOS()) { 4032f13721dd91dda7675e499331a2770308ad20ca61Chris Lattner case llvm::Triple::Win32: 40330aa205765aec0aa5eed672f8e3cade543372edcdNAKAMURA Takumi case llvm::Triple::MinGW32: 4034f13721dd91dda7675e499331a2770308ad20ca61Chris Lattner case llvm::Triple::Cygwin: 4035f13721dd91dda7675e499331a2770308ad20ca61Chris Lattner return *(TheTargetCodeGenInfo = new WinX86_64TargetCodeGenInfo(Types)); 4036f13721dd91dda7675e499331a2770308ad20ca61Chris Lattner default: 4037ee1ad99f1ced9ffee436466ef674d4541c37864eEli Friedman return *(TheTargetCodeGenInfo = new X86_64TargetCodeGenInfo(Types, 4038ee1ad99f1ced9ffee436466ef674d4541c37864eEli Friedman HasAVX)); 4039f13721dd91dda7675e499331a2770308ad20ca61Chris Lattner } 4040c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov } 40419631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum case llvm::Triple::hexagon: 40429631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum return *(TheTargetCodeGenInfo = new HexagonTargetCodeGenInfo(Types)); 4043ee1ad99f1ced9ffee436466ef674d4541c37864eEli Friedman } 4044c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov} 4045