TargetInfo.cpp revision 15842bd05bd6d3b7450385ac8f73aaee5f807e19
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" 19c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov#include "llvm/Type.h" 209c254f0415bef9a0bafe5b5026ddb54b727597b1Chris Lattner#include "llvm/Target/TargetData.h" 2182d0a418c8699fc6f4a9417457ffe93d43bba1c1Anton Korobeynikov#include "llvm/ADT/StringExtras.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 39c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton KorobeynikovABIInfo::~ABIInfo() {} 40c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 41ea0443212e7ec6ff82e2f174e8e948a6eb0e0876Chris LattnerASTContext &ABIInfo::getContext() const { 42ea0443212e7ec6ff82e2f174e8e948a6eb0e0876Chris Lattner return CGT.getContext(); 43ea0443212e7ec6ff82e2f174e8e948a6eb0e0876Chris Lattner} 44ea0443212e7ec6ff82e2f174e8e948a6eb0e0876Chris Lattner 45ea0443212e7ec6ff82e2f174e8e948a6eb0e0876Chris Lattnerllvm::LLVMContext &ABIInfo::getVMContext() const { 46ea0443212e7ec6ff82e2f174e8e948a6eb0e0876Chris Lattner return CGT.getLLVMContext(); 47ea0443212e7ec6ff82e2f174e8e948a6eb0e0876Chris Lattner} 48ea0443212e7ec6ff82e2f174e8e948a6eb0e0876Chris Lattner 49ea0443212e7ec6ff82e2f174e8e948a6eb0e0876Chris Lattnerconst llvm::TargetData &ABIInfo::getTargetData() const { 50ea0443212e7ec6ff82e2f174e8e948a6eb0e0876Chris Lattner return CGT.getTargetData(); 51ea0443212e7ec6ff82e2f174e8e948a6eb0e0876Chris Lattner} 52ea0443212e7ec6ff82e2f174e8e948a6eb0e0876Chris Lattner 53ea0443212e7ec6ff82e2f174e8e948a6eb0e0876Chris Lattner 54c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikovvoid ABIArgInfo::dump() const { 5528df7a5813d94ff32904c31195d7f6fd74db8c53Daniel Dunbar llvm::raw_ostream &OS = llvm::errs(); 5628df7a5813d94ff32904c31195d7f6fd74db8c53Daniel Dunbar OS << "(ABIArgInfo Kind="; 57c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov switch (TheKind) { 58c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov case Direct: 5928df7a5813d94ff32904c31195d7f6fd74db8c53Daniel Dunbar OS << "Direct"; 60c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov break; 61cc6fa88666ca2f287df4a600eb31a4087bab9c13Anton Korobeynikov case Extend: 6228df7a5813d94ff32904c31195d7f6fd74db8c53Daniel Dunbar OS << "Extend"; 63cc6fa88666ca2f287df4a600eb31a4087bab9c13Anton Korobeynikov break; 64c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov case Ignore: 6528df7a5813d94ff32904c31195d7f6fd74db8c53Daniel Dunbar OS << "Ignore"; 66c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov break; 67c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov case Coerce: 6828df7a5813d94ff32904c31195d7f6fd74db8c53Daniel Dunbar OS << "Coerce Type="; 6928df7a5813d94ff32904c31195d7f6fd74db8c53Daniel Dunbar getCoerceToType()->print(OS); 70c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov break; 71c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov case Indirect: 72dc6d574155072bfb35a7a29b94ef3afa0d40fb5aDaniel Dunbar OS << "Indirect Align=" << getIndirectAlign() 73dc6d574155072bfb35a7a29b94ef3afa0d40fb5aDaniel Dunbar << " Byal=" << getIndirectByVal(); 74c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov break; 75c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov case Expand: 7628df7a5813d94ff32904c31195d7f6fd74db8c53Daniel Dunbar OS << "Expand"; 77c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov break; 78c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov } 7928df7a5813d94ff32904c31195d7f6fd74db8c53Daniel Dunbar OS << ")\n"; 80c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov} 81c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 8282d0a418c8699fc6f4a9417457ffe93d43bba1c1Anton KorobeynikovTargetCodeGenInfo::~TargetCodeGenInfo() { delete Info; } 8382d0a418c8699fc6f4a9417457ffe93d43bba1c1Anton Korobeynikov 8498303b93ae335bbb4731f6f1f8164d3c70648346Daniel Dunbarstatic bool isEmptyRecord(ASTContext &Context, QualType T, bool AllowArrays); 85c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 86c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov/// isEmptyField - Return true iff a the field is "empty", that is it 87c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov/// is an unnamed bit-field or an (array of) empty record(s). 8898303b93ae335bbb4731f6f1f8164d3c70648346Daniel Dunbarstatic bool isEmptyField(ASTContext &Context, const FieldDecl *FD, 8998303b93ae335bbb4731f6f1f8164d3c70648346Daniel Dunbar bool AllowArrays) { 90c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov if (FD->isUnnamedBitfield()) 91c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov return true; 92c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 93c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov QualType FT = FD->getType(); 94c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 9598303b93ae335bbb4731f6f1f8164d3c70648346Daniel Dunbar // Constant arrays of empty records count as empty, strip them off. 9698303b93ae335bbb4731f6f1f8164d3c70648346Daniel Dunbar if (AllowArrays) 9798303b93ae335bbb4731f6f1f8164d3c70648346Daniel Dunbar while (const ConstantArrayType *AT = Context.getAsConstantArrayType(FT)) 9898303b93ae335bbb4731f6f1f8164d3c70648346Daniel Dunbar FT = AT->getElementType(); 9998303b93ae335bbb4731f6f1f8164d3c70648346Daniel Dunbar 1005ea68614bfe0e78b5d66339b781529038f86501fDaniel Dunbar const RecordType *RT = FT->getAs<RecordType>(); 1015ea68614bfe0e78b5d66339b781529038f86501fDaniel Dunbar if (!RT) 1025ea68614bfe0e78b5d66339b781529038f86501fDaniel Dunbar return false; 1035ea68614bfe0e78b5d66339b781529038f86501fDaniel Dunbar 1045ea68614bfe0e78b5d66339b781529038f86501fDaniel Dunbar // C++ record fields are never empty, at least in the Itanium ABI. 1055ea68614bfe0e78b5d66339b781529038f86501fDaniel Dunbar // 1065ea68614bfe0e78b5d66339b781529038f86501fDaniel Dunbar // FIXME: We should use a predicate for whether this behavior is true in the 1075ea68614bfe0e78b5d66339b781529038f86501fDaniel Dunbar // current ABI. 1085ea68614bfe0e78b5d66339b781529038f86501fDaniel Dunbar if (isa<CXXRecordDecl>(RT->getDecl())) 1095ea68614bfe0e78b5d66339b781529038f86501fDaniel Dunbar return false; 1105ea68614bfe0e78b5d66339b781529038f86501fDaniel Dunbar 11198303b93ae335bbb4731f6f1f8164d3c70648346Daniel Dunbar return isEmptyRecord(Context, FT, AllowArrays); 112c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov} 113c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 114c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov/// isEmptyRecord - Return true iff a structure contains only empty 115c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov/// fields. Note that a structure with a flexible array member is not 116c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov/// considered empty. 11798303b93ae335bbb4731f6f1f8164d3c70648346Daniel Dunbarstatic bool isEmptyRecord(ASTContext &Context, QualType T, bool AllowArrays) { 1186217b80b7a1379b74cced1c076338262c3c980b3Ted Kremenek const RecordType *RT = T->getAs<RecordType>(); 119c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov if (!RT) 120c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov return 0; 121c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov const RecordDecl *RD = RT->getDecl(); 122c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov if (RD->hasFlexibleArrayMember()) 123c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov return false; 1245ea68614bfe0e78b5d66339b781529038f86501fDaniel Dunbar 1255ea68614bfe0e78b5d66339b781529038f86501fDaniel Dunbar // If this is a C++ record, check the bases first. 1265ea68614bfe0e78b5d66339b781529038f86501fDaniel Dunbar if (const CXXRecordDecl *CXXRD = dyn_cast<CXXRecordDecl>(RD)) 1275ea68614bfe0e78b5d66339b781529038f86501fDaniel Dunbar for (CXXRecordDecl::base_class_const_iterator i = CXXRD->bases_begin(), 1285ea68614bfe0e78b5d66339b781529038f86501fDaniel Dunbar e = CXXRD->bases_end(); i != e; ++i) 1295ea68614bfe0e78b5d66339b781529038f86501fDaniel Dunbar if (!isEmptyRecord(Context, i->getType(), true)) 1305ea68614bfe0e78b5d66339b781529038f86501fDaniel Dunbar return false; 1315ea68614bfe0e78b5d66339b781529038f86501fDaniel Dunbar 13217945a0f64fe03ff6ec0c2146005a87636e3ac12Argyrios Kyrtzidis for (RecordDecl::field_iterator i = RD->field_begin(), e = RD->field_end(); 13317945a0f64fe03ff6ec0c2146005a87636e3ac12Argyrios Kyrtzidis i != e; ++i) 13498303b93ae335bbb4731f6f1f8164d3c70648346Daniel Dunbar if (!isEmptyField(Context, *i, AllowArrays)) 135c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov return false; 136c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov return true; 137c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov} 138c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 1390a8f847e97f40cce51dc69051b964732333dc028Anders Carlsson/// hasNonTrivialDestructorOrCopyConstructor - Determine if a type has either 1400a8f847e97f40cce51dc69051b964732333dc028Anders Carlsson/// a non-trivial destructor or a non-trivial copy constructor. 1410a8f847e97f40cce51dc69051b964732333dc028Anders Carlssonstatic bool hasNonTrivialDestructorOrCopyConstructor(const RecordType *RT) { 1420a8f847e97f40cce51dc69051b964732333dc028Anders Carlsson const CXXRecordDecl *RD = dyn_cast<CXXRecordDecl>(RT->getDecl()); 1430a8f847e97f40cce51dc69051b964732333dc028Anders Carlsson if (!RD) 1440a8f847e97f40cce51dc69051b964732333dc028Anders Carlsson return false; 1450a8f847e97f40cce51dc69051b964732333dc028Anders Carlsson 1460a8f847e97f40cce51dc69051b964732333dc028Anders Carlsson return !RD->hasTrivialDestructor() || !RD->hasTrivialCopyConstructor(); 1470a8f847e97f40cce51dc69051b964732333dc028Anders Carlsson} 1480a8f847e97f40cce51dc69051b964732333dc028Anders Carlsson 1490a8f847e97f40cce51dc69051b964732333dc028Anders Carlsson/// isRecordWithNonTrivialDestructorOrCopyConstructor - Determine if a type is 1500a8f847e97f40cce51dc69051b964732333dc028Anders Carlsson/// a record type with either a non-trivial destructor or a non-trivial copy 1510a8f847e97f40cce51dc69051b964732333dc028Anders Carlsson/// constructor. 1520a8f847e97f40cce51dc69051b964732333dc028Anders Carlssonstatic bool isRecordWithNonTrivialDestructorOrCopyConstructor(QualType T) { 1530a8f847e97f40cce51dc69051b964732333dc028Anders Carlsson const RecordType *RT = T->getAs<RecordType>(); 1540a8f847e97f40cce51dc69051b964732333dc028Anders Carlsson if (!RT) 1550a8f847e97f40cce51dc69051b964732333dc028Anders Carlsson return false; 1560a8f847e97f40cce51dc69051b964732333dc028Anders Carlsson 1570a8f847e97f40cce51dc69051b964732333dc028Anders Carlsson return hasNonTrivialDestructorOrCopyConstructor(RT); 1580a8f847e97f40cce51dc69051b964732333dc028Anders Carlsson} 1590a8f847e97f40cce51dc69051b964732333dc028Anders Carlsson 160c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov/// isSingleElementStruct - Determine if a structure is a "single 161c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov/// element struct", i.e. it has exactly one non-empty field or 162c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov/// exactly one field which is itself a single element 163c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov/// struct. Structures with flexible array members are never 164c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov/// considered single element structs. 165c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov/// 166c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov/// \return The field declaration for the single non-empty field, if 167c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov/// it exists. 168c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikovstatic const Type *isSingleElementStruct(QualType T, ASTContext &Context) { 169c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov const RecordType *RT = T->getAsStructureType(); 170c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov if (!RT) 171c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov return 0; 172c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 173c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov const RecordDecl *RD = RT->getDecl(); 174c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov if (RD->hasFlexibleArrayMember()) 175c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov return 0; 176c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 177c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov const Type *Found = 0; 1789430d5a61598c47d827e1cd05f7cf3f110eeec9eDaniel Dunbar 1799430d5a61598c47d827e1cd05f7cf3f110eeec9eDaniel Dunbar // If this is a C++ record, check the bases first. 1809430d5a61598c47d827e1cd05f7cf3f110eeec9eDaniel Dunbar if (const CXXRecordDecl *CXXRD = dyn_cast<CXXRecordDecl>(RD)) { 1819430d5a61598c47d827e1cd05f7cf3f110eeec9eDaniel Dunbar for (CXXRecordDecl::base_class_const_iterator i = CXXRD->bases_begin(), 1829430d5a61598c47d827e1cd05f7cf3f110eeec9eDaniel Dunbar e = CXXRD->bases_end(); i != e; ++i) { 1839430d5a61598c47d827e1cd05f7cf3f110eeec9eDaniel Dunbar // Ignore empty records. 1845ea68614bfe0e78b5d66339b781529038f86501fDaniel Dunbar if (isEmptyRecord(Context, i->getType(), true)) 1859430d5a61598c47d827e1cd05f7cf3f110eeec9eDaniel Dunbar continue; 1869430d5a61598c47d827e1cd05f7cf3f110eeec9eDaniel Dunbar 1879430d5a61598c47d827e1cd05f7cf3f110eeec9eDaniel Dunbar // If we already found an element then this isn't a single-element struct. 1889430d5a61598c47d827e1cd05f7cf3f110eeec9eDaniel Dunbar if (Found) 1899430d5a61598c47d827e1cd05f7cf3f110eeec9eDaniel Dunbar return 0; 1909430d5a61598c47d827e1cd05f7cf3f110eeec9eDaniel Dunbar 1919430d5a61598c47d827e1cd05f7cf3f110eeec9eDaniel Dunbar // If this is non-empty and not a single element struct, the composite 1929430d5a61598c47d827e1cd05f7cf3f110eeec9eDaniel Dunbar // cannot be a single element struct. 1939430d5a61598c47d827e1cd05f7cf3f110eeec9eDaniel Dunbar Found = isSingleElementStruct(i->getType(), Context); 1949430d5a61598c47d827e1cd05f7cf3f110eeec9eDaniel Dunbar if (!Found) 1959430d5a61598c47d827e1cd05f7cf3f110eeec9eDaniel Dunbar return 0; 1969430d5a61598c47d827e1cd05f7cf3f110eeec9eDaniel Dunbar } 1979430d5a61598c47d827e1cd05f7cf3f110eeec9eDaniel Dunbar } 1989430d5a61598c47d827e1cd05f7cf3f110eeec9eDaniel Dunbar 1999430d5a61598c47d827e1cd05f7cf3f110eeec9eDaniel Dunbar // Check for single element. 20017945a0f64fe03ff6ec0c2146005a87636e3ac12Argyrios Kyrtzidis for (RecordDecl::field_iterator i = RD->field_begin(), e = RD->field_end(); 20117945a0f64fe03ff6ec0c2146005a87636e3ac12Argyrios Kyrtzidis i != e; ++i) { 202c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov const FieldDecl *FD = *i; 203c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov QualType FT = FD->getType(); 204c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 205c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // Ignore empty fields. 20698303b93ae335bbb4731f6f1f8164d3c70648346Daniel Dunbar if (isEmptyField(Context, FD, true)) 207c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov continue; 208c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 209c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // If we already found an element then this isn't a single-element 210c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // struct. 211c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov if (Found) 212c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov return 0; 213c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 214c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // Treat single element arrays as the element. 215c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov while (const ConstantArrayType *AT = Context.getAsConstantArrayType(FT)) { 216c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov if (AT->getSize().getZExtValue() != 1) 217c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov break; 218c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov FT = AT->getElementType(); 219c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov } 220c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 221c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov if (!CodeGenFunction::hasAggregateLLVMType(FT)) { 222c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov Found = FT.getTypePtr(); 223c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov } else { 224c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov Found = isSingleElementStruct(FT, Context); 225c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov if (!Found) 226c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov return 0; 227c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov } 228c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov } 229c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 230c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov return Found; 231c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov} 232c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 233c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikovstatic bool is32Or64BitBasicType(QualType Ty, ASTContext &Context) { 234a1842d32a1964712e42078e9b389dce9258c6a8cDaniel Dunbar if (!Ty->getAs<BuiltinType>() && !Ty->hasPointerRepresentation() && 23555e59e139d9ebcaae16d710472e28edbcafac98aDaniel Dunbar !Ty->isAnyComplexType() && !Ty->isEnumeralType() && 23655e59e139d9ebcaae16d710472e28edbcafac98aDaniel Dunbar !Ty->isBlockPointerType()) 237c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov return false; 238c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 239c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov uint64_t Size = Context.getTypeSize(Ty); 240c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov return Size == 32 || Size == 64; 241c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov} 242c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 24353012f447145bfd5e3a759f069a2bdf2b6705708Daniel Dunbar/// canExpandIndirectArgument - Test whether an argument type which is to be 24453012f447145bfd5e3a759f069a2bdf2b6705708Daniel Dunbar/// passed indirectly (on the stack) would have the equivalent layout if it was 24553012f447145bfd5e3a759f069a2bdf2b6705708Daniel Dunbar/// expanded into separate arguments. If so, we prefer to do the latter to avoid 24653012f447145bfd5e3a759f069a2bdf2b6705708Daniel Dunbar/// inhibiting optimizations. 24753012f447145bfd5e3a759f069a2bdf2b6705708Daniel Dunbar/// 24853012f447145bfd5e3a759f069a2bdf2b6705708Daniel Dunbar// FIXME: This predicate is missing many cases, currently it just follows 24953012f447145bfd5e3a759f069a2bdf2b6705708Daniel Dunbar// llvm-gcc (checks that all fields are 32-bit or 64-bit primitive types). We 25053012f447145bfd5e3a759f069a2bdf2b6705708Daniel Dunbar// should probably make this smarter, or better yet make the LLVM backend 25153012f447145bfd5e3a759f069a2bdf2b6705708Daniel Dunbar// capable of handling it. 25253012f447145bfd5e3a759f069a2bdf2b6705708Daniel Dunbarstatic bool canExpandIndirectArgument(QualType Ty, ASTContext &Context) { 25353012f447145bfd5e3a759f069a2bdf2b6705708Daniel Dunbar // We can only expand structure types. 25453012f447145bfd5e3a759f069a2bdf2b6705708Daniel Dunbar const RecordType *RT = Ty->getAs<RecordType>(); 25553012f447145bfd5e3a759f069a2bdf2b6705708Daniel Dunbar if (!RT) 25653012f447145bfd5e3a759f069a2bdf2b6705708Daniel Dunbar return false; 25753012f447145bfd5e3a759f069a2bdf2b6705708Daniel Dunbar 25853012f447145bfd5e3a759f069a2bdf2b6705708Daniel Dunbar // We can only expand (C) structures. 25953012f447145bfd5e3a759f069a2bdf2b6705708Daniel Dunbar // 26053012f447145bfd5e3a759f069a2bdf2b6705708Daniel Dunbar // FIXME: This needs to be generalized to handle classes as well. 26153012f447145bfd5e3a759f069a2bdf2b6705708Daniel Dunbar const RecordDecl *RD = RT->getDecl(); 26253012f447145bfd5e3a759f069a2bdf2b6705708Daniel Dunbar if (!RD->isStruct() || isa<CXXRecordDecl>(RD)) 26353012f447145bfd5e3a759f069a2bdf2b6705708Daniel Dunbar return false; 26453012f447145bfd5e3a759f069a2bdf2b6705708Daniel Dunbar 26517945a0f64fe03ff6ec0c2146005a87636e3ac12Argyrios Kyrtzidis for (RecordDecl::field_iterator i = RD->field_begin(), e = RD->field_end(); 26617945a0f64fe03ff6ec0c2146005a87636e3ac12Argyrios Kyrtzidis i != e; ++i) { 267c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov const FieldDecl *FD = *i; 268c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 269c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov if (!is32Or64BitBasicType(FD->getType(), Context)) 270c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov return false; 271c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 272c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // FIXME: Reject bit-fields wholesale; there are two problems, we don't know 273c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // how to expand them yet, and the predicate for telling if a bitfield still 274c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // counts as "basic" is more complicated than what we were doing previously. 275c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov if (FD->isBitField()) 276c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov return false; 277c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov } 278c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 279c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov return true; 280c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov} 281c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 282c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikovnamespace { 283c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov/// DefaultABIInfo - The default implementation for ABI specific 284c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov/// details. This implementation provides information which results in 285c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov/// self-consistent and sensible LLVM IR generation, but does not 286c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov/// conform to any particular ABI. 287c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikovclass DefaultABIInfo : public ABIInfo { 288ea0443212e7ec6ff82e2f174e8e948a6eb0e0876Chris Lattnerpublic: 289ea0443212e7ec6ff82e2f174e8e948a6eb0e0876Chris Lattner DefaultABIInfo(CodeGen::CodeGenTypes &CGT) : ABIInfo(CGT) {} 290ea0443212e7ec6ff82e2f174e8e948a6eb0e0876Chris Lattner 291a3c109bbf6e198f463fbe204da4d25b40dab65c4Chris Lattner ABIArgInfo classifyReturnType(QualType RetTy) const; 292a3c109bbf6e198f463fbe204da4d25b40dab65c4Chris Lattner ABIArgInfo classifyArgumentType(QualType RetTy) const; 293c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 294ee5dcd064a811edc90f6c1fb31a837b6c961fed7Chris Lattner virtual void computeInfo(CGFunctionInfo &FI) const { 295a3c109bbf6e198f463fbe204da4d25b40dab65c4Chris Lattner FI.getReturnInfo() = classifyReturnType(FI.getReturnType()); 296c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov for (CGFunctionInfo::arg_iterator it = FI.arg_begin(), ie = FI.arg_end(); 297c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov it != ie; ++it) 298a3c109bbf6e198f463fbe204da4d25b40dab65c4Chris Lattner it->info = classifyArgumentType(it->type); 299c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov } 300c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 301c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov virtual llvm::Value *EmitVAArg(llvm::Value *VAListAddr, QualType Ty, 302c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov CodeGenFunction &CGF) const; 303c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov}; 304c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 30582d0a418c8699fc6f4a9417457ffe93d43bba1c1Anton Korobeynikovclass DefaultTargetCodeGenInfo : public TargetCodeGenInfo { 30682d0a418c8699fc6f4a9417457ffe93d43bba1c1Anton Korobeynikovpublic: 307ea0443212e7ec6ff82e2f174e8e948a6eb0e0876Chris Lattner DefaultTargetCodeGenInfo(CodeGen::CodeGenTypes &CGT) 308ea0443212e7ec6ff82e2f174e8e948a6eb0e0876Chris Lattner : TargetCodeGenInfo(new DefaultABIInfo(CGT)) {} 30982d0a418c8699fc6f4a9417457ffe93d43bba1c1Anton Korobeynikov}; 31082d0a418c8699fc6f4a9417457ffe93d43bba1c1Anton Korobeynikov 31182d0a418c8699fc6f4a9417457ffe93d43bba1c1Anton Korobeynikovllvm::Value *DefaultABIInfo::EmitVAArg(llvm::Value *VAListAddr, QualType Ty, 31282d0a418c8699fc6f4a9417457ffe93d43bba1c1Anton Korobeynikov CodeGenFunction &CGF) const { 31382d0a418c8699fc6f4a9417457ffe93d43bba1c1Anton Korobeynikov return 0; 31482d0a418c8699fc6f4a9417457ffe93d43bba1c1Anton Korobeynikov} 31582d0a418c8699fc6f4a9417457ffe93d43bba1c1Anton Korobeynikov 316a3c109bbf6e198f463fbe204da4d25b40dab65c4Chris LattnerABIArgInfo DefaultABIInfo::classifyArgumentType(QualType Ty) const { 317a14db75641f377ef8b033c67653cd95ac4c36fe3Chris Lattner if (CodeGenFunction::hasAggregateLLVMType(Ty)) 31882d0a418c8699fc6f4a9417457ffe93d43bba1c1Anton Korobeynikov return ABIArgInfo::getIndirect(0); 319dc6d574155072bfb35a7a29b94ef3afa0d40fb5aDaniel Dunbar 320a14db75641f377ef8b033c67653cd95ac4c36fe3Chris Lattner // Treat an enum type as its underlying type. 321a14db75641f377ef8b033c67653cd95ac4c36fe3Chris Lattner if (const EnumType *EnumTy = Ty->getAs<EnumType>()) 322a14db75641f377ef8b033c67653cd95ac4c36fe3Chris Lattner Ty = EnumTy->getDecl()->getIntegerType(); 323aa74a1e49f7c4b89539830290f76fe2c3e97187fDouglas Gregor 324a14db75641f377ef8b033c67653cd95ac4c36fe3Chris Lattner return (Ty->isPromotableIntegerType() ? 325a14db75641f377ef8b033c67653cd95ac4c36fe3Chris Lattner ABIArgInfo::getExtend() : ABIArgInfo::getDirect()); 32682d0a418c8699fc6f4a9417457ffe93d43bba1c1Anton Korobeynikov} 32782d0a418c8699fc6f4a9417457ffe93d43bba1c1Anton Korobeynikov 328dce5ad0cf70ba74e1ecdbb5e81f1a81d97821636Chris Lattner//===----------------------------------------------------------------------===// 329dce5ad0cf70ba74e1ecdbb5e81f1a81d97821636Chris Lattner// X86-32 ABI Implementation 330dce5ad0cf70ba74e1ecdbb5e81f1a81d97821636Chris Lattner//===----------------------------------------------------------------------===// 331dce5ad0cf70ba74e1ecdbb5e81f1a81d97821636Chris Lattner 332c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov/// X86_32ABIInfo - The X86-32 ABI information. 333c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikovclass X86_32ABIInfo : public ABIInfo { 3341e4249c10606f706aac181e6f5e8435ea99d9603David Chisnall bool IsDarwinVectorABI; 3351e4249c10606f706aac181e6f5e8435ea99d9603David Chisnall bool IsSmallStructInRegABI; 336c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 337c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov static bool isRegisterSize(unsigned Size) { 338c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov return (Size == 8 || Size == 16 || Size == 32 || Size == 64); 339c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov } 340c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 341c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov static bool shouldReturnTypeInRegister(QualType Ty, ASTContext &Context); 342c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 343dc6d574155072bfb35a7a29b94ef3afa0d40fb5aDaniel Dunbar /// getIndirectResult - Give a source type \arg Ty, return a suitable result 344dc6d574155072bfb35a7a29b94ef3afa0d40fb5aDaniel Dunbar /// such that the argument will be passed in memory. 345a3c109bbf6e198f463fbe204da4d25b40dab65c4Chris Lattner ABIArgInfo getIndirectResult(QualType Ty, bool ByVal = true) const; 346dc6d574155072bfb35a7a29b94ef3afa0d40fb5aDaniel Dunbar 347c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikovpublic: 348c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 349a3c109bbf6e198f463fbe204da4d25b40dab65c4Chris Lattner ABIArgInfo classifyReturnType(QualType RetTy) const; 350a3c109bbf6e198f463fbe204da4d25b40dab65c4Chris Lattner ABIArgInfo classifyArgumentType(QualType RetTy) const; 351c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 352ee5dcd064a811edc90f6c1fb31a837b6c961fed7Chris Lattner virtual void computeInfo(CGFunctionInfo &FI) const { 353a3c109bbf6e198f463fbe204da4d25b40dab65c4Chris Lattner FI.getReturnInfo() = classifyReturnType(FI.getReturnType()); 354c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov for (CGFunctionInfo::arg_iterator it = FI.arg_begin(), ie = FI.arg_end(); 355c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov it != ie; ++it) 356a3c109bbf6e198f463fbe204da4d25b40dab65c4Chris Lattner it->info = classifyArgumentType(it->type); 357c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov } 358c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 359c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov virtual llvm::Value *EmitVAArg(llvm::Value *VAListAddr, QualType Ty, 360c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov CodeGenFunction &CGF) const; 361c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 362ea0443212e7ec6ff82e2f174e8e948a6eb0e0876Chris Lattner X86_32ABIInfo(CodeGen::CodeGenTypes &CGT, bool d, bool p) 363ea0443212e7ec6ff82e2f174e8e948a6eb0e0876Chris Lattner : ABIInfo(CGT), IsDarwinVectorABI(d), IsSmallStructInRegABI(p) {} 364c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov}; 365c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 36682d0a418c8699fc6f4a9417457ffe93d43bba1c1Anton Korobeynikovclass X86_32TargetCodeGenInfo : public TargetCodeGenInfo { 36782d0a418c8699fc6f4a9417457ffe93d43bba1c1Anton Korobeynikovpublic: 368ea0443212e7ec6ff82e2f174e8e948a6eb0e0876Chris Lattner X86_32TargetCodeGenInfo(CodeGen::CodeGenTypes &CGT, bool d, bool p) 369ea0443212e7ec6ff82e2f174e8e948a6eb0e0876Chris Lattner :TargetCodeGenInfo(new X86_32ABIInfo(CGT, d, p)) {} 37074f7293eb30bf77355c20a3c2cad7b67d8ce7388Charles Davis 37174f7293eb30bf77355c20a3c2cad7b67d8ce7388Charles Davis void SetTargetAttributes(const Decl *D, llvm::GlobalValue *GV, 37274f7293eb30bf77355c20a3c2cad7b67d8ce7388Charles Davis CodeGen::CodeGenModule &CGM) const; 3736374c3307e2d73348f7b8cc73eeeb0998ad0ac94John McCall 3746374c3307e2d73348f7b8cc73eeeb0998ad0ac94John McCall int getDwarfEHStackPointer(CodeGen::CodeGenModule &CGM) const { 3756374c3307e2d73348f7b8cc73eeeb0998ad0ac94John McCall // Darwin uses different dwarf register numbers for EH. 3766374c3307e2d73348f7b8cc73eeeb0998ad0ac94John McCall if (CGM.isTargetDarwin()) return 5; 3776374c3307e2d73348f7b8cc73eeeb0998ad0ac94John McCall 3786374c3307e2d73348f7b8cc73eeeb0998ad0ac94John McCall return 4; 3796374c3307e2d73348f7b8cc73eeeb0998ad0ac94John McCall } 3806374c3307e2d73348f7b8cc73eeeb0998ad0ac94John McCall 3816374c3307e2d73348f7b8cc73eeeb0998ad0ac94John McCall bool initDwarfEHRegSizeTable(CodeGen::CodeGenFunction &CGF, 3826374c3307e2d73348f7b8cc73eeeb0998ad0ac94John McCall llvm::Value *Address) const; 38382d0a418c8699fc6f4a9417457ffe93d43bba1c1Anton Korobeynikov}; 38482d0a418c8699fc6f4a9417457ffe93d43bba1c1Anton Korobeynikov 38582d0a418c8699fc6f4a9417457ffe93d43bba1c1Anton Korobeynikov} 386c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 387c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov/// shouldReturnTypeInRegister - Determine if the given type should be 388c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov/// passed in a register (for the Darwin ABI). 389c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikovbool X86_32ABIInfo::shouldReturnTypeInRegister(QualType Ty, 390c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov ASTContext &Context) { 391c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov uint64_t Size = Context.getTypeSize(Ty); 392c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 393c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // Type must be register sized. 394c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov if (!isRegisterSize(Size)) 395c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov return false; 396c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 397c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov if (Ty->isVectorType()) { 398c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // 64- and 128- bit vectors inside structures are not returned in 399c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // registers. 400c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov if (Size == 64 || Size == 128) 401c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov return false; 402c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 403c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov return true; 404c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov } 405c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 4067711523d948bbe635f690f5795ef7ea9a3289eb2Daniel Dunbar // If this is a builtin, pointer, enum, complex type, member pointer, or 4077711523d948bbe635f690f5795ef7ea9a3289eb2Daniel Dunbar // member function pointer it is ok. 408a1842d32a1964712e42078e9b389dce9258c6a8cDaniel Dunbar if (Ty->getAs<BuiltinType>() || Ty->hasPointerRepresentation() || 40955e59e139d9ebcaae16d710472e28edbcafac98aDaniel Dunbar Ty->isAnyComplexType() || Ty->isEnumeralType() || 4107711523d948bbe635f690f5795ef7ea9a3289eb2Daniel Dunbar Ty->isBlockPointerType() || Ty->isMemberPointerType()) 411c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov return true; 412c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 413c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // Arrays are treated like records. 414c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov if (const ConstantArrayType *AT = Context.getAsConstantArrayType(Ty)) 415c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov return shouldReturnTypeInRegister(AT->getElementType(), Context); 416c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 417c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // Otherwise, it must be a record type. 4186217b80b7a1379b74cced1c076338262c3c980b3Ted Kremenek const RecordType *RT = Ty->getAs<RecordType>(); 419c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov if (!RT) return false; 420c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 421a887423cf580e19b2d03e3a0499c065730c96b28Anders Carlsson // FIXME: Traverse bases here too. 422a887423cf580e19b2d03e3a0499c065730c96b28Anders Carlsson 423c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // Structure types are passed in register if all fields would be 424c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // passed in a register. 42517945a0f64fe03ff6ec0c2146005a87636e3ac12Argyrios Kyrtzidis for (RecordDecl::field_iterator i = RT->getDecl()->field_begin(), 42617945a0f64fe03ff6ec0c2146005a87636e3ac12Argyrios Kyrtzidis e = RT->getDecl()->field_end(); i != e; ++i) { 427c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov const FieldDecl *FD = *i; 428c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 429c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // Empty fields are ignored. 43098303b93ae335bbb4731f6f1f8164d3c70648346Daniel Dunbar if (isEmptyField(Context, FD, true)) 431c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov continue; 432c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 433c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // Check fields recursively. 434c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov if (!shouldReturnTypeInRegister(FD->getType(), Context)) 435c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov return false; 436c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov } 437c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 438c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov return true; 439c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov} 440c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 441a3c109bbf6e198f463fbe204da4d25b40dab65c4Chris LattnerABIArgInfo X86_32ABIInfo::classifyReturnType(QualType RetTy) const { 442a3c109bbf6e198f463fbe204da4d25b40dab65c4Chris Lattner if (RetTy->isVoidType()) 443c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov return ABIArgInfo::getIgnore(); 444a3c109bbf6e198f463fbe204da4d25b40dab65c4Chris Lattner 445a3c109bbf6e198f463fbe204da4d25b40dab65c4Chris Lattner if (const VectorType *VT = RetTy->getAs<VectorType>()) { 446c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // On Darwin, some vectors are returned in registers. 4471e4249c10606f706aac181e6f5e8435ea99d9603David Chisnall if (IsDarwinVectorABI) { 448a3c109bbf6e198f463fbe204da4d25b40dab65c4Chris Lattner uint64_t Size = getContext().getTypeSize(RetTy); 449c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 450c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // 128-bit vectors are a special case; they are returned in 451c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // registers and we need to make sure to pick a type the LLVM 452c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // backend will like. 453c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov if (Size == 128) 4540032b2781b4deb131f8c9b7968f2030bf2489cddOwen Anderson return ABIArgInfo::getCoerce(llvm::VectorType::get( 455a3c109bbf6e198f463fbe204da4d25b40dab65c4Chris Lattner llvm::Type::getInt64Ty(getVMContext()), 2)); 456c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 457c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // Always return in register if it fits in a general purpose 458c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // register, or if it is 64 bits and has a single element. 459c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov if ((Size == 8 || Size == 16 || Size == 32) || 460c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov (Size == 64 && VT->getNumElements() == 1)) 461a3c109bbf6e198f463fbe204da4d25b40dab65c4Chris Lattner return ABIArgInfo::getCoerce(llvm::IntegerType::get(getVMContext(), 462a3c109bbf6e198f463fbe204da4d25b40dab65c4Chris Lattner Size)); 463c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 464c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov return ABIArgInfo::getIndirect(0); 465c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov } 466c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 467c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov return ABIArgInfo::getDirect(); 468a3c109bbf6e198f463fbe204da4d25b40dab65c4Chris Lattner } 469a3c109bbf6e198f463fbe204da4d25b40dab65c4Chris Lattner 470a3c109bbf6e198f463fbe204da4d25b40dab65c4Chris Lattner if (CodeGenFunction::hasAggregateLLVMType(RetTy)) { 471a887423cf580e19b2d03e3a0499c065730c96b28Anders Carlsson if (const RecordType *RT = RetTy->getAs<RecordType>()) { 47240092972b591646b47037d2b46b695a4014df413Anders Carlsson // Structures with either a non-trivial destructor or a non-trivial 47340092972b591646b47037d2b46b695a4014df413Anders Carlsson // copy constructor are always indirect. 47440092972b591646b47037d2b46b695a4014df413Anders Carlsson if (hasNonTrivialDestructorOrCopyConstructor(RT)) 47540092972b591646b47037d2b46b695a4014df413Anders Carlsson return ABIArgInfo::getIndirect(0, /*ByVal=*/false); 47640092972b591646b47037d2b46b695a4014df413Anders Carlsson 47740092972b591646b47037d2b46b695a4014df413Anders Carlsson // Structures with flexible arrays are always indirect. 478c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov if (RT->getDecl()->hasFlexibleArrayMember()) 479c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov return ABIArgInfo::getIndirect(0); 48040092972b591646b47037d2b46b695a4014df413Anders Carlsson } 48140092972b591646b47037d2b46b695a4014df413Anders Carlsson 4821e4249c10606f706aac181e6f5e8435ea99d9603David Chisnall // If specified, structs and unions are always indirect. 4831e4249c10606f706aac181e6f5e8435ea99d9603David Chisnall if (!IsSmallStructInRegABI && !RetTy->isAnyComplexType()) 484c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov return ABIArgInfo::getIndirect(0); 485c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 486c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // Classify "single element" structs as their element type. 487a3c109bbf6e198f463fbe204da4d25b40dab65c4Chris Lattner if (const Type *SeltTy = isSingleElementStruct(RetTy, getContext())) { 488183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall if (const BuiltinType *BT = SeltTy->getAs<BuiltinType>()) { 489c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov if (BT->isIntegerType()) { 490c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // We need to use the size of the structure, padding 491c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // bit-fields can adjust that to be larger than the single 492c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // element type. 493a3c109bbf6e198f463fbe204da4d25b40dab65c4Chris Lattner uint64_t Size = getContext().getTypeSize(RetTy); 494a1cf15f4680e5cf39e72e28c5ea854fcba792e84Owen Anderson return ABIArgInfo::getCoerce( 495a3c109bbf6e198f463fbe204da4d25b40dab65c4Chris Lattner llvm::IntegerType::get(getVMContext(), (unsigned)Size)); 496a3c109bbf6e198f463fbe204da4d25b40dab65c4Chris Lattner } 497a3c109bbf6e198f463fbe204da4d25b40dab65c4Chris Lattner 498a3c109bbf6e198f463fbe204da4d25b40dab65c4Chris Lattner if (BT->getKind() == BuiltinType::Float) { 499a3c109bbf6e198f463fbe204da4d25b40dab65c4Chris Lattner assert(getContext().getTypeSize(RetTy) == 500a3c109bbf6e198f463fbe204da4d25b40dab65c4Chris Lattner getContext().getTypeSize(SeltTy) && 501c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov "Unexpect single element structure size!"); 502a3c109bbf6e198f463fbe204da4d25b40dab65c4Chris Lattner return ABIArgInfo::getCoerce(llvm::Type::getFloatTy(getVMContext())); 503a3c109bbf6e198f463fbe204da4d25b40dab65c4Chris Lattner } 504a3c109bbf6e198f463fbe204da4d25b40dab65c4Chris Lattner 505a3c109bbf6e198f463fbe204da4d25b40dab65c4Chris Lattner if (BT->getKind() == BuiltinType::Double) { 506a3c109bbf6e198f463fbe204da4d25b40dab65c4Chris Lattner assert(getContext().getTypeSize(RetTy) == 507a3c109bbf6e198f463fbe204da4d25b40dab65c4Chris Lattner getContext().getTypeSize(SeltTy) && 508c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov "Unexpect single element structure size!"); 509a3c109bbf6e198f463fbe204da4d25b40dab65c4Chris Lattner return ABIArgInfo::getCoerce(llvm::Type::getDoubleTy(getVMContext())); 510c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov } 511c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov } else if (SeltTy->isPointerType()) { 512c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // FIXME: It would be really nice if this could come out as the proper 513c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // pointer type. 514a3c109bbf6e198f463fbe204da4d25b40dab65c4Chris Lattner const llvm::Type *PtrTy = llvm::Type::getInt8PtrTy(getVMContext()); 515c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov return ABIArgInfo::getCoerce(PtrTy); 516c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov } else if (SeltTy->isVectorType()) { 517c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // 64- and 128-bit vectors are never returned in a 518c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // register when inside a structure. 519a3c109bbf6e198f463fbe204da4d25b40dab65c4Chris Lattner uint64_t Size = getContext().getTypeSize(RetTy); 520c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov if (Size == 64 || Size == 128) 521c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov return ABIArgInfo::getIndirect(0); 522c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 523a3c109bbf6e198f463fbe204da4d25b40dab65c4Chris Lattner return classifyReturnType(QualType(SeltTy, 0)); 524c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov } 525c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov } 526c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 527c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // Small structures which are register sized are generally returned 528c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // in a register. 529a3c109bbf6e198f463fbe204da4d25b40dab65c4Chris Lattner if (X86_32ABIInfo::shouldReturnTypeInRegister(RetTy, getContext())) { 530a3c109bbf6e198f463fbe204da4d25b40dab65c4Chris Lattner uint64_t Size = getContext().getTypeSize(RetTy); 531a3c109bbf6e198f463fbe204da4d25b40dab65c4Chris Lattner return ABIArgInfo::getCoerce(llvm::IntegerType::get(getVMContext(),Size)); 532c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov } 533c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 534c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov return ABIArgInfo::getIndirect(0); 535c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov } 536a3c109bbf6e198f463fbe204da4d25b40dab65c4Chris Lattner 537a3c109bbf6e198f463fbe204da4d25b40dab65c4Chris Lattner // Treat an enum type as its underlying type. 538a3c109bbf6e198f463fbe204da4d25b40dab65c4Chris Lattner if (const EnumType *EnumTy = RetTy->getAs<EnumType>()) 539a3c109bbf6e198f463fbe204da4d25b40dab65c4Chris Lattner RetTy = EnumTy->getDecl()->getIntegerType(); 540a3c109bbf6e198f463fbe204da4d25b40dab65c4Chris Lattner 541a3c109bbf6e198f463fbe204da4d25b40dab65c4Chris Lattner return (RetTy->isPromotableIntegerType() ? 542a3c109bbf6e198f463fbe204da4d25b40dab65c4Chris Lattner ABIArgInfo::getExtend() : ABIArgInfo::getDirect()); 543c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov} 544c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 545a3c109bbf6e198f463fbe204da4d25b40dab65c4Chris LattnerABIArgInfo X86_32ABIInfo::getIndirectResult(QualType Ty, bool ByVal) const { 54646c54fb8ec45765a475b7b709b9aee7f94c490c2Daniel Dunbar if (!ByVal) 54746c54fb8ec45765a475b7b709b9aee7f94c490c2Daniel Dunbar return ABIArgInfo::getIndirect(0, false); 54846c54fb8ec45765a475b7b709b9aee7f94c490c2Daniel Dunbar 54946c54fb8ec45765a475b7b709b9aee7f94c490c2Daniel Dunbar // Compute the byval alignment. We trust the back-end to honor the 55046c54fb8ec45765a475b7b709b9aee7f94c490c2Daniel Dunbar // minimum ABI alignment for byval, to make cleaner IR. 55146c54fb8ec45765a475b7b709b9aee7f94c490c2Daniel Dunbar const unsigned MinABIAlign = 4; 552a3c109bbf6e198f463fbe204da4d25b40dab65c4Chris Lattner unsigned Align = getContext().getTypeAlign(Ty) / 8; 55346c54fb8ec45765a475b7b709b9aee7f94c490c2Daniel Dunbar if (Align > MinABIAlign) 55446c54fb8ec45765a475b7b709b9aee7f94c490c2Daniel Dunbar return ABIArgInfo::getIndirect(Align); 55546c54fb8ec45765a475b7b709b9aee7f94c490c2Daniel Dunbar return ABIArgInfo::getIndirect(0); 556dc6d574155072bfb35a7a29b94ef3afa0d40fb5aDaniel Dunbar} 557dc6d574155072bfb35a7a29b94ef3afa0d40fb5aDaniel Dunbar 558a3c109bbf6e198f463fbe204da4d25b40dab65c4Chris LattnerABIArgInfo X86_32ABIInfo::classifyArgumentType(QualType Ty) const { 559c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // FIXME: Set alignment on indirect arguments. 560c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov if (CodeGenFunction::hasAggregateLLVMType(Ty)) { 561c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // Structures with flexible arrays are always indirect. 562a887423cf580e19b2d03e3a0499c065730c96b28Anders Carlsson if (const RecordType *RT = Ty->getAs<RecordType>()) { 563a887423cf580e19b2d03e3a0499c065730c96b28Anders Carlsson // Structures with either a non-trivial destructor or a non-trivial 564a887423cf580e19b2d03e3a0499c065730c96b28Anders Carlsson // copy constructor are always indirect. 565a887423cf580e19b2d03e3a0499c065730c96b28Anders Carlsson if (hasNonTrivialDestructorOrCopyConstructor(RT)) 566a3c109bbf6e198f463fbe204da4d25b40dab65c4Chris Lattner return getIndirectResult(Ty, /*ByVal=*/false); 567dc6d574155072bfb35a7a29b94ef3afa0d40fb5aDaniel Dunbar 568c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov if (RT->getDecl()->hasFlexibleArrayMember()) 569a3c109bbf6e198f463fbe204da4d25b40dab65c4Chris Lattner return getIndirectResult(Ty); 570a887423cf580e19b2d03e3a0499c065730c96b28Anders Carlsson } 571c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 572c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // Ignore empty structs. 573a3c109bbf6e198f463fbe204da4d25b40dab65c4Chris Lattner if (Ty->isStructureType() && getContext().getTypeSize(Ty) == 0) 574c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov return ABIArgInfo::getIgnore(); 575c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 57653012f447145bfd5e3a759f069a2bdf2b6705708Daniel Dunbar // Expand small (<= 128-bit) record types when we know that the stack layout 57753012f447145bfd5e3a759f069a2bdf2b6705708Daniel Dunbar // of those arguments will match the struct. This is important because the 57853012f447145bfd5e3a759f069a2bdf2b6705708Daniel Dunbar // LLVM backend isn't smart enough to remove byval, which inhibits many 57953012f447145bfd5e3a759f069a2bdf2b6705708Daniel Dunbar // optimizations. 580a3c109bbf6e198f463fbe204da4d25b40dab65c4Chris Lattner if (getContext().getTypeSize(Ty) <= 4*32 && 581a3c109bbf6e198f463fbe204da4d25b40dab65c4Chris Lattner canExpandIndirectArgument(Ty, getContext())) 58253012f447145bfd5e3a759f069a2bdf2b6705708Daniel Dunbar return ABIArgInfo::getExpand(); 583c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 584a3c109bbf6e198f463fbe204da4d25b40dab65c4Chris Lattner return getIndirectResult(Ty); 585a3c109bbf6e198f463fbe204da4d25b40dab65c4Chris Lattner } 586a3c109bbf6e198f463fbe204da4d25b40dab65c4Chris Lattner 587a3c109bbf6e198f463fbe204da4d25b40dab65c4Chris Lattner if (const EnumType *EnumTy = Ty->getAs<EnumType>()) 588a3c109bbf6e198f463fbe204da4d25b40dab65c4Chris Lattner Ty = EnumTy->getDecl()->getIntegerType(); 589aa74a1e49f7c4b89539830290f76fe2c3e97187fDouglas Gregor 590a3c109bbf6e198f463fbe204da4d25b40dab65c4Chris Lattner return (Ty->isPromotableIntegerType() ? 591a3c109bbf6e198f463fbe204da4d25b40dab65c4Chris Lattner ABIArgInfo::getExtend() : ABIArgInfo::getDirect()); 592c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov} 593c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 594c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikovllvm::Value *X86_32ABIInfo::EmitVAArg(llvm::Value *VAListAddr, QualType Ty, 595c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov CodeGenFunction &CGF) const { 5963c0ef8cc0dc246bd3083e8cdd63005e8873d36d2Benjamin Kramer const llvm::Type *BP = llvm::Type::getInt8PtrTy(CGF.getLLVMContext()); 59796e0fc726c6fe7538522c60743705d5e696b40afOwen Anderson const llvm::Type *BPP = llvm::PointerType::getUnqual(BP); 598c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 599c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov CGBuilderTy &Builder = CGF.Builder; 600c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov llvm::Value *VAListAddrAsBPP = Builder.CreateBitCast(VAListAddr, BPP, 601c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov "ap"); 602c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov llvm::Value *Addr = Builder.CreateLoad(VAListAddrAsBPP, "ap.cur"); 603c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov llvm::Type *PTy = 60496e0fc726c6fe7538522c60743705d5e696b40afOwen Anderson llvm::PointerType::getUnqual(CGF.ConvertType(Ty)); 605c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov llvm::Value *AddrTyped = Builder.CreateBitCast(Addr, PTy); 606c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 607c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov uint64_t Offset = 608c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov llvm::RoundUpToAlignment(CGF.getContext().getTypeSize(Ty) / 8, 4); 609c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov llvm::Value *NextAddr = 61077b89b87c3b9220fea1bc80f6d6598d2003cc8a8Chris Lattner Builder.CreateGEP(Addr, llvm::ConstantInt::get(CGF.Int32Ty, Offset), 611c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov "ap.next"); 612c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov Builder.CreateStore(NextAddr, VAListAddrAsBPP); 613c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 614c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov return AddrTyped; 615c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov} 616c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 61774f7293eb30bf77355c20a3c2cad7b67d8ce7388Charles Davisvoid X86_32TargetCodeGenInfo::SetTargetAttributes(const Decl *D, 61874f7293eb30bf77355c20a3c2cad7b67d8ce7388Charles Davis llvm::GlobalValue *GV, 61974f7293eb30bf77355c20a3c2cad7b67d8ce7388Charles Davis CodeGen::CodeGenModule &CGM) const { 62074f7293eb30bf77355c20a3c2cad7b67d8ce7388Charles Davis if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(D)) { 62174f7293eb30bf77355c20a3c2cad7b67d8ce7388Charles Davis if (FD->hasAttr<X86ForceAlignArgPointerAttr>()) { 62274f7293eb30bf77355c20a3c2cad7b67d8ce7388Charles Davis // Get the LLVM function. 62374f7293eb30bf77355c20a3c2cad7b67d8ce7388Charles Davis llvm::Function *Fn = cast<llvm::Function>(GV); 62474f7293eb30bf77355c20a3c2cad7b67d8ce7388Charles Davis 62574f7293eb30bf77355c20a3c2cad7b67d8ce7388Charles Davis // Now add the 'alignstack' attribute with a value of 16. 62674f7293eb30bf77355c20a3c2cad7b67d8ce7388Charles Davis Fn->addFnAttr(llvm::Attribute::constructStackAlignmentFromInt(16)); 62774f7293eb30bf77355c20a3c2cad7b67d8ce7388Charles Davis } 62874f7293eb30bf77355c20a3c2cad7b67d8ce7388Charles Davis } 62974f7293eb30bf77355c20a3c2cad7b67d8ce7388Charles Davis} 63074f7293eb30bf77355c20a3c2cad7b67d8ce7388Charles Davis 6316374c3307e2d73348f7b8cc73eeeb0998ad0ac94John McCallbool X86_32TargetCodeGenInfo::initDwarfEHRegSizeTable( 6326374c3307e2d73348f7b8cc73eeeb0998ad0ac94John McCall CodeGen::CodeGenFunction &CGF, 6336374c3307e2d73348f7b8cc73eeeb0998ad0ac94John McCall llvm::Value *Address) const { 6346374c3307e2d73348f7b8cc73eeeb0998ad0ac94John McCall CodeGen::CGBuilderTy &Builder = CGF.Builder; 6356374c3307e2d73348f7b8cc73eeeb0998ad0ac94John McCall llvm::LLVMContext &Context = CGF.getLLVMContext(); 6366374c3307e2d73348f7b8cc73eeeb0998ad0ac94John McCall 6376374c3307e2d73348f7b8cc73eeeb0998ad0ac94John McCall const llvm::IntegerType *i8 = llvm::Type::getInt8Ty(Context); 6386374c3307e2d73348f7b8cc73eeeb0998ad0ac94John McCall llvm::Value *Four8 = llvm::ConstantInt::get(i8, 4); 6396374c3307e2d73348f7b8cc73eeeb0998ad0ac94John McCall 6406374c3307e2d73348f7b8cc73eeeb0998ad0ac94John McCall // 0-7 are the eight integer registers; the order is different 6416374c3307e2d73348f7b8cc73eeeb0998ad0ac94John McCall // on Darwin (for EH), but the range is the same. 6426374c3307e2d73348f7b8cc73eeeb0998ad0ac94John McCall // 8 is %eip. 643aeeb7011a875d3dd439e9fa07dc3ac54d97785b9John McCall AssignToArrayRange(Builder, Address, Four8, 0, 8); 6446374c3307e2d73348f7b8cc73eeeb0998ad0ac94John McCall 6456374c3307e2d73348f7b8cc73eeeb0998ad0ac94John McCall if (CGF.CGM.isTargetDarwin()) { 6466374c3307e2d73348f7b8cc73eeeb0998ad0ac94John McCall // 12-16 are st(0..4). Not sure why we stop at 4. 6476374c3307e2d73348f7b8cc73eeeb0998ad0ac94John McCall // These have size 16, which is sizeof(long double) on 6486374c3307e2d73348f7b8cc73eeeb0998ad0ac94John McCall // platforms with 8-byte alignment for that type. 6496374c3307e2d73348f7b8cc73eeeb0998ad0ac94John McCall llvm::Value *Sixteen8 = llvm::ConstantInt::get(i8, 16); 650aeeb7011a875d3dd439e9fa07dc3ac54d97785b9John McCall AssignToArrayRange(Builder, Address, Sixteen8, 12, 16); 6516374c3307e2d73348f7b8cc73eeeb0998ad0ac94John McCall 6526374c3307e2d73348f7b8cc73eeeb0998ad0ac94John McCall } else { 6536374c3307e2d73348f7b8cc73eeeb0998ad0ac94John McCall // 9 is %eflags, which doesn't get a size on Darwin for some 6546374c3307e2d73348f7b8cc73eeeb0998ad0ac94John McCall // reason. 6556374c3307e2d73348f7b8cc73eeeb0998ad0ac94John McCall Builder.CreateStore(Four8, Builder.CreateConstInBoundsGEP1_32(Address, 9)); 6566374c3307e2d73348f7b8cc73eeeb0998ad0ac94John McCall 6576374c3307e2d73348f7b8cc73eeeb0998ad0ac94John McCall // 11-16 are st(0..5). Not sure why we stop at 5. 6586374c3307e2d73348f7b8cc73eeeb0998ad0ac94John McCall // These have size 12, which is sizeof(long double) on 6596374c3307e2d73348f7b8cc73eeeb0998ad0ac94John McCall // platforms with 4-byte alignment for that type. 6606374c3307e2d73348f7b8cc73eeeb0998ad0ac94John McCall llvm::Value *Twelve8 = llvm::ConstantInt::get(i8, 12); 661aeeb7011a875d3dd439e9fa07dc3ac54d97785b9John McCall AssignToArrayRange(Builder, Address, Twelve8, 11, 16); 662aeeb7011a875d3dd439e9fa07dc3ac54d97785b9John McCall } 6636374c3307e2d73348f7b8cc73eeeb0998ad0ac94John McCall 6646374c3307e2d73348f7b8cc73eeeb0998ad0ac94John McCall return false; 6656374c3307e2d73348f7b8cc73eeeb0998ad0ac94John McCall} 6666374c3307e2d73348f7b8cc73eeeb0998ad0ac94John McCall 667dce5ad0cf70ba74e1ecdbb5e81f1a81d97821636Chris Lattner//===----------------------------------------------------------------------===// 668dce5ad0cf70ba74e1ecdbb5e81f1a81d97821636Chris Lattner// X86-64 ABI Implementation 669dce5ad0cf70ba74e1ecdbb5e81f1a81d97821636Chris Lattner//===----------------------------------------------------------------------===// 670dce5ad0cf70ba74e1ecdbb5e81f1a81d97821636Chris Lattner 671dce5ad0cf70ba74e1ecdbb5e81f1a81d97821636Chris Lattner 672c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikovnamespace { 673c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov/// X86_64ABIInfo - The X86_64 ABI information. 674c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikovclass X86_64ABIInfo : public ABIInfo { 675c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov enum Class { 676c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov Integer = 0, 677c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov SSE, 678c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov SSEUp, 679c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov X87, 680c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov X87Up, 681c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov ComplexX87, 682c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov NoClass, 683c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov Memory 684c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov }; 685c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 686c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov /// merge - Implement the X86_64 ABI merging algorithm. 687c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov /// 688c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov /// Merge an accumulating classification \arg Accum with a field 689c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov /// classification \arg Field. 690c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov /// 691c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov /// \param Accum - The accumulating classification. This should 692c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov /// always be either NoClass or the result of a previous merge 693c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov /// call. In addition, this should never be Memory (the caller 694c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov /// should just return Memory for the aggregate). 6951090a9ba0902380dbd97d0a500daa4c373712df9Chris Lattner static Class merge(Class Accum, Class Field); 696c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 697c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov /// classify - Determine the x86_64 register classes in which the 698c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov /// given type T should be passed. 699c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov /// 700c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov /// \param Lo - The classification for the parts of the type 701c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov /// residing in the low word of the containing object. 702c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov /// 703c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov /// \param Hi - The classification for the parts of the type 704c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov /// residing in the high word of the containing object. 705c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov /// 706c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov /// \param OffsetBase - The bit offset of this type in the 707c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov /// containing object. Some parameters are classified different 708c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov /// depending on whether they straddle an eightbyte boundary. 709c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov /// 710c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov /// If a word is unused its result will be NoClass; if a type should 711c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov /// be passed in Memory then at least the classification of \arg Lo 712c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov /// will be Memory. 713c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov /// 714c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov /// The \arg Lo class will be NoClass iff the argument is ignored. 715c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov /// 716c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov /// If the \arg Lo class is ComplexX87, then the \arg Hi class will 717c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov /// also be ComplexX87. 7189c254f0415bef9a0bafe5b5026ddb54b727597b1Chris Lattner void classify(QualType T, uint64_t OffsetBase, Class &Lo, Class &Hi) const; 719c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 7200f408f5242522cbede304472e17931357c1b573dChris Lattner const llvm::Type *Get16ByteVectorType(QualType Ty) const; 7210f408f5242522cbede304472e17931357c1b573dChris Lattner 7225868ca2eb7f00d815f62e46f5a171eb6e5f91b5bChris Lattner const llvm::Type *Get8ByteTypeAtOffset(const llvm::Type *IRType, 7235868ca2eb7f00d815f62e46f5a171eb6e5f91b5bChris Lattner unsigned IROffset, QualType SourceTy, 72444f0fd2804e9952a8dbf85bb60ee3501aa9f5ee7Chris Lattner unsigned SourceOffset) const; 72544f0fd2804e9952a8dbf85bb60ee3501aa9f5ee7Chris Lattner 726c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov /// getCoerceResult - Given a source type \arg Ty and an LLVM type 727c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov /// to coerce to, chose the best way to pass Ty in the same place 728c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov /// that \arg CoerceTo would be passed, but while keeping the 729c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov /// emitted code as simple as possible. 730c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov /// 731c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov /// FIXME: Note, this should be cleaned up to just take an enumeration of all 732c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov /// the ways we might want to pass things, instead of constructing an LLVM 733c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov /// type. This makes this code more explicit, and it makes it clearer that we 734c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov /// are also doing this for correctness in the case of passing scalar types. 735c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov ABIArgInfo getCoerceResult(QualType Ty, 7369c254f0415bef9a0bafe5b5026ddb54b727597b1Chris Lattner const llvm::Type *CoerceTo) const; 737c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 738c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov /// getIndirectResult - Give a source type \arg Ty, return a suitable result 73946c54fb8ec45765a475b7b709b9aee7f94c490c2Daniel Dunbar /// such that the argument will be returned in memory. 7409c254f0415bef9a0bafe5b5026ddb54b727597b1Chris Lattner ABIArgInfo getIndirectReturnResult(QualType Ty) const; 74146c54fb8ec45765a475b7b709b9aee7f94c490c2Daniel Dunbar 74246c54fb8ec45765a475b7b709b9aee7f94c490c2Daniel Dunbar /// getIndirectResult - Give a source type \arg Ty, return a suitable result 743c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov /// such that the argument will be passed in memory. 7449c254f0415bef9a0bafe5b5026ddb54b727597b1Chris Lattner ABIArgInfo getIndirectResult(QualType Ty) const; 745c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 746a3c109bbf6e198f463fbe204da4d25b40dab65c4Chris Lattner ABIArgInfo classifyReturnType(QualType RetTy) const; 747c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 7485868ca2eb7f00d815f62e46f5a171eb6e5f91b5bChris Lattner ABIArgInfo classifyArgumentType(QualType Ty, unsigned &neededInt, 7495868ca2eb7f00d815f62e46f5a171eb6e5f91b5bChris Lattner unsigned &neededSSE) const; 750c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 751c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikovpublic: 752ea0443212e7ec6ff82e2f174e8e948a6eb0e0876Chris Lattner X86_64ABIInfo(CodeGen::CodeGenTypes &CGT) : ABIInfo(CGT) {} 7539c254f0415bef9a0bafe5b5026ddb54b727597b1Chris Lattner 754ee5dcd064a811edc90f6c1fb31a837b6c961fed7Chris Lattner virtual void computeInfo(CGFunctionInfo &FI) const; 755c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 756c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov virtual llvm::Value *EmitVAArg(llvm::Value *VAListAddr, QualType Ty, 757c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov CodeGenFunction &CGF) const; 758c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov}; 75982d0a418c8699fc6f4a9417457ffe93d43bba1c1Anton Korobeynikov 76082d0a418c8699fc6f4a9417457ffe93d43bba1c1Anton Korobeynikovclass X86_64TargetCodeGenInfo : public TargetCodeGenInfo { 76182d0a418c8699fc6f4a9417457ffe93d43bba1c1Anton Korobeynikovpublic: 762ea0443212e7ec6ff82e2f174e8e948a6eb0e0876Chris Lattner X86_64TargetCodeGenInfo(CodeGen::CodeGenTypes &CGT) 763ea0443212e7ec6ff82e2f174e8e948a6eb0e0876Chris Lattner : TargetCodeGenInfo(new X86_64ABIInfo(CGT)) {} 7646374c3307e2d73348f7b8cc73eeeb0998ad0ac94John McCall 7656374c3307e2d73348f7b8cc73eeeb0998ad0ac94John McCall int getDwarfEHStackPointer(CodeGen::CodeGenModule &CGM) const { 7666374c3307e2d73348f7b8cc73eeeb0998ad0ac94John McCall return 7; 7676374c3307e2d73348f7b8cc73eeeb0998ad0ac94John McCall } 7686374c3307e2d73348f7b8cc73eeeb0998ad0ac94John McCall 7696374c3307e2d73348f7b8cc73eeeb0998ad0ac94John McCall bool initDwarfEHRegSizeTable(CodeGen::CodeGenFunction &CGF, 7706374c3307e2d73348f7b8cc73eeeb0998ad0ac94John McCall llvm::Value *Address) const { 7716374c3307e2d73348f7b8cc73eeeb0998ad0ac94John McCall CodeGen::CGBuilderTy &Builder = CGF.Builder; 7726374c3307e2d73348f7b8cc73eeeb0998ad0ac94John McCall llvm::LLVMContext &Context = CGF.getLLVMContext(); 7736374c3307e2d73348f7b8cc73eeeb0998ad0ac94John McCall 7746374c3307e2d73348f7b8cc73eeeb0998ad0ac94John McCall const llvm::IntegerType *i8 = llvm::Type::getInt8Ty(Context); 7756374c3307e2d73348f7b8cc73eeeb0998ad0ac94John McCall llvm::Value *Eight8 = llvm::ConstantInt::get(i8, 8); 7766374c3307e2d73348f7b8cc73eeeb0998ad0ac94John McCall 777aeeb7011a875d3dd439e9fa07dc3ac54d97785b9John McCall // 0-15 are the 16 integer registers. 778aeeb7011a875d3dd439e9fa07dc3ac54d97785b9John McCall // 16 is %rip. 779aeeb7011a875d3dd439e9fa07dc3ac54d97785b9John McCall AssignToArrayRange(Builder, Address, Eight8, 0, 16); 7806374c3307e2d73348f7b8cc73eeeb0998ad0ac94John McCall 7816374c3307e2d73348f7b8cc73eeeb0998ad0ac94John McCall return false; 7826374c3307e2d73348f7b8cc73eeeb0998ad0ac94John McCall } 78382d0a418c8699fc6f4a9417457ffe93d43bba1c1Anton Korobeynikov}; 78482d0a418c8699fc6f4a9417457ffe93d43bba1c1Anton Korobeynikov 785c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov} 786c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 7871090a9ba0902380dbd97d0a500daa4c373712df9Chris LattnerX86_64ABIInfo::Class X86_64ABIInfo::merge(Class Accum, Class Field) { 788c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // AMD64-ABI 3.2.3p2: Rule 4. Each field of an object is 789c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // classified recursively so that always two fields are 790c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // considered. The resulting class is calculated according to 791c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // the classes of the fields in the eightbyte: 792c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // 793c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // (a) If both classes are equal, this is the resulting class. 794c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // 795c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // (b) If one of the classes is NO_CLASS, the resulting class is 796c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // the other class. 797c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // 798c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // (c) If one of the classes is MEMORY, the result is the MEMORY 799c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // class. 800c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // 801c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // (d) If one of the classes is INTEGER, the result is the 802c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // INTEGER. 803c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // 804c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // (e) If one of the classes is X87, X87UP, COMPLEX_X87 class, 805c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // MEMORY is used as class. 806c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // 807c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // (f) Otherwise class SSE is used. 808c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 809c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // Accum should never be memory (we should have returned) or 810c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // ComplexX87 (because this cannot be passed in a structure). 811c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov assert((Accum != Memory && Accum != ComplexX87) && 812c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov "Invalid accumulated classification during merge."); 813c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov if (Accum == Field || Field == NoClass) 814c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov return Accum; 8151090a9ba0902380dbd97d0a500daa4c373712df9Chris Lattner if (Field == Memory) 816c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov return Memory; 8171090a9ba0902380dbd97d0a500daa4c373712df9Chris Lattner if (Accum == NoClass) 818c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov return Field; 8191090a9ba0902380dbd97d0a500daa4c373712df9Chris Lattner if (Accum == Integer || Field == Integer) 820c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov return Integer; 8211090a9ba0902380dbd97d0a500daa4c373712df9Chris Lattner if (Field == X87 || Field == X87Up || Field == ComplexX87 || 8221090a9ba0902380dbd97d0a500daa4c373712df9Chris Lattner Accum == X87 || Accum == X87Up) 823c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov return Memory; 8241090a9ba0902380dbd97d0a500daa4c373712df9Chris Lattner return SSE; 825c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov} 826c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 827bcaedaed309ce453a992fdeef4a4c908cc7d9dfbChris Lattnervoid X86_64ABIInfo::classify(QualType Ty, uint64_t OffsetBase, 828c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov Class &Lo, Class &Hi) const { 829c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // FIXME: This code can be simplified by introducing a simple value class for 830c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // Class pairs with appropriate constructor methods for the various 831c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // situations. 832c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 833c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // FIXME: Some of the split computations are wrong; unaligned vectors 834c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // shouldn't be passed in registers for example, so there is no chance they 835c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // can straddle an eightbyte. Verify & simplify. 836c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 837c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov Lo = Hi = NoClass; 838c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 839c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov Class &Current = OffsetBase < 64 ? Lo : Hi; 840c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov Current = Memory; 841c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 842183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall if (const BuiltinType *BT = Ty->getAs<BuiltinType>()) { 843c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov BuiltinType::Kind k = BT->getKind(); 844c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 845c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov if (k == BuiltinType::Void) { 846c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov Current = NoClass; 847c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov } else if (k == BuiltinType::Int128 || k == BuiltinType::UInt128) { 848c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov Lo = Integer; 849c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov Hi = Integer; 850c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov } else if (k >= BuiltinType::Bool && k <= BuiltinType::LongLong) { 851c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov Current = Integer; 852c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov } else if (k == BuiltinType::Float || k == BuiltinType::Double) { 853c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov Current = SSE; 854c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov } else if (k == BuiltinType::LongDouble) { 855c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov Lo = X87; 856c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov Hi = X87Up; 857c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov } 858c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // FIXME: _Decimal32 and _Decimal64 are SSE. 859c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // FIXME: _float128 and _Decimal128 are (SSE, SSEUp). 8601090a9ba0902380dbd97d0a500daa4c373712df9Chris Lattner return; 8611090a9ba0902380dbd97d0a500daa4c373712df9Chris Lattner } 8621090a9ba0902380dbd97d0a500daa4c373712df9Chris Lattner 8631090a9ba0902380dbd97d0a500daa4c373712df9Chris Lattner if (const EnumType *ET = Ty->getAs<EnumType>()) { 864c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // Classify the underlying integer type. 8659c254f0415bef9a0bafe5b5026ddb54b727597b1Chris Lattner classify(ET->getDecl()->getIntegerType(), OffsetBase, Lo, Hi); 8661090a9ba0902380dbd97d0a500daa4c373712df9Chris Lattner return; 8671090a9ba0902380dbd97d0a500daa4c373712df9Chris Lattner } 8681090a9ba0902380dbd97d0a500daa4c373712df9Chris Lattner 8691090a9ba0902380dbd97d0a500daa4c373712df9Chris Lattner if (Ty->hasPointerRepresentation()) { 870c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov Current = Integer; 8711090a9ba0902380dbd97d0a500daa4c373712df9Chris Lattner return; 8721090a9ba0902380dbd97d0a500daa4c373712df9Chris Lattner } 8731090a9ba0902380dbd97d0a500daa4c373712df9Chris Lattner 8741090a9ba0902380dbd97d0a500daa4c373712df9Chris Lattner if (Ty->isMemberPointerType()) { 87567d438d39a1cc37c372a2684dc354f58d0169bb1Daniel Dunbar if (Ty->isMemberFunctionPointerType()) 87667d438d39a1cc37c372a2684dc354f58d0169bb1Daniel Dunbar Lo = Hi = Integer; 87767d438d39a1cc37c372a2684dc354f58d0169bb1Daniel Dunbar else 87867d438d39a1cc37c372a2684dc354f58d0169bb1Daniel Dunbar Current = Integer; 8791090a9ba0902380dbd97d0a500daa4c373712df9Chris Lattner return; 8801090a9ba0902380dbd97d0a500daa4c373712df9Chris Lattner } 8811090a9ba0902380dbd97d0a500daa4c373712df9Chris Lattner 8821090a9ba0902380dbd97d0a500daa4c373712df9Chris Lattner if (const VectorType *VT = Ty->getAs<VectorType>()) { 883ea0443212e7ec6ff82e2f174e8e948a6eb0e0876Chris Lattner uint64_t Size = getContext().getTypeSize(VT); 884c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov if (Size == 32) { 885c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // gcc passes all <4 x char>, <2 x short>, <1 x int>, <1 x 886c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // float> as integer. 887c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov Current = Integer; 888c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 889c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // If this type crosses an eightbyte boundary, it should be 890c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // split. 891c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov uint64_t EB_Real = (OffsetBase) / 64; 892c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov uint64_t EB_Imag = (OffsetBase + Size - 1) / 64; 893c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov if (EB_Real != EB_Imag) 894c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov Hi = Lo; 895c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov } else if (Size == 64) { 896c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // gcc passes <1 x double> in memory. :( 897c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov if (VT->getElementType()->isSpecificBuiltinType(BuiltinType::Double)) 898c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov return; 899c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 900c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // gcc passes <1 x long long> as INTEGER. 901c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov if (VT->getElementType()->isSpecificBuiltinType(BuiltinType::LongLong)) 902c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov Current = Integer; 903c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov else 904c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov Current = SSE; 905c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 906c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // If this type crosses an eightbyte boundary, it should be 907c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // split. 908c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov if (OffsetBase && OffsetBase != 64) 909c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov Hi = Lo; 910c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov } else if (Size == 128) { 911c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov Lo = SSE; 912c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov Hi = SSEUp; 913c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov } 9141090a9ba0902380dbd97d0a500daa4c373712df9Chris Lattner return; 9151090a9ba0902380dbd97d0a500daa4c373712df9Chris Lattner } 9161090a9ba0902380dbd97d0a500daa4c373712df9Chris Lattner 9171090a9ba0902380dbd97d0a500daa4c373712df9Chris Lattner if (const ComplexType *CT = Ty->getAs<ComplexType>()) { 918ea0443212e7ec6ff82e2f174e8e948a6eb0e0876Chris Lattner QualType ET = getContext().getCanonicalType(CT->getElementType()); 919c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 920ea0443212e7ec6ff82e2f174e8e948a6eb0e0876Chris Lattner uint64_t Size = getContext().getTypeSize(Ty); 9212ade35e2cfd554e49d35a52047cea98a82787af9Douglas Gregor if (ET->isIntegralOrEnumerationType()) { 922c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov if (Size <= 64) 923c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov Current = Integer; 924c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov else if (Size <= 128) 925c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov Lo = Hi = Integer; 926ea0443212e7ec6ff82e2f174e8e948a6eb0e0876Chris Lattner } else if (ET == getContext().FloatTy) 927c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov Current = SSE; 928ea0443212e7ec6ff82e2f174e8e948a6eb0e0876Chris Lattner else if (ET == getContext().DoubleTy) 929c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov Lo = Hi = SSE; 930ea0443212e7ec6ff82e2f174e8e948a6eb0e0876Chris Lattner else if (ET == getContext().LongDoubleTy) 931c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov Current = ComplexX87; 932c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 933c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // If this complex type crosses an eightbyte boundary then it 934c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // should be split. 935c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov uint64_t EB_Real = (OffsetBase) / 64; 936ea0443212e7ec6ff82e2f174e8e948a6eb0e0876Chris Lattner uint64_t EB_Imag = (OffsetBase + getContext().getTypeSize(ET)) / 64; 937c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov if (Hi == NoClass && EB_Real != EB_Imag) 938c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov Hi = Lo; 9391090a9ba0902380dbd97d0a500daa4c373712df9Chris Lattner 9401090a9ba0902380dbd97d0a500daa4c373712df9Chris Lattner return; 9411090a9ba0902380dbd97d0a500daa4c373712df9Chris Lattner } 9421090a9ba0902380dbd97d0a500daa4c373712df9Chris Lattner 943ea0443212e7ec6ff82e2f174e8e948a6eb0e0876Chris Lattner if (const ConstantArrayType *AT = getContext().getAsConstantArrayType(Ty)) { 944c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // Arrays are treated like structures. 945c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 946ea0443212e7ec6ff82e2f174e8e948a6eb0e0876Chris Lattner uint64_t Size = getContext().getTypeSize(Ty); 947c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 948c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // AMD64-ABI 3.2.3p2: Rule 1. If the size of an object is larger 949c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // than two eightbytes, ..., it has class MEMORY. 950c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov if (Size > 128) 951c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov return; 952c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 953c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // AMD64-ABI 3.2.3p2: Rule 1. If ..., or it contains unaligned 954c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // fields, it has class MEMORY. 955c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // 956c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // Only need to check alignment of array base. 957ea0443212e7ec6ff82e2f174e8e948a6eb0e0876Chris Lattner if (OffsetBase % getContext().getTypeAlign(AT->getElementType())) 958c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov return; 959c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 960c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // Otherwise implement simplified merge. We could be smarter about 961c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // this, but it isn't worth it and would be harder to verify. 962c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov Current = NoClass; 963ea0443212e7ec6ff82e2f174e8e948a6eb0e0876Chris Lattner uint64_t EltSize = getContext().getTypeSize(AT->getElementType()); 964c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov uint64_t ArraySize = AT->getSize().getZExtValue(); 965c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov for (uint64_t i=0, Offset=OffsetBase; i<ArraySize; ++i, Offset += EltSize) { 966c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov Class FieldLo, FieldHi; 9679c254f0415bef9a0bafe5b5026ddb54b727597b1Chris Lattner classify(AT->getElementType(), Offset, FieldLo, FieldHi); 968c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov Lo = merge(Lo, FieldLo); 969c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov Hi = merge(Hi, FieldHi); 970c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov if (Lo == Memory || Hi == Memory) 971c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov break; 972c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov } 973c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 974c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // Do post merger cleanup (see below). Only case we worry about is Memory. 975c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov if (Hi == Memory) 976c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov Lo = Memory; 977c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov assert((Hi != SSEUp || Lo == SSE) && "Invalid SSEUp array classification."); 9781090a9ba0902380dbd97d0a500daa4c373712df9Chris Lattner return; 9791090a9ba0902380dbd97d0a500daa4c373712df9Chris Lattner } 9801090a9ba0902380dbd97d0a500daa4c373712df9Chris Lattner 9811090a9ba0902380dbd97d0a500daa4c373712df9Chris Lattner if (const RecordType *RT = Ty->getAs<RecordType>()) { 982ea0443212e7ec6ff82e2f174e8e948a6eb0e0876Chris Lattner uint64_t Size = getContext().getTypeSize(Ty); 983c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 984c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // AMD64-ABI 3.2.3p2: Rule 1. If the size of an object is larger 985c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // than two eightbytes, ..., it has class MEMORY. 986c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov if (Size > 128) 987c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov return; 988c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 9890a8f847e97f40cce51dc69051b964732333dc028Anders Carlsson // AMD64-ABI 3.2.3p2: Rule 2. If a C++ object has either a non-trivial 9900a8f847e97f40cce51dc69051b964732333dc028Anders Carlsson // copy constructor or a non-trivial destructor, it is passed by invisible 9910a8f847e97f40cce51dc69051b964732333dc028Anders Carlsson // reference. 9920a8f847e97f40cce51dc69051b964732333dc028Anders Carlsson if (hasNonTrivialDestructorOrCopyConstructor(RT)) 9930a8f847e97f40cce51dc69051b964732333dc028Anders Carlsson return; 994ce9f423d2ce4b8699d9f6c7623053f645ac4dc6dDaniel Dunbar 995c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov const RecordDecl *RD = RT->getDecl(); 996c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 997c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // Assume variable sized types are passed in memory. 998c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov if (RD->hasFlexibleArrayMember()) 999c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov return; 1000c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 1001ea0443212e7ec6ff82e2f174e8e948a6eb0e0876Chris Lattner const ASTRecordLayout &Layout = getContext().getASTRecordLayout(RD); 1002c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 1003c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // Reset Lo class, this will be recomputed. 1004c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov Current = NoClass; 1005ce9f423d2ce4b8699d9f6c7623053f645ac4dc6dDaniel Dunbar 1006ce9f423d2ce4b8699d9f6c7623053f645ac4dc6dDaniel Dunbar // If this is a C++ record, classify the bases first. 1007ce9f423d2ce4b8699d9f6c7623053f645ac4dc6dDaniel Dunbar if (const CXXRecordDecl *CXXRD = dyn_cast<CXXRecordDecl>(RD)) { 1008ce9f423d2ce4b8699d9f6c7623053f645ac4dc6dDaniel Dunbar for (CXXRecordDecl::base_class_const_iterator i = CXXRD->bases_begin(), 1009ce9f423d2ce4b8699d9f6c7623053f645ac4dc6dDaniel Dunbar e = CXXRD->bases_end(); i != e; ++i) { 1010ce9f423d2ce4b8699d9f6c7623053f645ac4dc6dDaniel Dunbar assert(!i->isVirtual() && !i->getType()->isDependentType() && 1011ce9f423d2ce4b8699d9f6c7623053f645ac4dc6dDaniel Dunbar "Unexpected base class!"); 1012ce9f423d2ce4b8699d9f6c7623053f645ac4dc6dDaniel Dunbar const CXXRecordDecl *Base = 1013ce9f423d2ce4b8699d9f6c7623053f645ac4dc6dDaniel Dunbar cast<CXXRecordDecl>(i->getType()->getAs<RecordType>()->getDecl()); 1014ce9f423d2ce4b8699d9f6c7623053f645ac4dc6dDaniel Dunbar 1015ce9f423d2ce4b8699d9f6c7623053f645ac4dc6dDaniel Dunbar // Classify this field. 1016ce9f423d2ce4b8699d9f6c7623053f645ac4dc6dDaniel Dunbar // 1017ce9f423d2ce4b8699d9f6c7623053f645ac4dc6dDaniel Dunbar // AMD64-ABI 3.2.3p2: Rule 3. If the size of the aggregate exceeds a 1018ce9f423d2ce4b8699d9f6c7623053f645ac4dc6dDaniel Dunbar // single eightbyte, each is classified separately. Each eightbyte gets 1019ce9f423d2ce4b8699d9f6c7623053f645ac4dc6dDaniel Dunbar // initialized to class NO_CLASS. 1020ce9f423d2ce4b8699d9f6c7623053f645ac4dc6dDaniel Dunbar Class FieldLo, FieldHi; 1021ce9f423d2ce4b8699d9f6c7623053f645ac4dc6dDaniel Dunbar uint64_t Offset = OffsetBase + Layout.getBaseClassOffset(Base); 10229c254f0415bef9a0bafe5b5026ddb54b727597b1Chris Lattner classify(i->getType(), Offset, FieldLo, FieldHi); 1023ce9f423d2ce4b8699d9f6c7623053f645ac4dc6dDaniel Dunbar Lo = merge(Lo, FieldLo); 1024ce9f423d2ce4b8699d9f6c7623053f645ac4dc6dDaniel Dunbar Hi = merge(Hi, FieldHi); 1025ce9f423d2ce4b8699d9f6c7623053f645ac4dc6dDaniel Dunbar if (Lo == Memory || Hi == Memory) 1026ce9f423d2ce4b8699d9f6c7623053f645ac4dc6dDaniel Dunbar break; 1027ce9f423d2ce4b8699d9f6c7623053f645ac4dc6dDaniel Dunbar } 10284971ff8eea7800bd2a73652add6dcf7a4adf5f74Daniel Dunbar 10294971ff8eea7800bd2a73652add6dcf7a4adf5f74Daniel Dunbar // If this record has no fields but isn't empty, classify as INTEGER. 10304971ff8eea7800bd2a73652add6dcf7a4adf5f74Daniel Dunbar if (RD->field_empty() && Size) 10314971ff8eea7800bd2a73652add6dcf7a4adf5f74Daniel Dunbar Current = Integer; 1032ce9f423d2ce4b8699d9f6c7623053f645ac4dc6dDaniel Dunbar } 1033ce9f423d2ce4b8699d9f6c7623053f645ac4dc6dDaniel Dunbar 1034ce9f423d2ce4b8699d9f6c7623053f645ac4dc6dDaniel Dunbar // Classify the fields one at a time, merging the results. 1035c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov unsigned idx = 0; 103617945a0f64fe03ff6ec0c2146005a87636e3ac12Argyrios Kyrtzidis for (RecordDecl::field_iterator i = RD->field_begin(), e = RD->field_end(); 103717945a0f64fe03ff6ec0c2146005a87636e3ac12Argyrios Kyrtzidis i != e; ++i, ++idx) { 1038c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov uint64_t Offset = OffsetBase + Layout.getFieldOffset(idx); 1039c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov bool BitField = i->isBitField(); 1040c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 1041c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // AMD64-ABI 3.2.3p2: Rule 1. If ..., or it contains unaligned 1042c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // fields, it has class MEMORY. 1043c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // 1044c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // Note, skip this test for bit-fields, see below. 1045ea0443212e7ec6ff82e2f174e8e948a6eb0e0876Chris Lattner if (!BitField && Offset % getContext().getTypeAlign(i->getType())) { 1046c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov Lo = Memory; 1047c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov return; 1048c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov } 1049c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 1050c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // Classify this field. 1051c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // 1052c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // AMD64-ABI 3.2.3p2: Rule 3. If the size of the aggregate 1053c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // exceeds a single eightbyte, each is classified 1054c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // separately. Each eightbyte gets initialized to class 1055c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // NO_CLASS. 1056c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov Class FieldLo, FieldHi; 1057c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 1058c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // Bit-fields require special handling, they do not force the 1059c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // structure to be passed in memory even if unaligned, and 1060c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // therefore they can straddle an eightbyte. 1061c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov if (BitField) { 1062c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // Ignore padding bit-fields. 1063c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov if (i->isUnnamedBitfield()) 1064c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov continue; 1065c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 1066c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov uint64_t Offset = OffsetBase + Layout.getFieldOffset(idx); 1067ea0443212e7ec6ff82e2f174e8e948a6eb0e0876Chris Lattner uint64_t Size = 1068ea0443212e7ec6ff82e2f174e8e948a6eb0e0876Chris Lattner i->getBitWidth()->EvaluateAsInt(getContext()).getZExtValue(); 1069c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 1070c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov uint64_t EB_Lo = Offset / 64; 1071c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov uint64_t EB_Hi = (Offset + Size - 1) / 64; 1072c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov FieldLo = FieldHi = NoClass; 1073c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov if (EB_Lo) { 1074c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov assert(EB_Hi == EB_Lo && "Invalid classification, type > 16 bytes."); 1075c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov FieldLo = NoClass; 1076c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov FieldHi = Integer; 1077c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov } else { 1078c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov FieldLo = Integer; 1079c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov FieldHi = EB_Hi ? Integer : NoClass; 1080c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov } 1081c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov } else 10829c254f0415bef9a0bafe5b5026ddb54b727597b1Chris Lattner classify(i->getType(), Offset, FieldLo, FieldHi); 1083c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov Lo = merge(Lo, FieldLo); 1084c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov Hi = merge(Hi, FieldHi); 1085c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov if (Lo == Memory || Hi == Memory) 1086c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov break; 1087c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov } 1088c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 1089c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // AMD64-ABI 3.2.3p2: Rule 5. Then a post merger cleanup is done: 1090c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // 1091c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // (a) If one of the classes is MEMORY, the whole argument is 1092c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // passed in memory. 1093c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // 1094c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // (b) If SSEUP is not preceeded by SSE, it is converted to SSE. 1095c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 1096c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // The first of these conditions is guaranteed by how we implement 1097c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // the merge (just bail). 1098c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // 1099c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // The second condition occurs in the case of unions; for example 1100c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // union { _Complex double; unsigned; }. 1101c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov if (Hi == Memory) 1102c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov Lo = Memory; 1103c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov if (Hi == SSEUp && Lo != SSE) 1104c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov Hi = SSE; 1105c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov } 1106c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov} 1107c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 1108c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton KorobeynikovABIArgInfo X86_64ABIInfo::getCoerceResult(QualType Ty, 11099c254f0415bef9a0bafe5b5026ddb54b727597b1Chris Lattner const llvm::Type *CoerceTo) const { 11101daf808a48d26328dd31a3275ce599cee326c957Chris Lattner // If this is a pointer passed as a pointer, just pass it directly. 11111daf808a48d26328dd31a3275ce599cee326c957Chris Lattner if ((isa<llvm::PointerType>(CoerceTo) || CoerceTo->isIntegerTy(64)) && 11121daf808a48d26328dd31a3275ce599cee326c957Chris Lattner Ty->hasPointerRepresentation()) 11131daf808a48d26328dd31a3275ce599cee326c957Chris Lattner return ABIArgInfo::getExtend(); 11141daf808a48d26328dd31a3275ce599cee326c957Chris Lattner 11151daf808a48d26328dd31a3275ce599cee326c957Chris Lattner if (isa<llvm::IntegerType>(CoerceTo)) { 1116c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // Integer and pointer types will end up in a general purpose 1117c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // register. 1118aa74a1e49f7c4b89539830290f76fe2c3e97187fDouglas Gregor 1119aa74a1e49f7c4b89539830290f76fe2c3e97187fDouglas Gregor // Treat an enum type as its underlying type. 1120aa74a1e49f7c4b89539830290f76fe2c3e97187fDouglas Gregor if (const EnumType *EnumTy = Ty->getAs<EnumType>()) 1121aa74a1e49f7c4b89539830290f76fe2c3e97187fDouglas Gregor Ty = EnumTy->getDecl()->getIntegerType(); 1122aa74a1e49f7c4b89539830290f76fe2c3e97187fDouglas Gregor 11231daf808a48d26328dd31a3275ce599cee326c957Chris Lattner if (Ty->isIntegralOrEnumerationType()) 1124cc6fa88666ca2f287df4a600eb31a4087bab9c13Anton Korobeynikov return (Ty->isPromotableIntegerType() ? 1125cc6fa88666ca2f287df4a600eb31a4087bab9c13Anton Korobeynikov ABIArgInfo::getExtend() : ABIArgInfo::getDirect()); 11260b30c67132f00c667512a65cfe1fe81ae54c2383Chris Lattner 11277f215c12af4c3e7f81b24102a676aabfdb4e1566Chris Lattner } else if (CoerceTo->isDoubleTy()) { 11280b0ef0a70b8010c66fad2603e4423ef1c1dc7015John McCall assert(Ty.isCanonical() && "should always have a canonical type here"); 11290b0ef0a70b8010c66fad2603e4423ef1c1dc7015John McCall assert(!Ty.hasQualifiers() && "should never have a qualified type here"); 1130c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 1131c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // Float and double end up in a single SSE reg. 1132ea0443212e7ec6ff82e2f174e8e948a6eb0e0876Chris Lattner if (Ty == getContext().FloatTy || Ty == getContext().DoubleTy) 1133c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov return ABIArgInfo::getDirect(); 1134c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 1135faf23b72f171ef997d48c453a5a4783c5759f8feChris Lattner // If this is a 32-bit structure that is passed as a double, then it will be 1136faf23b72f171ef997d48c453a5a4783c5759f8feChris Lattner // passed in the low 32-bits of the XMM register, which is the same as how a 1137faf23b72f171ef997d48c453a5a4783c5759f8feChris Lattner // float is passed. Coerce to a float instead of a double. 1138ea0443212e7ec6ff82e2f174e8e948a6eb0e0876Chris Lattner if (getContext().getTypeSizeInChars(Ty).getQuantity() == 4) 1139faf23b72f171ef997d48c453a5a4783c5759f8feChris Lattner CoerceTo = llvm::Type::getFloatTy(CoerceTo->getContext()); 1140c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov } 1141c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 1142c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov return ABIArgInfo::getCoerce(CoerceTo); 1143c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov} 1144c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 11459c254f0415bef9a0bafe5b5026ddb54b727597b1Chris LattnerABIArgInfo X86_64ABIInfo::getIndirectReturnResult(QualType Ty) const { 114646c54fb8ec45765a475b7b709b9aee7f94c490c2Daniel Dunbar // If this is a scalar LLVM value then assume LLVM will pass it in the right 114746c54fb8ec45765a475b7b709b9aee7f94c490c2Daniel Dunbar // place naturally. 114846c54fb8ec45765a475b7b709b9aee7f94c490c2Daniel Dunbar if (!CodeGenFunction::hasAggregateLLVMType(Ty)) { 114946c54fb8ec45765a475b7b709b9aee7f94c490c2Daniel Dunbar // Treat an enum type as its underlying type. 115046c54fb8ec45765a475b7b709b9aee7f94c490c2Daniel Dunbar if (const EnumType *EnumTy = Ty->getAs<EnumType>()) 115146c54fb8ec45765a475b7b709b9aee7f94c490c2Daniel Dunbar Ty = EnumTy->getDecl()->getIntegerType(); 115246c54fb8ec45765a475b7b709b9aee7f94c490c2Daniel Dunbar 115346c54fb8ec45765a475b7b709b9aee7f94c490c2Daniel Dunbar return (Ty->isPromotableIntegerType() ? 115446c54fb8ec45765a475b7b709b9aee7f94c490c2Daniel Dunbar ABIArgInfo::getExtend() : ABIArgInfo::getDirect()); 115546c54fb8ec45765a475b7b709b9aee7f94c490c2Daniel Dunbar } 115646c54fb8ec45765a475b7b709b9aee7f94c490c2Daniel Dunbar 115746c54fb8ec45765a475b7b709b9aee7f94c490c2Daniel Dunbar return ABIArgInfo::getIndirect(0); 115846c54fb8ec45765a475b7b709b9aee7f94c490c2Daniel Dunbar} 115946c54fb8ec45765a475b7b709b9aee7f94c490c2Daniel Dunbar 11609c254f0415bef9a0bafe5b5026ddb54b727597b1Chris LattnerABIArgInfo X86_64ABIInfo::getIndirectResult(QualType Ty) const { 1161c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // If this is a scalar LLVM value then assume LLVM will pass it in the right 1162c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // place naturally. 1163aa74a1e49f7c4b89539830290f76fe2c3e97187fDouglas Gregor if (!CodeGenFunction::hasAggregateLLVMType(Ty)) { 1164aa74a1e49f7c4b89539830290f76fe2c3e97187fDouglas Gregor // Treat an enum type as its underlying type. 1165aa74a1e49f7c4b89539830290f76fe2c3e97187fDouglas Gregor if (const EnumType *EnumTy = Ty->getAs<EnumType>()) 1166aa74a1e49f7c4b89539830290f76fe2c3e97187fDouglas Gregor Ty = EnumTy->getDecl()->getIntegerType(); 1167aa74a1e49f7c4b89539830290f76fe2c3e97187fDouglas Gregor 1168cc6fa88666ca2f287df4a600eb31a4087bab9c13Anton Korobeynikov return (Ty->isPromotableIntegerType() ? 1169cc6fa88666ca2f287df4a600eb31a4087bab9c13Anton Korobeynikov ABIArgInfo::getExtend() : ABIArgInfo::getDirect()); 1170aa74a1e49f7c4b89539830290f76fe2c3e97187fDouglas Gregor } 1171c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 117246c54fb8ec45765a475b7b709b9aee7f94c490c2Daniel Dunbar if (isRecordWithNonTrivialDestructorOrCopyConstructor(Ty)) 117346c54fb8ec45765a475b7b709b9aee7f94c490c2Daniel Dunbar return ABIArgInfo::getIndirect(0, /*ByVal=*/false); 11740a8f847e97f40cce51dc69051b964732333dc028Anders Carlsson 117546c54fb8ec45765a475b7b709b9aee7f94c490c2Daniel Dunbar // Compute the byval alignment. We trust the back-end to honor the 117646c54fb8ec45765a475b7b709b9aee7f94c490c2Daniel Dunbar // minimum ABI alignment for byval, to make cleaner IR. 117746c54fb8ec45765a475b7b709b9aee7f94c490c2Daniel Dunbar const unsigned MinABIAlign = 8; 1178ea0443212e7ec6ff82e2f174e8e948a6eb0e0876Chris Lattner unsigned Align = getContext().getTypeAlign(Ty) / 8; 117946c54fb8ec45765a475b7b709b9aee7f94c490c2Daniel Dunbar if (Align > MinABIAlign) 118046c54fb8ec45765a475b7b709b9aee7f94c490c2Daniel Dunbar return ABIArgInfo::getIndirect(Align); 118146c54fb8ec45765a475b7b709b9aee7f94c490c2Daniel Dunbar return ABIArgInfo::getIndirect(0); 1182c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov} 1183c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 11840f408f5242522cbede304472e17931357c1b573dChris Lattner/// Get16ByteVectorType - The ABI specifies that a value should be passed in an 11850f408f5242522cbede304472e17931357c1b573dChris Lattner/// full vector XMM register. Pick an LLVM IR type that will be passed as a 11860f408f5242522cbede304472e17931357c1b573dChris Lattner/// vector register. 11870f408f5242522cbede304472e17931357c1b573dChris Lattnerconst llvm::Type *X86_64ABIInfo::Get16ByteVectorType(QualType Ty) const { 118815842bd05bd6d3b7450385ac8f73aaee5f807e19Chris Lattner const llvm::Type *IRType = CGT.ConvertTypeRecursive(Ty); 118915842bd05bd6d3b7450385ac8f73aaee5f807e19Chris Lattner 119015842bd05bd6d3b7450385ac8f73aaee5f807e19Chris Lattner // Wrapper structs that just contain vectors are passed just like vectors, 119115842bd05bd6d3b7450385ac8f73aaee5f807e19Chris Lattner // strip them off if present. 119215842bd05bd6d3b7450385ac8f73aaee5f807e19Chris Lattner const llvm::StructType *STy = dyn_cast<llvm::StructType>(IRType); 119315842bd05bd6d3b7450385ac8f73aaee5f807e19Chris Lattner while (STy && STy->getNumElements() == 1) { 119415842bd05bd6d3b7450385ac8f73aaee5f807e19Chris Lattner IRType = STy->getElementType(0); 119515842bd05bd6d3b7450385ac8f73aaee5f807e19Chris Lattner STy = dyn_cast<llvm::StructType>(IRType); 119615842bd05bd6d3b7450385ac8f73aaee5f807e19Chris Lattner } 119715842bd05bd6d3b7450385ac8f73aaee5f807e19Chris Lattner 119815842bd05bd6d3b7450385ac8f73aaee5f807e19Chris Lattner 119915842bd05bd6d3b7450385ac8f73aaee5f807e19Chris Lattner 12000f408f5242522cbede304472e17931357c1b573dChris Lattner // If the preferred type is a 16-byte vector, prefer to pass it. 120115842bd05bd6d3b7450385ac8f73aaee5f807e19Chris Lattner if (const llvm::VectorType *VT = dyn_cast<llvm::VectorType>(IRType)){ 12020f408f5242522cbede304472e17931357c1b573dChris Lattner const llvm::Type *EltTy = VT->getElementType(); 12030f408f5242522cbede304472e17931357c1b573dChris Lattner if (VT->getBitWidth() == 128 && 12040f408f5242522cbede304472e17931357c1b573dChris Lattner (EltTy->isFloatTy() || EltTy->isDoubleTy() || 12050f408f5242522cbede304472e17931357c1b573dChris Lattner EltTy->isIntegerTy(8) || EltTy->isIntegerTy(16) || 12060f408f5242522cbede304472e17931357c1b573dChris Lattner EltTy->isIntegerTy(32) || EltTy->isIntegerTy(64) || 12070f408f5242522cbede304472e17931357c1b573dChris Lattner EltTy->isIntegerTy(128))) 12080f408f5242522cbede304472e17931357c1b573dChris Lattner return VT; 12090f408f5242522cbede304472e17931357c1b573dChris Lattner } 12100f408f5242522cbede304472e17931357c1b573dChris Lattner 12110f408f5242522cbede304472e17931357c1b573dChris Lattner return llvm::VectorType::get(llvm::Type::getDoubleTy(getVMContext()), 2); 12120f408f5242522cbede304472e17931357c1b573dChris Lattner} 12130f408f5242522cbede304472e17931357c1b573dChris Lattner 12140f408f5242522cbede304472e17931357c1b573dChris Lattner 1215519f68cd26777c755763a644a7f7ed7ac389beb9Chris Lattner/// Get8ByteTypeAtOffset - The ABI specifies that a value should be passed in an 1216519f68cd26777c755763a644a7f7ed7ac389beb9Chris Lattner/// 8-byte GPR. This means that we either have a scalar or we are talking about 1217519f68cd26777c755763a644a7f7ed7ac389beb9Chris Lattner/// the high or low part of an up-to-16-byte struct. This routine picks the 1218519f68cd26777c755763a644a7f7ed7ac389beb9Chris Lattner/// best LLVM IR type to represent this, which may be i64 or may be anything 1219519f68cd26777c755763a644a7f7ed7ac389beb9Chris Lattner/// else that the backend will pass in a GPR that works better (e.g. i8, %foo*, 1220519f68cd26777c755763a644a7f7ed7ac389beb9Chris Lattner/// etc). 1221519f68cd26777c755763a644a7f7ed7ac389beb9Chris Lattner/// 1222519f68cd26777c755763a644a7f7ed7ac389beb9Chris Lattner/// PrefType is an LLVM IR type that corresponds to (part of) the IR type for 1223519f68cd26777c755763a644a7f7ed7ac389beb9Chris Lattner/// the source type. IROffset is an offset in bytes into the LLVM IR type that 1224519f68cd26777c755763a644a7f7ed7ac389beb9Chris Lattner/// the 8-byte value references. PrefType may be null. 1225519f68cd26777c755763a644a7f7ed7ac389beb9Chris Lattner/// 1226519f68cd26777c755763a644a7f7ed7ac389beb9Chris Lattner/// SourceTy is the source level type for the entire argument. SourceOffset is 1227519f68cd26777c755763a644a7f7ed7ac389beb9Chris Lattner/// an offset into this that we're processing (which is always either 0 or 8). 1228519f68cd26777c755763a644a7f7ed7ac389beb9Chris Lattner/// 122944f0fd2804e9952a8dbf85bb60ee3501aa9f5ee7Chris Lattnerconst llvm::Type *X86_64ABIInfo:: 12305868ca2eb7f00d815f62e46f5a171eb6e5f91b5bChris LattnerGet8ByteTypeAtOffset(const llvm::Type *IRType, unsigned IROffset, 123144f0fd2804e9952a8dbf85bb60ee3501aa9f5ee7Chris Lattner QualType SourceTy, unsigned SourceOffset) const { 1232519f68cd26777c755763a644a7f7ed7ac389beb9Chris Lattner // Pointers are always 8-bytes at offset 0. 1233fe12d1ee8be8b8023c0c60b299ae957ea0df5d21Chris Lattner if (IROffset == 0 && isa<llvm::PointerType>(IRType)) 12345868ca2eb7f00d815f62e46f5a171eb6e5f91b5bChris Lattner return IRType; 1235519f68cd26777c755763a644a7f7ed7ac389beb9Chris Lattner 1236519f68cd26777c755763a644a7f7ed7ac389beb9Chris Lattner // TODO: 1/2/4/8 byte integers are also interesting, but we have to know that 1237519f68cd26777c755763a644a7f7ed7ac389beb9Chris Lattner // the "hole" is not used in the containing struct (just undef padding). 1238519f68cd26777c755763a644a7f7ed7ac389beb9Chris Lattner 1239fe12d1ee8be8b8023c0c60b299ae957ea0df5d21Chris Lattner if (const llvm::StructType *STy = dyn_cast<llvm::StructType>(IRType)) { 1240519f68cd26777c755763a644a7f7ed7ac389beb9Chris Lattner // If this is a struct, recurse into the field at the specified offset. 124144f0fd2804e9952a8dbf85bb60ee3501aa9f5ee7Chris Lattner const llvm::StructLayout *SL = getTargetData().getStructLayout(STy); 1242519f68cd26777c755763a644a7f7ed7ac389beb9Chris Lattner if (IROffset < SL->getSizeInBytes()) { 1243519f68cd26777c755763a644a7f7ed7ac389beb9Chris Lattner unsigned FieldIdx = SL->getElementContainingOffset(IROffset); 1244519f68cd26777c755763a644a7f7ed7ac389beb9Chris Lattner IROffset -= SL->getElementOffset(FieldIdx); 1245519f68cd26777c755763a644a7f7ed7ac389beb9Chris Lattner 1246519f68cd26777c755763a644a7f7ed7ac389beb9Chris Lattner return Get8ByteTypeAtOffset(STy->getElementType(FieldIdx), IROffset, 124744f0fd2804e9952a8dbf85bb60ee3501aa9f5ee7Chris Lattner SourceTy, SourceOffset); 1248519f68cd26777c755763a644a7f7ed7ac389beb9Chris Lattner } 1249519f68cd26777c755763a644a7f7ed7ac389beb9Chris Lattner } 1250519f68cd26777c755763a644a7f7ed7ac389beb9Chris Lattner 1251519f68cd26777c755763a644a7f7ed7ac389beb9Chris Lattner // Okay, we don't have any better idea of what to pass, so we pass this in an 1252519f68cd26777c755763a644a7f7ed7ac389beb9Chris Lattner // integer register that isn't too big to fit the rest of the struct. 125344f0fd2804e9952a8dbf85bb60ee3501aa9f5ee7Chris Lattner uint64_t TySizeInBytes = 125444f0fd2804e9952a8dbf85bb60ee3501aa9f5ee7Chris Lattner getContext().getTypeSizeInChars(SourceTy).getQuantity(); 1255519f68cd26777c755763a644a7f7ed7ac389beb9Chris Lattner 1256519f68cd26777c755763a644a7f7ed7ac389beb9Chris Lattner // It is always safe to classify this as an integer type up to i64 that 1257519f68cd26777c755763a644a7f7ed7ac389beb9Chris Lattner // isn't larger than the structure. 1258519f68cd26777c755763a644a7f7ed7ac389beb9Chris Lattner switch (unsigned(TySizeInBytes-SourceOffset)) { 125944f0fd2804e9952a8dbf85bb60ee3501aa9f5ee7Chris Lattner case 1: return llvm::Type::getInt8Ty(getVMContext()); 126044f0fd2804e9952a8dbf85bb60ee3501aa9f5ee7Chris Lattner case 2: return llvm::Type::getInt16Ty(getVMContext()); 1261519f68cd26777c755763a644a7f7ed7ac389beb9Chris Lattner case 3: 126244f0fd2804e9952a8dbf85bb60ee3501aa9f5ee7Chris Lattner case 4: return llvm::Type::getInt32Ty(getVMContext()); 126344f0fd2804e9952a8dbf85bb60ee3501aa9f5ee7Chris Lattner default: return llvm::Type::getInt64Ty(getVMContext()); 1264519f68cd26777c755763a644a7f7ed7ac389beb9Chris Lattner } 1265519f68cd26777c755763a644a7f7ed7ac389beb9Chris Lattner} 1266519f68cd26777c755763a644a7f7ed7ac389beb9Chris Lattner 12671090a9ba0902380dbd97d0a500daa4c373712df9Chris LattnerABIArgInfo X86_64ABIInfo:: 1268a3c109bbf6e198f463fbe204da4d25b40dab65c4Chris LattnerclassifyReturnType(QualType RetTy) const { 1269c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // AMD64-ABI 3.2.3p4: Rule 1. Classify the return type with the 1270c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // classification algorithm. 1271c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov X86_64ABIInfo::Class Lo, Hi; 12729c254f0415bef9a0bafe5b5026ddb54b727597b1Chris Lattner classify(RetTy, 0, Lo, Hi); 1273c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 1274c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // Check some invariants. 1275c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov assert((Hi != Memory || Lo == Memory) && "Invalid memory classification."); 1276c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov assert((Lo != NoClass || Hi == NoClass) && "Invalid null classification."); 1277c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov assert((Hi != SSEUp || Lo == SSE) && "Invalid SSEUp classification."); 1278c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 1279c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov const llvm::Type *ResType = 0; 1280c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov switch (Lo) { 1281c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov case NoClass: 1282c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov return ABIArgInfo::getIgnore(); 1283c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 1284c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov case SSEUp: 1285c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov case X87Up: 1286c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov assert(0 && "Invalid classification for lo word."); 1287c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 1288c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // AMD64-ABI 3.2.3p4: Rule 2. Types of class memory are returned via 1289c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // hidden argument. 1290c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov case Memory: 12919c254f0415bef9a0bafe5b5026ddb54b727597b1Chris Lattner return getIndirectReturnResult(RetTy); 1292c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 1293c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // AMD64-ABI 3.2.3p4: Rule 3. If the class is INTEGER, the next 1294c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // available register of the sequence %rax, %rdx is used. 1295c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov case Integer: 1296fe12d1ee8be8b8023c0c60b299ae957ea0df5d21Chris Lattner ResType = Get8ByteTypeAtOffset(CGT.ConvertTypeRecursive(RetTy), 0, RetTy,0); 1297519f68cd26777c755763a644a7f7ed7ac389beb9Chris Lattner break; 1298c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 1299c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // AMD64-ABI 3.2.3p4: Rule 4. If the class is SSE, the next 1300c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // available SSE register of the sequence %xmm0, %xmm1 is used. 1301c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov case SSE: 1302ea0443212e7ec6ff82e2f174e8e948a6eb0e0876Chris Lattner ResType = llvm::Type::getDoubleTy(getVMContext()); 13030b30c67132f00c667512a65cfe1fe81ae54c2383Chris Lattner break; 1304c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 1305c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // AMD64-ABI 3.2.3p4: Rule 6. If the class is X87, the value is 1306c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // returned on the X87 stack in %st0 as 80-bit x87 number. 1307c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov case X87: 1308ea0443212e7ec6ff82e2f174e8e948a6eb0e0876Chris Lattner ResType = llvm::Type::getX86_FP80Ty(getVMContext()); 13090b30c67132f00c667512a65cfe1fe81ae54c2383Chris Lattner break; 1310c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 1311c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // AMD64-ABI 3.2.3p4: Rule 8. If the class is COMPLEX_X87, the real 1312c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // part of the value is returned in %st0 and the imaginary part in 1313c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // %st1. 1314c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov case ComplexX87: 1315c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov assert(Hi == ComplexX87 && "Unexpected ComplexX87 classification."); 1316a3c109bbf6e198f463fbe204da4d25b40dab65c4Chris Lattner ResType = llvm::StructType::get(getVMContext(), 1317ea0443212e7ec6ff82e2f174e8e948a6eb0e0876Chris Lattner llvm::Type::getX86_FP80Ty(getVMContext()), 1318ea0443212e7ec6ff82e2f174e8e948a6eb0e0876Chris Lattner llvm::Type::getX86_FP80Ty(getVMContext()), 1319c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov NULL); 1320c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov break; 1321c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov } 1322c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 1323c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov switch (Hi) { 1324c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // Memory was handled previously and X87 should 1325c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // never occur as a hi class. 1326c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov case Memory: 1327c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov case X87: 1328c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov assert(0 && "Invalid classification for hi word."); 1329c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 1330c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov case ComplexX87: // Previously handled. 13310b30c67132f00c667512a65cfe1fe81ae54c2383Chris Lattner case NoClass: 13320b30c67132f00c667512a65cfe1fe81ae54c2383Chris Lattner break; 1333c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 1334519f68cd26777c755763a644a7f7ed7ac389beb9Chris Lattner case Integer: { 1335fe12d1ee8be8b8023c0c60b299ae957ea0df5d21Chris Lattner const llvm::Type *HiType = 1336fe12d1ee8be8b8023c0c60b299ae957ea0df5d21Chris Lattner Get8ByteTypeAtOffset(CGT.ConvertTypeRecursive(RetTy), 8, RetTy, 8); 1337a3c109bbf6e198f463fbe204da4d25b40dab65c4Chris Lattner ResType = llvm::StructType::get(getVMContext(), ResType, HiType, NULL); 1338c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov break; 1339519f68cd26777c755763a644a7f7ed7ac389beb9Chris Lattner } 1340c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov case SSE: 1341a3c109bbf6e198f463fbe204da4d25b40dab65c4Chris Lattner ResType = llvm::StructType::get(getVMContext(), ResType, 1342a3c109bbf6e198f463fbe204da4d25b40dab65c4Chris Lattner llvm::Type::getDoubleTy(getVMContext()), 1343a3c109bbf6e198f463fbe204da4d25b40dab65c4Chris Lattner NULL); 1344c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov break; 1345c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 1346c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // AMD64-ABI 3.2.3p4: Rule 5. If the class is SSEUP, the eightbyte 1347c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // is passed in the upper half of the last used SSE register. 1348c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // 1349c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // SSEUP should always be preceeded by SSE, just widen. 1350c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov case SSEUp: 1351c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov assert(Lo == SSE && "Unexpected SSEUp classification."); 13520f408f5242522cbede304472e17931357c1b573dChris Lattner ResType = Get16ByteVectorType(RetTy); 1353c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov break; 1354c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 1355c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // AMD64-ABI 3.2.3p4: Rule 7. If the class is X87UP, the value is 1356c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // returned together with the previous X87 value in %st0. 1357c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov case X87Up: 1358c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // If X87Up is preceeded by X87, we don't need to do 1359c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // anything. However, in some cases with unions it may not be 1360c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // preceeded by X87. In such situations we follow gcc and pass the 1361c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // extra bits in an SSE reg. 1362c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov if (Lo != X87) 1363a3c109bbf6e198f463fbe204da4d25b40dab65c4Chris Lattner ResType = llvm::StructType::get(getVMContext(), ResType, 1364a3c109bbf6e198f463fbe204da4d25b40dab65c4Chris Lattner llvm::Type::getDoubleTy(getVMContext()), 1365a3c109bbf6e198f463fbe204da4d25b40dab65c4Chris Lattner NULL); 1366c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov break; 1367c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov } 1368c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 13699c254f0415bef9a0bafe5b5026ddb54b727597b1Chris Lattner return getCoerceResult(RetTy, ResType); 13709c254f0415bef9a0bafe5b5026ddb54b727597b1Chris Lattner} 13719c254f0415bef9a0bafe5b5026ddb54b727597b1Chris Lattner 1372a3c109bbf6e198f463fbe204da4d25b40dab65c4Chris LattnerABIArgInfo X86_64ABIInfo::classifyArgumentType(QualType Ty, unsigned &neededInt, 13735868ca2eb7f00d815f62e46f5a171eb6e5f91b5bChris Lattner unsigned &neededSSE) const { 1374c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov X86_64ABIInfo::Class Lo, Hi; 13759c254f0415bef9a0bafe5b5026ddb54b727597b1Chris Lattner classify(Ty, 0, Lo, Hi); 13765868ca2eb7f00d815f62e46f5a171eb6e5f91b5bChris Lattner 1377c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // Check some invariants. 1378c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // FIXME: Enforce these by construction. 1379c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov assert((Hi != Memory || Lo == Memory) && "Invalid memory classification."); 1380c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov assert((Lo != NoClass || Hi == NoClass) && "Invalid null classification."); 1381c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov assert((Hi != SSEUp || Lo == SSE) && "Invalid SSEUp classification."); 1382c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 1383c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov neededInt = 0; 1384c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov neededSSE = 0; 1385c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov const llvm::Type *ResType = 0; 1386c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov switch (Lo) { 1387c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov case NoClass: 1388c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov return ABIArgInfo::getIgnore(); 1389c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 1390c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // AMD64-ABI 3.2.3p3: Rule 1. If the class is MEMORY, pass the argument 1391c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // on the stack. 1392c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov case Memory: 1393c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 1394c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // AMD64-ABI 3.2.3p3: Rule 5. If the class is X87, X87UP or 1395c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // COMPLEX_X87, it is passed in memory. 1396c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov case X87: 1397c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov case ComplexX87: 13989c254f0415bef9a0bafe5b5026ddb54b727597b1Chris Lattner return getIndirectResult(Ty); 1399c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 1400c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov case SSEUp: 1401c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov case X87Up: 1402c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov assert(0 && "Invalid classification for lo word."); 1403c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 1404c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // AMD64-ABI 3.2.3p3: Rule 2. If the class is INTEGER, the next 1405c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // available register of the sequence %rdi, %rsi, %rdx, %rcx, %r8 1406c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // and %r9 is used. 1407c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov case Integer: 14089c254f0415bef9a0bafe5b5026ddb54b727597b1Chris Lattner ++neededInt; 14095868ca2eb7f00d815f62e46f5a171eb6e5f91b5bChris Lattner 141049382de42c2a411bfd772408e987cb399071241dChris Lattner // Pick an 8-byte type based on the preferred type. 1411fe12d1ee8be8b8023c0c60b299ae957ea0df5d21Chris Lattner ResType = Get8ByteTypeAtOffset(CGT.ConvertTypeRecursive(Ty), 0, Ty, 0); 1412c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov break; 1413c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 1414c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // AMD64-ABI 3.2.3p3: Rule 3. If the class is SSE, the next 1415c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // available SSE register is used, the registers are taken in the 1416c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // order from %xmm0 to %xmm7. 1417c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov case SSE: 1418c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov ++neededSSE; 1419a3c109bbf6e198f463fbe204da4d25b40dab65c4Chris Lattner ResType = llvm::Type::getDoubleTy(getVMContext()); 1420c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov break; 1421c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov } 1422c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 1423c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov switch (Hi) { 1424c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // Memory was handled previously, ComplexX87 and X87 should 1425c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // never occur as hi classes, and X87Up must be preceed by X87, 1426c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // which is passed in memory. 1427c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov case Memory: 1428c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov case X87: 1429c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov case ComplexX87: 1430c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov assert(0 && "Invalid classification for hi word."); 1431c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov break; 1432c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 1433c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov case NoClass: break; 14349c254f0415bef9a0bafe5b5026ddb54b727597b1Chris Lattner 14359c254f0415bef9a0bafe5b5026ddb54b727597b1Chris Lattner case Integer: { 1436c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov ++neededInt; 143749382de42c2a411bfd772408e987cb399071241dChris Lattner // Pick an 8-byte type based on the preferred type. 1438fe12d1ee8be8b8023c0c60b299ae957ea0df5d21Chris Lattner const llvm::Type *HiType = 1439fe12d1ee8be8b8023c0c60b299ae957ea0df5d21Chris Lattner Get8ByteTypeAtOffset(CGT.ConvertTypeRecursive(Ty), 8, Ty, 8); 1440a3c109bbf6e198f463fbe204da4d25b40dab65c4Chris Lattner ResType = llvm::StructType::get(getVMContext(), ResType, HiType, NULL); 1441c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov break; 14429c254f0415bef9a0bafe5b5026ddb54b727597b1Chris Lattner } 1443c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 1444c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // X87Up generally doesn't occur here (long double is passed in 1445c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // memory), except in situations involving unions. 1446c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov case X87Up: 1447c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov case SSE: 1448a3c109bbf6e198f463fbe204da4d25b40dab65c4Chris Lattner ResType = llvm::StructType::get(getVMContext(), ResType, 1449a3c109bbf6e198f463fbe204da4d25b40dab65c4Chris Lattner llvm::Type::getDoubleTy(getVMContext()), 1450a3c109bbf6e198f463fbe204da4d25b40dab65c4Chris Lattner NULL); 1451c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov ++neededSSE; 1452c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov break; 1453c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 1454c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // AMD64-ABI 3.2.3p3: Rule 4. If the class is SSEUP, the 1455c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // eightbyte is passed in the upper half of the last used SSE 1456ab5722e67794b3954c874a369086fc5f41ac46a5Chris Lattner // register. This only happens when 128-bit vectors are passed. 1457c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov case SSEUp: 1458ab5722e67794b3954c874a369086fc5f41ac46a5Chris Lattner assert(Lo == SSE && "Unexpected SSEUp classification"); 14590f408f5242522cbede304472e17931357c1b573dChris Lattner ResType = Get16ByteVectorType(Ty); 1460c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov break; 1461c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov } 1462c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 14639c254f0415bef9a0bafe5b5026ddb54b727597b1Chris Lattner return getCoerceResult(Ty, ResType); 1464c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov} 1465c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 1466ee5dcd064a811edc90f6c1fb31a837b6c961fed7Chris Lattnervoid X86_64ABIInfo::computeInfo(CGFunctionInfo &FI) const { 14675868ca2eb7f00d815f62e46f5a171eb6e5f91b5bChris Lattner 1468a3c109bbf6e198f463fbe204da4d25b40dab65c4Chris Lattner FI.getReturnInfo() = classifyReturnType(FI.getReturnType()); 1469c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 1470c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // Keep track of the number of assigned registers. 1471c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov unsigned freeIntRegs = 6, freeSSERegs = 8; 1472c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 1473c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // If the return value is indirect, then the hidden argument is consuming one 1474c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // integer register. 1475c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov if (FI.getReturnInfo().isIndirect()) 1476c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov --freeIntRegs; 1477c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 1478c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // AMD64-ABI 3.2.3p3: Once arguments are classified, the registers 1479c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // get assigned (in left-to-right order) for passing as follows... 1480c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov for (CGFunctionInfo::arg_iterator it = FI.arg_begin(), ie = FI.arg_end(); 1481c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov it != ie; ++it) { 1482c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov unsigned neededInt, neededSSE; 14835868ca2eb7f00d815f62e46f5a171eb6e5f91b5bChris Lattner it->info = classifyArgumentType(it->type, neededInt, neededSSE); 1484c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 1485c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // AMD64-ABI 3.2.3p3: If there are no registers available for any 1486c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // eightbyte of an argument, the whole argument is passed on the 1487c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // stack. If registers have already been assigned for some 1488c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // eightbytes of such an argument, the assignments get reverted. 1489c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov if (freeIntRegs >= neededInt && freeSSERegs >= neededSSE) { 1490c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov freeIntRegs -= neededInt; 1491c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov freeSSERegs -= neededSSE; 1492c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov } else { 14939c254f0415bef9a0bafe5b5026ddb54b727597b1Chris Lattner it->info = getIndirectResult(it->type); 1494c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov } 1495c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov } 1496c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov} 1497c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 1498c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikovstatic llvm::Value *EmitVAArgFromMemory(llvm::Value *VAListAddr, 1499c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov QualType Ty, 1500c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov CodeGenFunction &CGF) { 1501c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov llvm::Value *overflow_arg_area_p = 1502c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov CGF.Builder.CreateStructGEP(VAListAddr, 2, "overflow_arg_area_p"); 1503c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov llvm::Value *overflow_arg_area = 1504c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov CGF.Builder.CreateLoad(overflow_arg_area_p, "overflow_arg_area"); 1505c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 1506c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // AMD64-ABI 3.5.7p5: Step 7. Align l->overflow_arg_area upwards to a 16 1507c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // byte boundary if alignment needed by type exceeds 8 byte boundary. 1508c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov uint64_t Align = CGF.getContext().getTypeAlign(Ty) / 8; 1509c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov if (Align > 8) { 1510c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // Note that we follow the ABI & gcc here, even though the type 1511c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // could in theory have an alignment greater than 16. This case 1512c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // shouldn't ever matter in practice. 1513c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 1514c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // overflow_arg_area = (overflow_arg_area + 15) & ~15; 15150032b2781b4deb131f8c9b7968f2030bf2489cddOwen Anderson llvm::Value *Offset = 151677b89b87c3b9220fea1bc80f6d6598d2003cc8a8Chris Lattner llvm::ConstantInt::get(CGF.Int32Ty, 15); 1517c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov overflow_arg_area = CGF.Builder.CreateGEP(overflow_arg_area, Offset); 1518c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov llvm::Value *AsInt = CGF.Builder.CreatePtrToInt(overflow_arg_area, 151977b89b87c3b9220fea1bc80f6d6598d2003cc8a8Chris Lattner CGF.Int64Ty); 152077b89b87c3b9220fea1bc80f6d6598d2003cc8a8Chris Lattner llvm::Value *Mask = llvm::ConstantInt::get(CGF.Int64Ty, ~15LL); 1521c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov overflow_arg_area = 1522c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov CGF.Builder.CreateIntToPtr(CGF.Builder.CreateAnd(AsInt, Mask), 1523c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov overflow_arg_area->getType(), 1524c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov "overflow_arg_area.align"); 1525c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov } 1526c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 1527c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // AMD64-ABI 3.5.7p5: Step 8. Fetch type from l->overflow_arg_area. 1528c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov const llvm::Type *LTy = CGF.ConvertTypeForMem(Ty); 1529c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov llvm::Value *Res = 1530c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov CGF.Builder.CreateBitCast(overflow_arg_area, 153196e0fc726c6fe7538522c60743705d5e696b40afOwen Anderson llvm::PointerType::getUnqual(LTy)); 1532c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 1533c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // AMD64-ABI 3.5.7p5: Step 9. Set l->overflow_arg_area to: 1534c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // l->overflow_arg_area + sizeof(type). 1535c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // AMD64-ABI 3.5.7p5: Step 10. Align l->overflow_arg_area upwards to 1536c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // an 8 byte boundary. 1537c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 1538c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov uint64_t SizeInBytes = (CGF.getContext().getTypeSize(Ty) + 7) / 8; 15390032b2781b4deb131f8c9b7968f2030bf2489cddOwen Anderson llvm::Value *Offset = 154077b89b87c3b9220fea1bc80f6d6598d2003cc8a8Chris Lattner llvm::ConstantInt::get(CGF.Int32Ty, (SizeInBytes + 7) & ~7); 1541c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov overflow_arg_area = CGF.Builder.CreateGEP(overflow_arg_area, Offset, 1542c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov "overflow_arg_area.next"); 1543c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov CGF.Builder.CreateStore(overflow_arg_area, overflow_arg_area_p); 1544c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 1545c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // AMD64-ABI 3.5.7p5: Step 11. Return the fetched type. 1546c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov return Res; 1547c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov} 1548c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 1549c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikovllvm::Value *X86_64ABIInfo::EmitVAArg(llvm::Value *VAListAddr, QualType Ty, 1550c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov CodeGenFunction &CGF) const { 1551a1cf15f4680e5cf39e72e28c5ea854fcba792e84Owen Anderson llvm::LLVMContext &VMContext = CGF.getLLVMContext(); 15521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1553c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // Assume that va_list type is correct; should be pointer to LLVM type: 1554c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // struct { 1555c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // i32 gp_offset; 1556c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // i32 fp_offset; 1557c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // i8* overflow_arg_area; 1558c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // i8* reg_save_area; 1559c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // }; 1560c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov unsigned neededInt, neededSSE; 1561a14db75641f377ef8b033c67653cd95ac4c36fe3Chris Lattner 1562a14db75641f377ef8b033c67653cd95ac4c36fe3Chris Lattner Ty = CGF.getContext().getCanonicalType(Ty); 15635868ca2eb7f00d815f62e46f5a171eb6e5f91b5bChris Lattner ABIArgInfo AI = classifyArgumentType(Ty, neededInt, neededSSE); 1564c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 1565c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // AMD64-ABI 3.5.7p5: Step 1. Determine whether type may be passed 1566c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // in the registers. If not go to step 7. 1567c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov if (!neededInt && !neededSSE) 1568c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov return EmitVAArgFromMemory(VAListAddr, Ty, CGF); 1569c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 1570c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // AMD64-ABI 3.5.7p5: Step 2. Compute num_gp to hold the number of 1571c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // general purpose registers needed to pass type and num_fp to hold 1572c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // the number of floating point registers needed. 1573c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 1574c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // AMD64-ABI 3.5.7p5: Step 3. Verify whether arguments fit into 1575c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // registers. In the case: l->gp_offset > 48 - num_gp * 8 or 1576c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // l->fp_offset > 304 - num_fp * 16 go to step 7. 1577c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // 1578c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // NOTE: 304 is a typo, there are (6 * 8 + 8 * 16) = 176 bytes of 1579c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // register save space). 1580c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 1581c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov llvm::Value *InRegs = 0; 1582c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov llvm::Value *gp_offset_p = 0, *gp_offset = 0; 1583c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov llvm::Value *fp_offset_p = 0, *fp_offset = 0; 1584c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov if (neededInt) { 1585c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov gp_offset_p = CGF.Builder.CreateStructGEP(VAListAddr, 0, "gp_offset_p"); 1586c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov gp_offset = CGF.Builder.CreateLoad(gp_offset_p, "gp_offset"); 15871090a9ba0902380dbd97d0a500daa4c373712df9Chris Lattner InRegs = llvm::ConstantInt::get(CGF.Int32Ty, 48 - neededInt * 8); 15881090a9ba0902380dbd97d0a500daa4c373712df9Chris Lattner InRegs = CGF.Builder.CreateICmpULE(gp_offset, InRegs, "fits_in_gp"); 1589c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov } 1590c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 1591c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov if (neededSSE) { 1592c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov fp_offset_p = CGF.Builder.CreateStructGEP(VAListAddr, 1, "fp_offset_p"); 1593c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov fp_offset = CGF.Builder.CreateLoad(fp_offset_p, "fp_offset"); 1594c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov llvm::Value *FitsInFP = 15951090a9ba0902380dbd97d0a500daa4c373712df9Chris Lattner llvm::ConstantInt::get(CGF.Int32Ty, 176 - neededSSE * 16); 15961090a9ba0902380dbd97d0a500daa4c373712df9Chris Lattner FitsInFP = CGF.Builder.CreateICmpULE(fp_offset, FitsInFP, "fits_in_fp"); 1597c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov InRegs = InRegs ? CGF.Builder.CreateAnd(InRegs, FitsInFP) : FitsInFP; 1598c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov } 1599c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 1600c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov llvm::BasicBlock *InRegBlock = CGF.createBasicBlock("vaarg.in_reg"); 1601c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov llvm::BasicBlock *InMemBlock = CGF.createBasicBlock("vaarg.in_mem"); 1602c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov llvm::BasicBlock *ContBlock = CGF.createBasicBlock("vaarg.end"); 1603c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov CGF.Builder.CreateCondBr(InRegs, InRegBlock, InMemBlock); 1604c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 1605c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // Emit code to load the value if it was passed in registers. 1606c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 1607c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov CGF.EmitBlock(InRegBlock); 1608c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 1609c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // AMD64-ABI 3.5.7p5: Step 4. Fetch type from l->reg_save_area with 1610c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // an offset of l->gp_offset and/or l->fp_offset. This may require 1611c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // copying to a temporary location in case the parameter is passed 1612c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // in different register classes or requires an alignment greater 1613c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // than 8 for general purpose registers and 16 for XMM registers. 1614c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // 1615c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // FIXME: This really results in shameful code when we end up needing to 1616c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // collect arguments from different places; often what should result in a 1617c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // simple assembling of a structure from scattered addresses has many more 1618c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // loads than necessary. Can we clean this up? 1619c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov const llvm::Type *LTy = CGF.ConvertTypeForMem(Ty); 1620c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov llvm::Value *RegAddr = 1621c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov CGF.Builder.CreateLoad(CGF.Builder.CreateStructGEP(VAListAddr, 3), 1622c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov "reg_save_area"); 1623c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov if (neededInt && neededSSE) { 1624c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // FIXME: Cleanup. 1625c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov assert(AI.isCoerce() && "Unexpected ABI info for mixed regs"); 1626c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov const llvm::StructType *ST = cast<llvm::StructType>(AI.getCoerceToType()); 1627c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov llvm::Value *Tmp = CGF.CreateTempAlloca(ST); 1628c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov assert(ST->getNumElements() == 2 && "Unexpected ABI info for mixed regs"); 1629c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov const llvm::Type *TyLo = ST->getElementType(0); 1630c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov const llvm::Type *TyHi = ST->getElementType(1); 1631f177d9d6c27fbbcee8c00fd90b8306985c03c54aDuncan Sands assert((TyLo->isFloatingPointTy() ^ TyHi->isFloatingPointTy()) && 1632c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov "Unexpected ABI info for mixed regs"); 163396e0fc726c6fe7538522c60743705d5e696b40afOwen Anderson const llvm::Type *PTyLo = llvm::PointerType::getUnqual(TyLo); 163496e0fc726c6fe7538522c60743705d5e696b40afOwen Anderson const llvm::Type *PTyHi = llvm::PointerType::getUnqual(TyHi); 1635c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov llvm::Value *GPAddr = CGF.Builder.CreateGEP(RegAddr, gp_offset); 1636c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov llvm::Value *FPAddr = CGF.Builder.CreateGEP(RegAddr, fp_offset); 1637f177d9d6c27fbbcee8c00fd90b8306985c03c54aDuncan Sands llvm::Value *RegLoAddr = TyLo->isFloatingPointTy() ? FPAddr : GPAddr; 1638f177d9d6c27fbbcee8c00fd90b8306985c03c54aDuncan Sands llvm::Value *RegHiAddr = TyLo->isFloatingPointTy() ? GPAddr : FPAddr; 1639c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov llvm::Value *V = 1640c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov CGF.Builder.CreateLoad(CGF.Builder.CreateBitCast(RegLoAddr, PTyLo)); 1641c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov CGF.Builder.CreateStore(V, CGF.Builder.CreateStructGEP(Tmp, 0)); 1642c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov V = CGF.Builder.CreateLoad(CGF.Builder.CreateBitCast(RegHiAddr, PTyHi)); 1643c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov CGF.Builder.CreateStore(V, CGF.Builder.CreateStructGEP(Tmp, 1)); 1644c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 1645a1cf15f4680e5cf39e72e28c5ea854fcba792e84Owen Anderson RegAddr = CGF.Builder.CreateBitCast(Tmp, 164696e0fc726c6fe7538522c60743705d5e696b40afOwen Anderson llvm::PointerType::getUnqual(LTy)); 1647c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov } else if (neededInt) { 1648c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov RegAddr = CGF.Builder.CreateGEP(RegAddr, gp_offset); 1649c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov RegAddr = CGF.Builder.CreateBitCast(RegAddr, 165096e0fc726c6fe7538522c60743705d5e696b40afOwen Anderson llvm::PointerType::getUnqual(LTy)); 1651dce5ad0cf70ba74e1ecdbb5e81f1a81d97821636Chris Lattner } else if (neededSSE == 1) { 1652dce5ad0cf70ba74e1ecdbb5e81f1a81d97821636Chris Lattner RegAddr = CGF.Builder.CreateGEP(RegAddr, fp_offset); 1653dce5ad0cf70ba74e1ecdbb5e81f1a81d97821636Chris Lattner RegAddr = CGF.Builder.CreateBitCast(RegAddr, 1654dce5ad0cf70ba74e1ecdbb5e81f1a81d97821636Chris Lattner llvm::PointerType::getUnqual(LTy)); 1655c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov } else { 1656dce5ad0cf70ba74e1ecdbb5e81f1a81d97821636Chris Lattner assert(neededSSE == 2 && "Invalid number of needed registers!"); 1657dce5ad0cf70ba74e1ecdbb5e81f1a81d97821636Chris Lattner // SSE registers are spaced 16 bytes apart in the register save 1658dce5ad0cf70ba74e1ecdbb5e81f1a81d97821636Chris Lattner // area, we need to collect the two eightbytes together. 1659dce5ad0cf70ba74e1ecdbb5e81f1a81d97821636Chris Lattner llvm::Value *RegAddrLo = CGF.Builder.CreateGEP(RegAddr, fp_offset); 16601090a9ba0902380dbd97d0a500daa4c373712df9Chris Lattner llvm::Value *RegAddrHi = CGF.Builder.CreateConstGEP1_32(RegAddrLo, 16); 1661dce5ad0cf70ba74e1ecdbb5e81f1a81d97821636Chris Lattner const llvm::Type *DoubleTy = llvm::Type::getDoubleTy(VMContext); 1662dce5ad0cf70ba74e1ecdbb5e81f1a81d97821636Chris Lattner const llvm::Type *DblPtrTy = 1663dce5ad0cf70ba74e1ecdbb5e81f1a81d97821636Chris Lattner llvm::PointerType::getUnqual(DoubleTy); 1664dce5ad0cf70ba74e1ecdbb5e81f1a81d97821636Chris Lattner const llvm::StructType *ST = llvm::StructType::get(VMContext, DoubleTy, 1665dce5ad0cf70ba74e1ecdbb5e81f1a81d97821636Chris Lattner DoubleTy, NULL); 1666dce5ad0cf70ba74e1ecdbb5e81f1a81d97821636Chris Lattner llvm::Value *V, *Tmp = CGF.CreateTempAlloca(ST); 1667dce5ad0cf70ba74e1ecdbb5e81f1a81d97821636Chris Lattner V = CGF.Builder.CreateLoad(CGF.Builder.CreateBitCast(RegAddrLo, 1668dce5ad0cf70ba74e1ecdbb5e81f1a81d97821636Chris Lattner DblPtrTy)); 1669dce5ad0cf70ba74e1ecdbb5e81f1a81d97821636Chris Lattner CGF.Builder.CreateStore(V, CGF.Builder.CreateStructGEP(Tmp, 0)); 1670dce5ad0cf70ba74e1ecdbb5e81f1a81d97821636Chris Lattner V = CGF.Builder.CreateLoad(CGF.Builder.CreateBitCast(RegAddrHi, 1671dce5ad0cf70ba74e1ecdbb5e81f1a81d97821636Chris Lattner DblPtrTy)); 1672dce5ad0cf70ba74e1ecdbb5e81f1a81d97821636Chris Lattner CGF.Builder.CreateStore(V, CGF.Builder.CreateStructGEP(Tmp, 1)); 1673dce5ad0cf70ba74e1ecdbb5e81f1a81d97821636Chris Lattner RegAddr = CGF.Builder.CreateBitCast(Tmp, 1674dce5ad0cf70ba74e1ecdbb5e81f1a81d97821636Chris Lattner llvm::PointerType::getUnqual(LTy)); 1675c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov } 1676c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 1677c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // AMD64-ABI 3.5.7p5: Step 5. Set: 1678c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // l->gp_offset = l->gp_offset + num_gp * 8 1679c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // l->fp_offset = l->fp_offset + num_fp * 16. 1680c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov if (neededInt) { 168177b89b87c3b9220fea1bc80f6d6598d2003cc8a8Chris Lattner llvm::Value *Offset = llvm::ConstantInt::get(CGF.Int32Ty, neededInt * 8); 1682c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov CGF.Builder.CreateStore(CGF.Builder.CreateAdd(gp_offset, Offset), 1683c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov gp_offset_p); 1684c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov } 1685c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov if (neededSSE) { 168677b89b87c3b9220fea1bc80f6d6598d2003cc8a8Chris Lattner llvm::Value *Offset = llvm::ConstantInt::get(CGF.Int32Ty, neededSSE * 16); 1687c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov CGF.Builder.CreateStore(CGF.Builder.CreateAdd(fp_offset, Offset), 1688c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov fp_offset_p); 1689c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov } 1690c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov CGF.EmitBranch(ContBlock); 1691c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 1692c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // Emit code to load the value if it was passed in memory. 1693c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 1694c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov CGF.EmitBlock(InMemBlock); 1695c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov llvm::Value *MemAddr = EmitVAArgFromMemory(VAListAddr, Ty, CGF); 1696c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 1697c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // Return the appropriate result. 1698c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 1699c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov CGF.EmitBlock(ContBlock); 1700c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov llvm::PHINode *ResAddr = CGF.Builder.CreatePHI(RegAddr->getType(), 1701c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov "vaarg.addr"); 1702c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov ResAddr->reserveOperandSpace(2); 1703c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov ResAddr->addIncoming(RegAddr, InRegBlock); 1704c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov ResAddr->addIncoming(MemAddr, InMemBlock); 1705c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov return ResAddr; 1706c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov} 1707c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 1708dce5ad0cf70ba74e1ecdbb5e81f1a81d97821636Chris Lattner 1709dce5ad0cf70ba74e1ecdbb5e81f1a81d97821636Chris Lattner 1710dce5ad0cf70ba74e1ecdbb5e81f1a81d97821636Chris Lattner//===----------------------------------------------------------------------===// 171134d91fddd0252d64456cdcea0bd22073f006f4e2Daniel Dunbar// PIC16 ABI Implementation 1712dce5ad0cf70ba74e1ecdbb5e81f1a81d97821636Chris Lattner//===----------------------------------------------------------------------===// 171334d91fddd0252d64456cdcea0bd22073f006f4e2Daniel Dunbar 171434d91fddd0252d64456cdcea0bd22073f006f4e2Daniel Dunbarnamespace { 171534d91fddd0252d64456cdcea0bd22073f006f4e2Daniel Dunbar 1716c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikovclass PIC16ABIInfo : public ABIInfo { 1717ea0443212e7ec6ff82e2f174e8e948a6eb0e0876Chris Lattnerpublic: 1718ea0443212e7ec6ff82e2f174e8e948a6eb0e0876Chris Lattner PIC16ABIInfo(CodeGenTypes &CGT) : ABIInfo(CGT) {} 1719ea0443212e7ec6ff82e2f174e8e948a6eb0e0876Chris Lattner 1720a3c109bbf6e198f463fbe204da4d25b40dab65c4Chris Lattner ABIArgInfo classifyReturnType(QualType RetTy) const; 1721c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 1722a3c109bbf6e198f463fbe204da4d25b40dab65c4Chris Lattner ABIArgInfo classifyArgumentType(QualType RetTy) const; 1723c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 1724ee5dcd064a811edc90f6c1fb31a837b6c961fed7Chris Lattner virtual void computeInfo(CGFunctionInfo &FI) const { 1725a3c109bbf6e198f463fbe204da4d25b40dab65c4Chris Lattner FI.getReturnInfo() = classifyReturnType(FI.getReturnType()); 1726c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov for (CGFunctionInfo::arg_iterator it = FI.arg_begin(), ie = FI.arg_end(); 1727c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov it != ie; ++it) 1728a3c109bbf6e198f463fbe204da4d25b40dab65c4Chris Lattner it->info = classifyArgumentType(it->type); 1729c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov } 1730c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 1731c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov virtual llvm::Value *EmitVAArg(llvm::Value *VAListAddr, QualType Ty, 1732c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov CodeGenFunction &CGF) const; 1733c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov}; 1734c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 173582d0a418c8699fc6f4a9417457ffe93d43bba1c1Anton Korobeynikovclass PIC16TargetCodeGenInfo : public TargetCodeGenInfo { 173682d0a418c8699fc6f4a9417457ffe93d43bba1c1Anton Korobeynikovpublic: 1737ea0443212e7ec6ff82e2f174e8e948a6eb0e0876Chris Lattner PIC16TargetCodeGenInfo(CodeGenTypes &CGT) 1738ea0443212e7ec6ff82e2f174e8e948a6eb0e0876Chris Lattner : TargetCodeGenInfo(new PIC16ABIInfo(CGT)) {} 173982d0a418c8699fc6f4a9417457ffe93d43bba1c1Anton Korobeynikov}; 174082d0a418c8699fc6f4a9417457ffe93d43bba1c1Anton Korobeynikov 174134d91fddd0252d64456cdcea0bd22073f006f4e2Daniel Dunbar} 174234d91fddd0252d64456cdcea0bd22073f006f4e2Daniel Dunbar 1743a3c109bbf6e198f463fbe204da4d25b40dab65c4Chris LattnerABIArgInfo PIC16ABIInfo::classifyReturnType(QualType RetTy) const { 1744c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov if (RetTy->isVoidType()) { 1745c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov return ABIArgInfo::getIgnore(); 1746c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov } else { 1747c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov return ABIArgInfo::getDirect(); 1748c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov } 1749c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov} 1750c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 1751a3c109bbf6e198f463fbe204da4d25b40dab65c4Chris LattnerABIArgInfo PIC16ABIInfo::classifyArgumentType(QualType Ty) const { 1752c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov return ABIArgInfo::getDirect(); 1753c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov} 1754c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 1755c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikovllvm::Value *PIC16ABIInfo::EmitVAArg(llvm::Value *VAListAddr, QualType Ty, 175677b89b87c3b9220fea1bc80f6d6598d2003cc8a8Chris Lattner CodeGenFunction &CGF) const { 175752d9ae3220c08fcbb80f213a364a88e4e0067242Chris Lattner const llvm::Type *BP = llvm::Type::getInt8PtrTy(CGF.getLLVMContext()); 1758a446ecd13a9cd2c150baa5d3db4f817db4b1eba8Sanjiv Gupta const llvm::Type *BPP = llvm::PointerType::getUnqual(BP); 1759a446ecd13a9cd2c150baa5d3db4f817db4b1eba8Sanjiv Gupta 1760a446ecd13a9cd2c150baa5d3db4f817db4b1eba8Sanjiv Gupta CGBuilderTy &Builder = CGF.Builder; 1761a446ecd13a9cd2c150baa5d3db4f817db4b1eba8Sanjiv Gupta llvm::Value *VAListAddrAsBPP = Builder.CreateBitCast(VAListAddr, BPP, 1762a446ecd13a9cd2c150baa5d3db4f817db4b1eba8Sanjiv Gupta "ap"); 1763a446ecd13a9cd2c150baa5d3db4f817db4b1eba8Sanjiv Gupta llvm::Value *Addr = Builder.CreateLoad(VAListAddrAsBPP, "ap.cur"); 1764a446ecd13a9cd2c150baa5d3db4f817db4b1eba8Sanjiv Gupta llvm::Type *PTy = 1765a446ecd13a9cd2c150baa5d3db4f817db4b1eba8Sanjiv Gupta llvm::PointerType::getUnqual(CGF.ConvertType(Ty)); 1766a446ecd13a9cd2c150baa5d3db4f817db4b1eba8Sanjiv Gupta llvm::Value *AddrTyped = Builder.CreateBitCast(Addr, PTy); 1767a446ecd13a9cd2c150baa5d3db4f817db4b1eba8Sanjiv Gupta 1768a446ecd13a9cd2c150baa5d3db4f817db4b1eba8Sanjiv Gupta uint64_t Offset = CGF.getContext().getTypeSize(Ty) / 8; 1769a446ecd13a9cd2c150baa5d3db4f817db4b1eba8Sanjiv Gupta 1770a446ecd13a9cd2c150baa5d3db4f817db4b1eba8Sanjiv Gupta llvm::Value *NextAddr = 1771a446ecd13a9cd2c150baa5d3db4f817db4b1eba8Sanjiv Gupta Builder.CreateGEP(Addr, llvm::ConstantInt::get( 1772a446ecd13a9cd2c150baa5d3db4f817db4b1eba8Sanjiv Gupta llvm::Type::getInt32Ty(CGF.getLLVMContext()), Offset), 1773a446ecd13a9cd2c150baa5d3db4f817db4b1eba8Sanjiv Gupta "ap.next"); 1774a446ecd13a9cd2c150baa5d3db4f817db4b1eba8Sanjiv Gupta Builder.CreateStore(NextAddr, VAListAddrAsBPP); 1775a446ecd13a9cd2c150baa5d3db4f817db4b1eba8Sanjiv Gupta 1776a446ecd13a9cd2c150baa5d3db4f817db4b1eba8Sanjiv Gupta return AddrTyped; 1777c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov} 1778c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 1779a446ecd13a9cd2c150baa5d3db4f817db4b1eba8Sanjiv Gupta 1780ec853ba1087f606e9685cb1e800616565ba35093John McCall// PowerPC-32 1781ec853ba1087f606e9685cb1e800616565ba35093John McCall 1782ec853ba1087f606e9685cb1e800616565ba35093John McCallnamespace { 1783ec853ba1087f606e9685cb1e800616565ba35093John McCallclass PPC32TargetCodeGenInfo : public DefaultTargetCodeGenInfo { 1784ec853ba1087f606e9685cb1e800616565ba35093John McCallpublic: 1785ea0443212e7ec6ff82e2f174e8e948a6eb0e0876Chris Lattner PPC32TargetCodeGenInfo(CodeGenTypes &CGT) : DefaultTargetCodeGenInfo(CGT) {} 1786ea0443212e7ec6ff82e2f174e8e948a6eb0e0876Chris Lattner 1787ec853ba1087f606e9685cb1e800616565ba35093John McCall int getDwarfEHStackPointer(CodeGen::CodeGenModule &M) const { 1788ec853ba1087f606e9685cb1e800616565ba35093John McCall // This is recovered from gcc output. 1789ec853ba1087f606e9685cb1e800616565ba35093John McCall return 1; // r1 is the dedicated stack pointer 1790ec853ba1087f606e9685cb1e800616565ba35093John McCall } 1791ec853ba1087f606e9685cb1e800616565ba35093John McCall 1792ec853ba1087f606e9685cb1e800616565ba35093John McCall bool initDwarfEHRegSizeTable(CodeGen::CodeGenFunction &CGF, 1793ec853ba1087f606e9685cb1e800616565ba35093John McCall llvm::Value *Address) const; 1794ec853ba1087f606e9685cb1e800616565ba35093John McCall}; 1795ec853ba1087f606e9685cb1e800616565ba35093John McCall 1796ec853ba1087f606e9685cb1e800616565ba35093John McCall} 1797ec853ba1087f606e9685cb1e800616565ba35093John McCall 1798ec853ba1087f606e9685cb1e800616565ba35093John McCallbool 1799ec853ba1087f606e9685cb1e800616565ba35093John McCallPPC32TargetCodeGenInfo::initDwarfEHRegSizeTable(CodeGen::CodeGenFunction &CGF, 1800ec853ba1087f606e9685cb1e800616565ba35093John McCall llvm::Value *Address) const { 1801ec853ba1087f606e9685cb1e800616565ba35093John McCall // This is calculated from the LLVM and GCC tables and verified 1802ec853ba1087f606e9685cb1e800616565ba35093John McCall // against gcc output. AFAIK all ABIs use the same encoding. 1803ec853ba1087f606e9685cb1e800616565ba35093John McCall 1804ec853ba1087f606e9685cb1e800616565ba35093John McCall CodeGen::CGBuilderTy &Builder = CGF.Builder; 1805ec853ba1087f606e9685cb1e800616565ba35093John McCall llvm::LLVMContext &Context = CGF.getLLVMContext(); 1806ec853ba1087f606e9685cb1e800616565ba35093John McCall 1807ec853ba1087f606e9685cb1e800616565ba35093John McCall const llvm::IntegerType *i8 = llvm::Type::getInt8Ty(Context); 1808ec853ba1087f606e9685cb1e800616565ba35093John McCall llvm::Value *Four8 = llvm::ConstantInt::get(i8, 4); 1809ec853ba1087f606e9685cb1e800616565ba35093John McCall llvm::Value *Eight8 = llvm::ConstantInt::get(i8, 8); 1810ec853ba1087f606e9685cb1e800616565ba35093John McCall llvm::Value *Sixteen8 = llvm::ConstantInt::get(i8, 16); 1811ec853ba1087f606e9685cb1e800616565ba35093John McCall 1812ec853ba1087f606e9685cb1e800616565ba35093John McCall // 0-31: r0-31, the 4-byte general-purpose registers 1813aeeb7011a875d3dd439e9fa07dc3ac54d97785b9John McCall AssignToArrayRange(Builder, Address, Four8, 0, 31); 1814ec853ba1087f606e9685cb1e800616565ba35093John McCall 1815ec853ba1087f606e9685cb1e800616565ba35093John McCall // 32-63: fp0-31, the 8-byte floating-point registers 1816aeeb7011a875d3dd439e9fa07dc3ac54d97785b9John McCall AssignToArrayRange(Builder, Address, Eight8, 32, 63); 1817ec853ba1087f606e9685cb1e800616565ba35093John McCall 1818ec853ba1087f606e9685cb1e800616565ba35093John McCall // 64-76 are various 4-byte special-purpose registers: 1819ec853ba1087f606e9685cb1e800616565ba35093John McCall // 64: mq 1820ec853ba1087f606e9685cb1e800616565ba35093John McCall // 65: lr 1821ec853ba1087f606e9685cb1e800616565ba35093John McCall // 66: ctr 1822ec853ba1087f606e9685cb1e800616565ba35093John McCall // 67: ap 1823ec853ba1087f606e9685cb1e800616565ba35093John McCall // 68-75 cr0-7 1824ec853ba1087f606e9685cb1e800616565ba35093John McCall // 76: xer 1825aeeb7011a875d3dd439e9fa07dc3ac54d97785b9John McCall AssignToArrayRange(Builder, Address, Four8, 64, 76); 1826ec853ba1087f606e9685cb1e800616565ba35093John McCall 1827ec853ba1087f606e9685cb1e800616565ba35093John McCall // 77-108: v0-31, the 16-byte vector registers 1828aeeb7011a875d3dd439e9fa07dc3ac54d97785b9John McCall AssignToArrayRange(Builder, Address, Sixteen8, 77, 108); 1829ec853ba1087f606e9685cb1e800616565ba35093John McCall 1830ec853ba1087f606e9685cb1e800616565ba35093John McCall // 109: vrsave 1831ec853ba1087f606e9685cb1e800616565ba35093John McCall // 110: vscr 1832ec853ba1087f606e9685cb1e800616565ba35093John McCall // 111: spe_acc 1833ec853ba1087f606e9685cb1e800616565ba35093John McCall // 112: spefscr 1834ec853ba1087f606e9685cb1e800616565ba35093John McCall // 113: sfp 1835aeeb7011a875d3dd439e9fa07dc3ac54d97785b9John McCall AssignToArrayRange(Builder, Address, Four8, 109, 113); 1836ec853ba1087f606e9685cb1e800616565ba35093John McCall 1837ec853ba1087f606e9685cb1e800616565ba35093John McCall return false; 1838ec853ba1087f606e9685cb1e800616565ba35093John McCall} 1839ec853ba1087f606e9685cb1e800616565ba35093John McCall 1840ec853ba1087f606e9685cb1e800616565ba35093John McCall 1841dce5ad0cf70ba74e1ecdbb5e81f1a81d97821636Chris Lattner//===----------------------------------------------------------------------===// 184234d91fddd0252d64456cdcea0bd22073f006f4e2Daniel Dunbar// ARM ABI Implementation 1843dce5ad0cf70ba74e1ecdbb5e81f1a81d97821636Chris Lattner//===----------------------------------------------------------------------===// 184434d91fddd0252d64456cdcea0bd22073f006f4e2Daniel Dunbar 184534d91fddd0252d64456cdcea0bd22073f006f4e2Daniel Dunbarnamespace { 184634d91fddd0252d64456cdcea0bd22073f006f4e2Daniel Dunbar 1847c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikovclass ARMABIInfo : public ABIInfo { 18485e7bacef79f7725f4abc45e2a5eccedae40dfcd3Daniel Dunbarpublic: 18495e7bacef79f7725f4abc45e2a5eccedae40dfcd3Daniel Dunbar enum ABIKind { 18505e7bacef79f7725f4abc45e2a5eccedae40dfcd3Daniel Dunbar APCS = 0, 18515e7bacef79f7725f4abc45e2a5eccedae40dfcd3Daniel Dunbar AAPCS = 1, 18525e7bacef79f7725f4abc45e2a5eccedae40dfcd3Daniel Dunbar AAPCS_VFP 18535e7bacef79f7725f4abc45e2a5eccedae40dfcd3Daniel Dunbar }; 18545e7bacef79f7725f4abc45e2a5eccedae40dfcd3Daniel Dunbar 18555e7bacef79f7725f4abc45e2a5eccedae40dfcd3Daniel Dunbarprivate: 18565e7bacef79f7725f4abc45e2a5eccedae40dfcd3Daniel Dunbar ABIKind Kind; 18575e7bacef79f7725f4abc45e2a5eccedae40dfcd3Daniel Dunbar 18585e7bacef79f7725f4abc45e2a5eccedae40dfcd3Daniel Dunbarpublic: 1859ea0443212e7ec6ff82e2f174e8e948a6eb0e0876Chris Lattner ARMABIInfo(CodeGenTypes &CGT, ABIKind _Kind) : ABIInfo(CGT), Kind(_Kind) {} 18605e7bacef79f7725f4abc45e2a5eccedae40dfcd3Daniel Dunbar 18615e7bacef79f7725f4abc45e2a5eccedae40dfcd3Daniel Dunbarprivate: 18625e7bacef79f7725f4abc45e2a5eccedae40dfcd3Daniel Dunbar ABIKind getABIKind() const { return Kind; } 18635e7bacef79f7725f4abc45e2a5eccedae40dfcd3Daniel Dunbar 1864a3c109bbf6e198f463fbe204da4d25b40dab65c4Chris Lattner ABIArgInfo classifyReturnType(QualType RetTy) const; 1865a3c109bbf6e198f463fbe204da4d25b40dab65c4Chris Lattner ABIArgInfo classifyArgumentType(QualType RetTy) const; 1866c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 1867ee5dcd064a811edc90f6c1fb31a837b6c961fed7Chris Lattner virtual void computeInfo(CGFunctionInfo &FI) const; 1868c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 1869c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov virtual llvm::Value *EmitVAArg(llvm::Value *VAListAddr, QualType Ty, 1870c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov CodeGenFunction &CGF) const; 1871c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov}; 1872c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 187382d0a418c8699fc6f4a9417457ffe93d43bba1c1Anton Korobeynikovclass ARMTargetCodeGenInfo : public TargetCodeGenInfo { 187482d0a418c8699fc6f4a9417457ffe93d43bba1c1Anton Korobeynikovpublic: 1875ea0443212e7ec6ff82e2f174e8e948a6eb0e0876Chris Lattner ARMTargetCodeGenInfo(CodeGenTypes &CGT, ARMABIInfo::ABIKind K) 1876ea0443212e7ec6ff82e2f174e8e948a6eb0e0876Chris Lattner :TargetCodeGenInfo(new ARMABIInfo(CGT, K)) {} 18776374c3307e2d73348f7b8cc73eeeb0998ad0ac94John McCall 18786374c3307e2d73348f7b8cc73eeeb0998ad0ac94John McCall int getDwarfEHStackPointer(CodeGen::CodeGenModule &M) const { 18796374c3307e2d73348f7b8cc73eeeb0998ad0ac94John McCall return 13; 18806374c3307e2d73348f7b8cc73eeeb0998ad0ac94John McCall } 188182d0a418c8699fc6f4a9417457ffe93d43bba1c1Anton Korobeynikov}; 188282d0a418c8699fc6f4a9417457ffe93d43bba1c1Anton Korobeynikov 188334d91fddd0252d64456cdcea0bd22073f006f4e2Daniel Dunbar} 188434d91fddd0252d64456cdcea0bd22073f006f4e2Daniel Dunbar 1885ee5dcd064a811edc90f6c1fb31a837b6c961fed7Chris Lattnervoid ARMABIInfo::computeInfo(CGFunctionInfo &FI) const { 1886a3c109bbf6e198f463fbe204da4d25b40dab65c4Chris Lattner FI.getReturnInfo() = classifyReturnType(FI.getReturnType()); 1887c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov for (CGFunctionInfo::arg_iterator it = FI.arg_begin(), ie = FI.arg_end(); 1888a3c109bbf6e198f463fbe204da4d25b40dab65c4Chris Lattner it != ie; ++it) 1889a3c109bbf6e198f463fbe204da4d25b40dab65c4Chris Lattner it->info = classifyArgumentType(it->type); 18905e7bacef79f7725f4abc45e2a5eccedae40dfcd3Daniel Dunbar 1891a3c109bbf6e198f463fbe204da4d25b40dab65c4Chris Lattner const llvm::Triple &Triple(getContext().Target.getTriple()); 189225117ab35c1a033846073183314c68ef07d1701aRafael Espindola llvm::CallingConv::ID DefaultCC; 18931ed1a594e9befc91ebf00d81b41a2fdfab862657Rafael Espindola if (Triple.getEnvironmentName() == "gnueabi" || 18941ed1a594e9befc91ebf00d81b41a2fdfab862657Rafael Espindola Triple.getEnvironmentName() == "eabi") 189525117ab35c1a033846073183314c68ef07d1701aRafael Espindola DefaultCC = llvm::CallingConv::ARM_AAPCS; 18961ed1a594e9befc91ebf00d81b41a2fdfab862657Rafael Espindola else 18971ed1a594e9befc91ebf00d81b41a2fdfab862657Rafael Espindola DefaultCC = llvm::CallingConv::ARM_APCS; 189825117ab35c1a033846073183314c68ef07d1701aRafael Espindola 18995e7bacef79f7725f4abc45e2a5eccedae40dfcd3Daniel Dunbar switch (getABIKind()) { 19005e7bacef79f7725f4abc45e2a5eccedae40dfcd3Daniel Dunbar case APCS: 190125117ab35c1a033846073183314c68ef07d1701aRafael Espindola if (DefaultCC != llvm::CallingConv::ARM_APCS) 190225117ab35c1a033846073183314c68ef07d1701aRafael Espindola FI.setEffectiveCallingConvention(llvm::CallingConv::ARM_APCS); 19035e7bacef79f7725f4abc45e2a5eccedae40dfcd3Daniel Dunbar break; 19045e7bacef79f7725f4abc45e2a5eccedae40dfcd3Daniel Dunbar 19055e7bacef79f7725f4abc45e2a5eccedae40dfcd3Daniel Dunbar case AAPCS: 190625117ab35c1a033846073183314c68ef07d1701aRafael Espindola if (DefaultCC != llvm::CallingConv::ARM_AAPCS) 190725117ab35c1a033846073183314c68ef07d1701aRafael Espindola FI.setEffectiveCallingConvention(llvm::CallingConv::ARM_AAPCS); 19085e7bacef79f7725f4abc45e2a5eccedae40dfcd3Daniel Dunbar break; 19095e7bacef79f7725f4abc45e2a5eccedae40dfcd3Daniel Dunbar 19105e7bacef79f7725f4abc45e2a5eccedae40dfcd3Daniel Dunbar case AAPCS_VFP: 19115e7bacef79f7725f4abc45e2a5eccedae40dfcd3Daniel Dunbar FI.setEffectiveCallingConvention(llvm::CallingConv::ARM_AAPCS_VFP); 19125e7bacef79f7725f4abc45e2a5eccedae40dfcd3Daniel Dunbar break; 19135e7bacef79f7725f4abc45e2a5eccedae40dfcd3Daniel Dunbar } 1914c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov} 1915c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 1916a3c109bbf6e198f463fbe204da4d25b40dab65c4Chris LattnerABIArgInfo ARMABIInfo::classifyArgumentType(QualType Ty) const { 1917aa74a1e49f7c4b89539830290f76fe2c3e97187fDouglas Gregor if (!CodeGenFunction::hasAggregateLLVMType(Ty)) { 1918aa74a1e49f7c4b89539830290f76fe2c3e97187fDouglas Gregor // Treat an enum type as its underlying type. 1919aa74a1e49f7c4b89539830290f76fe2c3e97187fDouglas Gregor if (const EnumType *EnumTy = Ty->getAs<EnumType>()) 1920aa74a1e49f7c4b89539830290f76fe2c3e97187fDouglas Gregor Ty = EnumTy->getDecl()->getIntegerType(); 1921aa74a1e49f7c4b89539830290f76fe2c3e97187fDouglas Gregor 1922cc6fa88666ca2f287df4a600eb31a4087bab9c13Anton Korobeynikov return (Ty->isPromotableIntegerType() ? 1923cc6fa88666ca2f287df4a600eb31a4087bab9c13Anton Korobeynikov ABIArgInfo::getExtend() : ABIArgInfo::getDirect()); 1924aa74a1e49f7c4b89539830290f76fe2c3e97187fDouglas Gregor } 192598303b93ae335bbb4731f6f1f8164d3c70648346Daniel Dunbar 1926420255710694e958fa04bed1d80d96508949879eDaniel Dunbar // Ignore empty records. 1927a3c109bbf6e198f463fbe204da4d25b40dab65c4Chris Lattner if (isEmptyRecord(getContext(), Ty, true)) 1928420255710694e958fa04bed1d80d96508949879eDaniel Dunbar return ABIArgInfo::getIgnore(); 1929420255710694e958fa04bed1d80d96508949879eDaniel Dunbar 19300eb1d9733801764cd8b692c67e117e4feeecf013Rafael Espindola // Structures with either a non-trivial destructor or a non-trivial 19310eb1d9733801764cd8b692c67e117e4feeecf013Rafael Espindola // copy constructor are always indirect. 19320eb1d9733801764cd8b692c67e117e4feeecf013Rafael Espindola if (isRecordWithNonTrivialDestructorOrCopyConstructor(Ty)) 19330eb1d9733801764cd8b692c67e117e4feeecf013Rafael Espindola return ABIArgInfo::getIndirect(0, /*ByVal=*/false); 19340eb1d9733801764cd8b692c67e117e4feeecf013Rafael Espindola 1935c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // FIXME: This is kind of nasty... but there isn't much choice because the ARM 1936c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // backend doesn't support byval. 1937c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // FIXME: This doesn't handle alignment > 64 bits. 1938c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov const llvm::Type* ElemTy; 1939c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov unsigned SizeRegs; 1940a3c109bbf6e198f463fbe204da4d25b40dab65c4Chris Lattner if (getContext().getTypeAlign(Ty) > 32) { 1941a3c109bbf6e198f463fbe204da4d25b40dab65c4Chris Lattner ElemTy = llvm::Type::getInt64Ty(getVMContext()); 1942a3c109bbf6e198f463fbe204da4d25b40dab65c4Chris Lattner SizeRegs = (getContext().getTypeSize(Ty) + 63) / 64; 1943c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov } else { 1944a3c109bbf6e198f463fbe204da4d25b40dab65c4Chris Lattner ElemTy = llvm::Type::getInt32Ty(getVMContext()); 1945a3c109bbf6e198f463fbe204da4d25b40dab65c4Chris Lattner SizeRegs = (getContext().getTypeSize(Ty) + 31) / 32; 1946c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov } 1947c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov std::vector<const llvm::Type*> LLVMFields; 194896e0fc726c6fe7538522c60743705d5e696b40afOwen Anderson LLVMFields.push_back(llvm::ArrayType::get(ElemTy, SizeRegs)); 1949a3c109bbf6e198f463fbe204da4d25b40dab65c4Chris Lattner const llvm::Type* STy = llvm::StructType::get(getVMContext(), LLVMFields, 1950a3c109bbf6e198f463fbe204da4d25b40dab65c4Chris Lattner true); 1951c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov return ABIArgInfo::getCoerce(STy); 1952c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov} 1953c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 1954a3c109bbf6e198f463fbe204da4d25b40dab65c4Chris Lattnerstatic bool isIntegerLikeType(QualType Ty, ASTContext &Context, 195598303b93ae335bbb4731f6f1f8164d3c70648346Daniel Dunbar llvm::LLVMContext &VMContext) { 195698303b93ae335bbb4731f6f1f8164d3c70648346Daniel Dunbar // APCS, C Language Calling Conventions, Non-Simple Return Values: A structure 195798303b93ae335bbb4731f6f1f8164d3c70648346Daniel Dunbar // is called integer-like if its size is less than or equal to one word, and 195898303b93ae335bbb4731f6f1f8164d3c70648346Daniel Dunbar // the offset of each of its addressable sub-fields is zero. 195998303b93ae335bbb4731f6f1f8164d3c70648346Daniel Dunbar 196098303b93ae335bbb4731f6f1f8164d3c70648346Daniel Dunbar uint64_t Size = Context.getTypeSize(Ty); 196198303b93ae335bbb4731f6f1f8164d3c70648346Daniel Dunbar 196298303b93ae335bbb4731f6f1f8164d3c70648346Daniel Dunbar // Check that the type fits in a word. 196398303b93ae335bbb4731f6f1f8164d3c70648346Daniel Dunbar if (Size > 32) 196498303b93ae335bbb4731f6f1f8164d3c70648346Daniel Dunbar return false; 196598303b93ae335bbb4731f6f1f8164d3c70648346Daniel Dunbar 196698303b93ae335bbb4731f6f1f8164d3c70648346Daniel Dunbar // FIXME: Handle vector types! 196798303b93ae335bbb4731f6f1f8164d3c70648346Daniel Dunbar if (Ty->isVectorType()) 196898303b93ae335bbb4731f6f1f8164d3c70648346Daniel Dunbar return false; 196998303b93ae335bbb4731f6f1f8164d3c70648346Daniel Dunbar 1970b0d58196808aba4b3d1a7488bd5566f3c0a83e89Daniel Dunbar // Float types are never treated as "integer like". 1971b0d58196808aba4b3d1a7488bd5566f3c0a83e89Daniel Dunbar if (Ty->isRealFloatingType()) 1972b0d58196808aba4b3d1a7488bd5566f3c0a83e89Daniel Dunbar return false; 1973b0d58196808aba4b3d1a7488bd5566f3c0a83e89Daniel Dunbar 197498303b93ae335bbb4731f6f1f8164d3c70648346Daniel Dunbar // If this is a builtin or pointer type then it is ok. 1975183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall if (Ty->getAs<BuiltinType>() || Ty->isPointerType()) 197698303b93ae335bbb4731f6f1f8164d3c70648346Daniel Dunbar return true; 197798303b93ae335bbb4731f6f1f8164d3c70648346Daniel Dunbar 19784581581881d3f7349bf5a4b39d761bce688f9164Daniel Dunbar // Small complex integer types are "integer like". 19794581581881d3f7349bf5a4b39d761bce688f9164Daniel Dunbar if (const ComplexType *CT = Ty->getAs<ComplexType>()) 19804581581881d3f7349bf5a4b39d761bce688f9164Daniel Dunbar return isIntegerLikeType(CT->getElementType(), Context, VMContext); 198198303b93ae335bbb4731f6f1f8164d3c70648346Daniel Dunbar 198298303b93ae335bbb4731f6f1f8164d3c70648346Daniel Dunbar // Single element and zero sized arrays should be allowed, by the definition 198398303b93ae335bbb4731f6f1f8164d3c70648346Daniel Dunbar // above, but they are not. 198498303b93ae335bbb4731f6f1f8164d3c70648346Daniel Dunbar 198598303b93ae335bbb4731f6f1f8164d3c70648346Daniel Dunbar // Otherwise, it must be a record type. 198698303b93ae335bbb4731f6f1f8164d3c70648346Daniel Dunbar const RecordType *RT = Ty->getAs<RecordType>(); 198798303b93ae335bbb4731f6f1f8164d3c70648346Daniel Dunbar if (!RT) return false; 198898303b93ae335bbb4731f6f1f8164d3c70648346Daniel Dunbar 198998303b93ae335bbb4731f6f1f8164d3c70648346Daniel Dunbar // Ignore records with flexible arrays. 199098303b93ae335bbb4731f6f1f8164d3c70648346Daniel Dunbar const RecordDecl *RD = RT->getDecl(); 199198303b93ae335bbb4731f6f1f8164d3c70648346Daniel Dunbar if (RD->hasFlexibleArrayMember()) 199298303b93ae335bbb4731f6f1f8164d3c70648346Daniel Dunbar return false; 199398303b93ae335bbb4731f6f1f8164d3c70648346Daniel Dunbar 199498303b93ae335bbb4731f6f1f8164d3c70648346Daniel Dunbar // Check that all sub-fields are at offset 0, and are themselves "integer 199598303b93ae335bbb4731f6f1f8164d3c70648346Daniel Dunbar // like". 199698303b93ae335bbb4731f6f1f8164d3c70648346Daniel Dunbar const ASTRecordLayout &Layout = Context.getASTRecordLayout(RD); 199798303b93ae335bbb4731f6f1f8164d3c70648346Daniel Dunbar 199898303b93ae335bbb4731f6f1f8164d3c70648346Daniel Dunbar bool HadField = false; 199998303b93ae335bbb4731f6f1f8164d3c70648346Daniel Dunbar unsigned idx = 0; 200098303b93ae335bbb4731f6f1f8164d3c70648346Daniel Dunbar for (RecordDecl::field_iterator i = RD->field_begin(), e = RD->field_end(); 200198303b93ae335bbb4731f6f1f8164d3c70648346Daniel Dunbar i != e; ++i, ++idx) { 200298303b93ae335bbb4731f6f1f8164d3c70648346Daniel Dunbar const FieldDecl *FD = *i; 200398303b93ae335bbb4731f6f1f8164d3c70648346Daniel Dunbar 2004679855a6e14fbc6c6838c566aa74c32f52f4f946Daniel Dunbar // Bit-fields are not addressable, we only need to verify they are "integer 2005679855a6e14fbc6c6838c566aa74c32f52f4f946Daniel Dunbar // like". We still have to disallow a subsequent non-bitfield, for example: 2006679855a6e14fbc6c6838c566aa74c32f52f4f946Daniel Dunbar // struct { int : 0; int x } 2007679855a6e14fbc6c6838c566aa74c32f52f4f946Daniel Dunbar // is non-integer like according to gcc. 2008679855a6e14fbc6c6838c566aa74c32f52f4f946Daniel Dunbar if (FD->isBitField()) { 2009679855a6e14fbc6c6838c566aa74c32f52f4f946Daniel Dunbar if (!RD->isUnion()) 2010679855a6e14fbc6c6838c566aa74c32f52f4f946Daniel Dunbar HadField = true; 2011679855a6e14fbc6c6838c566aa74c32f52f4f946Daniel Dunbar 2012679855a6e14fbc6c6838c566aa74c32f52f4f946Daniel Dunbar if (!isIntegerLikeType(FD->getType(), Context, VMContext)) 2013679855a6e14fbc6c6838c566aa74c32f52f4f946Daniel Dunbar return false; 201498303b93ae335bbb4731f6f1f8164d3c70648346Daniel Dunbar 2015679855a6e14fbc6c6838c566aa74c32f52f4f946Daniel Dunbar continue; 201698303b93ae335bbb4731f6f1f8164d3c70648346Daniel Dunbar } 201798303b93ae335bbb4731f6f1f8164d3c70648346Daniel Dunbar 2018679855a6e14fbc6c6838c566aa74c32f52f4f946Daniel Dunbar // Check if this field is at offset 0. 2019679855a6e14fbc6c6838c566aa74c32f52f4f946Daniel Dunbar if (Layout.getFieldOffset(idx) != 0) 2020679855a6e14fbc6c6838c566aa74c32f52f4f946Daniel Dunbar return false; 2021679855a6e14fbc6c6838c566aa74c32f52f4f946Daniel Dunbar 202298303b93ae335bbb4731f6f1f8164d3c70648346Daniel Dunbar if (!isIntegerLikeType(FD->getType(), Context, VMContext)) 202398303b93ae335bbb4731f6f1f8164d3c70648346Daniel Dunbar return false; 202498303b93ae335bbb4731f6f1f8164d3c70648346Daniel Dunbar 2025679855a6e14fbc6c6838c566aa74c32f52f4f946Daniel Dunbar // Only allow at most one field in a structure. This doesn't match the 2026679855a6e14fbc6c6838c566aa74c32f52f4f946Daniel Dunbar // wording above, but follows gcc in situations with a field following an 2027679855a6e14fbc6c6838c566aa74c32f52f4f946Daniel Dunbar // empty structure. 202898303b93ae335bbb4731f6f1f8164d3c70648346Daniel Dunbar if (!RD->isUnion()) { 202998303b93ae335bbb4731f6f1f8164d3c70648346Daniel Dunbar if (HadField) 203098303b93ae335bbb4731f6f1f8164d3c70648346Daniel Dunbar return false; 203198303b93ae335bbb4731f6f1f8164d3c70648346Daniel Dunbar 203298303b93ae335bbb4731f6f1f8164d3c70648346Daniel Dunbar HadField = true; 203398303b93ae335bbb4731f6f1f8164d3c70648346Daniel Dunbar } 203498303b93ae335bbb4731f6f1f8164d3c70648346Daniel Dunbar } 203598303b93ae335bbb4731f6f1f8164d3c70648346Daniel Dunbar 203698303b93ae335bbb4731f6f1f8164d3c70648346Daniel Dunbar return true; 203798303b93ae335bbb4731f6f1f8164d3c70648346Daniel Dunbar} 203898303b93ae335bbb4731f6f1f8164d3c70648346Daniel Dunbar 2039a3c109bbf6e198f463fbe204da4d25b40dab65c4Chris LattnerABIArgInfo ARMABIInfo::classifyReturnType(QualType RetTy) const { 204098303b93ae335bbb4731f6f1f8164d3c70648346Daniel Dunbar if (RetTy->isVoidType()) 2041c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov return ABIArgInfo::getIgnore(); 204298303b93ae335bbb4731f6f1f8164d3c70648346Daniel Dunbar 2043aa74a1e49f7c4b89539830290f76fe2c3e97187fDouglas Gregor if (!CodeGenFunction::hasAggregateLLVMType(RetTy)) { 2044aa74a1e49f7c4b89539830290f76fe2c3e97187fDouglas Gregor // Treat an enum type as its underlying type. 2045aa74a1e49f7c4b89539830290f76fe2c3e97187fDouglas Gregor if (const EnumType *EnumTy = RetTy->getAs<EnumType>()) 2046aa74a1e49f7c4b89539830290f76fe2c3e97187fDouglas Gregor RetTy = EnumTy->getDecl()->getIntegerType(); 2047aa74a1e49f7c4b89539830290f76fe2c3e97187fDouglas Gregor 2048cc6fa88666ca2f287df4a600eb31a4087bab9c13Anton Korobeynikov return (RetTy->isPromotableIntegerType() ? 2049cc6fa88666ca2f287df4a600eb31a4087bab9c13Anton Korobeynikov ABIArgInfo::getExtend() : ABIArgInfo::getDirect()); 2050aa74a1e49f7c4b89539830290f76fe2c3e97187fDouglas Gregor } 205198303b93ae335bbb4731f6f1f8164d3c70648346Daniel Dunbar 20520eb1d9733801764cd8b692c67e117e4feeecf013Rafael Espindola // Structures with either a non-trivial destructor or a non-trivial 20530eb1d9733801764cd8b692c67e117e4feeecf013Rafael Espindola // copy constructor are always indirect. 20540eb1d9733801764cd8b692c67e117e4feeecf013Rafael Espindola if (isRecordWithNonTrivialDestructorOrCopyConstructor(RetTy)) 20550eb1d9733801764cd8b692c67e117e4feeecf013Rafael Espindola return ABIArgInfo::getIndirect(0, /*ByVal=*/false); 20560eb1d9733801764cd8b692c67e117e4feeecf013Rafael Espindola 205798303b93ae335bbb4731f6f1f8164d3c70648346Daniel Dunbar // Are we following APCS? 205898303b93ae335bbb4731f6f1f8164d3c70648346Daniel Dunbar if (getABIKind() == APCS) { 2059a3c109bbf6e198f463fbe204da4d25b40dab65c4Chris Lattner if (isEmptyRecord(getContext(), RetTy, false)) 206098303b93ae335bbb4731f6f1f8164d3c70648346Daniel Dunbar return ABIArgInfo::getIgnore(); 206198303b93ae335bbb4731f6f1f8164d3c70648346Daniel Dunbar 20624cc753f4503931763cfb762a95928b44fcbe64e9Daniel Dunbar // Complex types are all returned as packed integers. 20634cc753f4503931763cfb762a95928b44fcbe64e9Daniel Dunbar // 20644cc753f4503931763cfb762a95928b44fcbe64e9Daniel Dunbar // FIXME: Consider using 2 x vector types if the back end handles them 20654cc753f4503931763cfb762a95928b44fcbe64e9Daniel Dunbar // correctly. 20664cc753f4503931763cfb762a95928b44fcbe64e9Daniel Dunbar if (RetTy->isAnyComplexType()) 2067a3c109bbf6e198f463fbe204da4d25b40dab65c4Chris Lattner return ABIArgInfo::getCoerce(llvm::IntegerType::get(getVMContext(), 2068a3c109bbf6e198f463fbe204da4d25b40dab65c4Chris Lattner getContext().getTypeSize(RetTy))); 20694cc753f4503931763cfb762a95928b44fcbe64e9Daniel Dunbar 207098303b93ae335bbb4731f6f1f8164d3c70648346Daniel Dunbar // Integer like structures are returned in r0. 2071a3c109bbf6e198f463fbe204da4d25b40dab65c4Chris Lattner if (isIntegerLikeType(RetTy, getContext(), getVMContext())) { 207298303b93ae335bbb4731f6f1f8164d3c70648346Daniel Dunbar // Return in the smallest viable integer type. 2073a3c109bbf6e198f463fbe204da4d25b40dab65c4Chris Lattner uint64_t Size = getContext().getTypeSize(RetTy); 207498303b93ae335bbb4731f6f1f8164d3c70648346Daniel Dunbar if (Size <= 8) 2075a3c109bbf6e198f463fbe204da4d25b40dab65c4Chris Lattner return ABIArgInfo::getCoerce(llvm::Type::getInt8Ty(getVMContext())); 207698303b93ae335bbb4731f6f1f8164d3c70648346Daniel Dunbar if (Size <= 16) 2077a3c109bbf6e198f463fbe204da4d25b40dab65c4Chris Lattner return ABIArgInfo::getCoerce(llvm::Type::getInt16Ty(getVMContext())); 2078a3c109bbf6e198f463fbe204da4d25b40dab65c4Chris Lattner return ABIArgInfo::getCoerce(llvm::Type::getInt32Ty(getVMContext())); 207998303b93ae335bbb4731f6f1f8164d3c70648346Daniel Dunbar } 208098303b93ae335bbb4731f6f1f8164d3c70648346Daniel Dunbar 208198303b93ae335bbb4731f6f1f8164d3c70648346Daniel Dunbar // Otherwise return in memory. 208298303b93ae335bbb4731f6f1f8164d3c70648346Daniel Dunbar return ABIArgInfo::getIndirect(0); 2083c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov } 208498303b93ae335bbb4731f6f1f8164d3c70648346Daniel Dunbar 208598303b93ae335bbb4731f6f1f8164d3c70648346Daniel Dunbar // Otherwise this is an AAPCS variant. 208698303b93ae335bbb4731f6f1f8164d3c70648346Daniel Dunbar 2087a3c109bbf6e198f463fbe204da4d25b40dab65c4Chris Lattner if (isEmptyRecord(getContext(), RetTy, true)) 208816a0808b7992db2c2ba78b387e1732bbb0fb371bDaniel Dunbar return ABIArgInfo::getIgnore(); 208916a0808b7992db2c2ba78b387e1732bbb0fb371bDaniel Dunbar 209098303b93ae335bbb4731f6f1f8164d3c70648346Daniel Dunbar // Aggregates <= 4 bytes are returned in r0; other aggregates 209198303b93ae335bbb4731f6f1f8164d3c70648346Daniel Dunbar // are returned indirectly. 2092a3c109bbf6e198f463fbe204da4d25b40dab65c4Chris Lattner uint64_t Size = getContext().getTypeSize(RetTy); 209316a0808b7992db2c2ba78b387e1732bbb0fb371bDaniel Dunbar if (Size <= 32) { 209416a0808b7992db2c2ba78b387e1732bbb0fb371bDaniel Dunbar // Return in the smallest viable integer type. 209516a0808b7992db2c2ba78b387e1732bbb0fb371bDaniel Dunbar if (Size <= 8) 2096a3c109bbf6e198f463fbe204da4d25b40dab65c4Chris Lattner return ABIArgInfo::getCoerce(llvm::Type::getInt8Ty(getVMContext())); 209716a0808b7992db2c2ba78b387e1732bbb0fb371bDaniel Dunbar if (Size <= 16) 2098a3c109bbf6e198f463fbe204da4d25b40dab65c4Chris Lattner return ABIArgInfo::getCoerce(llvm::Type::getInt16Ty(getVMContext())); 2099a3c109bbf6e198f463fbe204da4d25b40dab65c4Chris Lattner return ABIArgInfo::getCoerce(llvm::Type::getInt32Ty(getVMContext())); 210016a0808b7992db2c2ba78b387e1732bbb0fb371bDaniel Dunbar } 210116a0808b7992db2c2ba78b387e1732bbb0fb371bDaniel Dunbar 210298303b93ae335bbb4731f6f1f8164d3c70648346Daniel Dunbar return ABIArgInfo::getIndirect(0); 2103c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov} 2104c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 2105c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikovllvm::Value *ARMABIInfo::EmitVAArg(llvm::Value *VAListAddr, QualType Ty, 210677b89b87c3b9220fea1bc80f6d6598d2003cc8a8Chris Lattner CodeGenFunction &CGF) const { 2107c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov // FIXME: Need to handle alignment 21083c0ef8cc0dc246bd3083e8cdd63005e8873d36d2Benjamin Kramer const llvm::Type *BP = llvm::Type::getInt8PtrTy(CGF.getLLVMContext()); 210996e0fc726c6fe7538522c60743705d5e696b40afOwen Anderson const llvm::Type *BPP = llvm::PointerType::getUnqual(BP); 2110c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 2111c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov CGBuilderTy &Builder = CGF.Builder; 2112c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov llvm::Value *VAListAddrAsBPP = Builder.CreateBitCast(VAListAddr, BPP, 2113c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov "ap"); 2114c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov llvm::Value *Addr = Builder.CreateLoad(VAListAddrAsBPP, "ap.cur"); 2115c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov llvm::Type *PTy = 211696e0fc726c6fe7538522c60743705d5e696b40afOwen Anderson llvm::PointerType::getUnqual(CGF.ConvertType(Ty)); 2117c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov llvm::Value *AddrTyped = Builder.CreateBitCast(Addr, PTy); 2118c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 2119c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov uint64_t Offset = 2120c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov llvm::RoundUpToAlignment(CGF.getContext().getTypeSize(Ty) / 8, 4); 2121c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov llvm::Value *NextAddr = 212277b89b87c3b9220fea1bc80f6d6598d2003cc8a8Chris Lattner Builder.CreateGEP(Addr, llvm::ConstantInt::get(CGF.Int32Ty, Offset), 2123c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov "ap.next"); 2124c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov Builder.CreateStore(NextAddr, VAListAddrAsBPP); 2125c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 2126c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov return AddrTyped; 2127c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov} 2128c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 2129a3c109bbf6e198f463fbe204da4d25b40dab65c4Chris LattnerABIArgInfo DefaultABIInfo::classifyReturnType(QualType RetTy) const { 2130a3c109bbf6e198f463fbe204da4d25b40dab65c4Chris Lattner if (RetTy->isVoidType()) 2131c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov return ABIArgInfo::getIgnore(); 2132a3c109bbf6e198f463fbe204da4d25b40dab65c4Chris Lattner 2133a3c109bbf6e198f463fbe204da4d25b40dab65c4Chris Lattner if (CodeGenFunction::hasAggregateLLVMType(RetTy)) 2134c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov return ABIArgInfo::getIndirect(0); 2135aa74a1e49f7c4b89539830290f76fe2c3e97187fDouglas Gregor 2136a3c109bbf6e198f463fbe204da4d25b40dab65c4Chris Lattner // Treat an enum type as its underlying type. 2137a3c109bbf6e198f463fbe204da4d25b40dab65c4Chris Lattner if (const EnumType *EnumTy = RetTy->getAs<EnumType>()) 2138a3c109bbf6e198f463fbe204da4d25b40dab65c4Chris Lattner RetTy = EnumTy->getDecl()->getIntegerType(); 2139a3c109bbf6e198f463fbe204da4d25b40dab65c4Chris Lattner 2140a3c109bbf6e198f463fbe204da4d25b40dab65c4Chris Lattner return (RetTy->isPromotableIntegerType() ? 2141a3c109bbf6e198f463fbe204da4d25b40dab65c4Chris Lattner ABIArgInfo::getExtend() : ABIArgInfo::getDirect()); 2142c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov} 2143c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 2144dce5ad0cf70ba74e1ecdbb5e81f1a81d97821636Chris Lattner//===----------------------------------------------------------------------===// 214534d91fddd0252d64456cdcea0bd22073f006f4e2Daniel Dunbar// SystemZ ABI Implementation 2146dce5ad0cf70ba74e1ecdbb5e81f1a81d97821636Chris Lattner//===----------------------------------------------------------------------===// 214734d91fddd0252d64456cdcea0bd22073f006f4e2Daniel Dunbar 214889e887fd73dd87c1118e13ebddf11aed9e25b763Anton Korobeynikovnamespace { 214934d91fddd0252d64456cdcea0bd22073f006f4e2Daniel Dunbar 215089e887fd73dd87c1118e13ebddf11aed9e25b763Anton Korobeynikovclass SystemZABIInfo : public ABIInfo { 2151ea0443212e7ec6ff82e2f174e8e948a6eb0e0876Chris Lattnerpublic: 2152ea0443212e7ec6ff82e2f174e8e948a6eb0e0876Chris Lattner SystemZABIInfo(CodeGenTypes &CGT) : ABIInfo(CGT) {} 2153ea0443212e7ec6ff82e2f174e8e948a6eb0e0876Chris Lattner 215489e887fd73dd87c1118e13ebddf11aed9e25b763Anton Korobeynikov bool isPromotableIntegerType(QualType Ty) const; 215589e887fd73dd87c1118e13ebddf11aed9e25b763Anton Korobeynikov 2156a3c109bbf6e198f463fbe204da4d25b40dab65c4Chris Lattner ABIArgInfo classifyReturnType(QualType RetTy) const; 2157a3c109bbf6e198f463fbe204da4d25b40dab65c4Chris Lattner ABIArgInfo classifyArgumentType(QualType RetTy) const; 215889e887fd73dd87c1118e13ebddf11aed9e25b763Anton Korobeynikov 2159ee5dcd064a811edc90f6c1fb31a837b6c961fed7Chris Lattner virtual void computeInfo(CGFunctionInfo &FI) const { 2160a3c109bbf6e198f463fbe204da4d25b40dab65c4Chris Lattner FI.getReturnInfo() = classifyReturnType(FI.getReturnType()); 216189e887fd73dd87c1118e13ebddf11aed9e25b763Anton Korobeynikov for (CGFunctionInfo::arg_iterator it = FI.arg_begin(), ie = FI.arg_end(); 216289e887fd73dd87c1118e13ebddf11aed9e25b763Anton Korobeynikov it != ie; ++it) 2163a3c109bbf6e198f463fbe204da4d25b40dab65c4Chris Lattner it->info = classifyArgumentType(it->type); 216489e887fd73dd87c1118e13ebddf11aed9e25b763Anton Korobeynikov } 216589e887fd73dd87c1118e13ebddf11aed9e25b763Anton Korobeynikov 216689e887fd73dd87c1118e13ebddf11aed9e25b763Anton Korobeynikov virtual llvm::Value *EmitVAArg(llvm::Value *VAListAddr, QualType Ty, 216789e887fd73dd87c1118e13ebddf11aed9e25b763Anton Korobeynikov CodeGenFunction &CGF) const; 216889e887fd73dd87c1118e13ebddf11aed9e25b763Anton Korobeynikov}; 216934d91fddd0252d64456cdcea0bd22073f006f4e2Daniel Dunbar 217082d0a418c8699fc6f4a9417457ffe93d43bba1c1Anton Korobeynikovclass SystemZTargetCodeGenInfo : public TargetCodeGenInfo { 217182d0a418c8699fc6f4a9417457ffe93d43bba1c1Anton Korobeynikovpublic: 2172ea0443212e7ec6ff82e2f174e8e948a6eb0e0876Chris Lattner SystemZTargetCodeGenInfo(CodeGenTypes &CGT) 2173ea0443212e7ec6ff82e2f174e8e948a6eb0e0876Chris Lattner : TargetCodeGenInfo(new SystemZABIInfo(CGT)) {} 217482d0a418c8699fc6f4a9417457ffe93d43bba1c1Anton Korobeynikov}; 217582d0a418c8699fc6f4a9417457ffe93d43bba1c1Anton Korobeynikov 217689e887fd73dd87c1118e13ebddf11aed9e25b763Anton Korobeynikov} 217789e887fd73dd87c1118e13ebddf11aed9e25b763Anton Korobeynikov 217889e887fd73dd87c1118e13ebddf11aed9e25b763Anton Korobeynikovbool SystemZABIInfo::isPromotableIntegerType(QualType Ty) const { 217989e887fd73dd87c1118e13ebddf11aed9e25b763Anton Korobeynikov // SystemZ ABI requires all 8, 16 and 32 bit quantities to be extended. 2180183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall if (const BuiltinType *BT = Ty->getAs<BuiltinType>()) 218189e887fd73dd87c1118e13ebddf11aed9e25b763Anton Korobeynikov switch (BT->getKind()) { 218289e887fd73dd87c1118e13ebddf11aed9e25b763Anton Korobeynikov case BuiltinType::Bool: 218389e887fd73dd87c1118e13ebddf11aed9e25b763Anton Korobeynikov case BuiltinType::Char_S: 218489e887fd73dd87c1118e13ebddf11aed9e25b763Anton Korobeynikov case BuiltinType::Char_U: 218589e887fd73dd87c1118e13ebddf11aed9e25b763Anton Korobeynikov case BuiltinType::SChar: 218689e887fd73dd87c1118e13ebddf11aed9e25b763Anton Korobeynikov case BuiltinType::UChar: 218789e887fd73dd87c1118e13ebddf11aed9e25b763Anton Korobeynikov case BuiltinType::Short: 218889e887fd73dd87c1118e13ebddf11aed9e25b763Anton Korobeynikov case BuiltinType::UShort: 218989e887fd73dd87c1118e13ebddf11aed9e25b763Anton Korobeynikov case BuiltinType::Int: 219089e887fd73dd87c1118e13ebddf11aed9e25b763Anton Korobeynikov case BuiltinType::UInt: 219189e887fd73dd87c1118e13ebddf11aed9e25b763Anton Korobeynikov return true; 219289e887fd73dd87c1118e13ebddf11aed9e25b763Anton Korobeynikov default: 219389e887fd73dd87c1118e13ebddf11aed9e25b763Anton Korobeynikov return false; 219489e887fd73dd87c1118e13ebddf11aed9e25b763Anton Korobeynikov } 219589e887fd73dd87c1118e13ebddf11aed9e25b763Anton Korobeynikov return false; 219689e887fd73dd87c1118e13ebddf11aed9e25b763Anton Korobeynikov} 219789e887fd73dd87c1118e13ebddf11aed9e25b763Anton Korobeynikov 219889e887fd73dd87c1118e13ebddf11aed9e25b763Anton Korobeynikovllvm::Value *SystemZABIInfo::EmitVAArg(llvm::Value *VAListAddr, QualType Ty, 219989e887fd73dd87c1118e13ebddf11aed9e25b763Anton Korobeynikov CodeGenFunction &CGF) const { 220089e887fd73dd87c1118e13ebddf11aed9e25b763Anton Korobeynikov // FIXME: Implement 220189e887fd73dd87c1118e13ebddf11aed9e25b763Anton Korobeynikov return 0; 220289e887fd73dd87c1118e13ebddf11aed9e25b763Anton Korobeynikov} 220389e887fd73dd87c1118e13ebddf11aed9e25b763Anton Korobeynikov 220489e887fd73dd87c1118e13ebddf11aed9e25b763Anton Korobeynikov 2205a3c109bbf6e198f463fbe204da4d25b40dab65c4Chris LattnerABIArgInfo SystemZABIInfo::classifyReturnType(QualType RetTy) const { 2206a3c109bbf6e198f463fbe204da4d25b40dab65c4Chris Lattner if (RetTy->isVoidType()) 220789e887fd73dd87c1118e13ebddf11aed9e25b763Anton Korobeynikov return ABIArgInfo::getIgnore(); 2208a3c109bbf6e198f463fbe204da4d25b40dab65c4Chris Lattner if (CodeGenFunction::hasAggregateLLVMType(RetTy)) 220989e887fd73dd87c1118e13ebddf11aed9e25b763Anton Korobeynikov return ABIArgInfo::getIndirect(0); 2210a3c109bbf6e198f463fbe204da4d25b40dab65c4Chris Lattner 2211a3c109bbf6e198f463fbe204da4d25b40dab65c4Chris Lattner return (isPromotableIntegerType(RetTy) ? 2212a3c109bbf6e198f463fbe204da4d25b40dab65c4Chris Lattner ABIArgInfo::getExtend() : ABIArgInfo::getDirect()); 221389e887fd73dd87c1118e13ebddf11aed9e25b763Anton Korobeynikov} 221489e887fd73dd87c1118e13ebddf11aed9e25b763Anton Korobeynikov 2215a3c109bbf6e198f463fbe204da4d25b40dab65c4Chris LattnerABIArgInfo SystemZABIInfo::classifyArgumentType(QualType Ty) const { 2216a3c109bbf6e198f463fbe204da4d25b40dab65c4Chris Lattner if (CodeGenFunction::hasAggregateLLVMType(Ty)) 221789e887fd73dd87c1118e13ebddf11aed9e25b763Anton Korobeynikov return ABIArgInfo::getIndirect(0); 2218a3c109bbf6e198f463fbe204da4d25b40dab65c4Chris Lattner 2219a3c109bbf6e198f463fbe204da4d25b40dab65c4Chris Lattner return (isPromotableIntegerType(Ty) ? 2220a3c109bbf6e198f463fbe204da4d25b40dab65c4Chris Lattner ABIArgInfo::getExtend() : ABIArgInfo::getDirect()); 222189e887fd73dd87c1118e13ebddf11aed9e25b763Anton Korobeynikov} 222289e887fd73dd87c1118e13ebddf11aed9e25b763Anton Korobeynikov 2223dce5ad0cf70ba74e1ecdbb5e81f1a81d97821636Chris Lattner//===----------------------------------------------------------------------===// 222482d0a418c8699fc6f4a9417457ffe93d43bba1c1Anton Korobeynikov// MSP430 ABI Implementation 2225dce5ad0cf70ba74e1ecdbb5e81f1a81d97821636Chris Lattner//===----------------------------------------------------------------------===// 222682d0a418c8699fc6f4a9417457ffe93d43bba1c1Anton Korobeynikov 222782d0a418c8699fc6f4a9417457ffe93d43bba1c1Anton Korobeynikovnamespace { 222882d0a418c8699fc6f4a9417457ffe93d43bba1c1Anton Korobeynikov 222982d0a418c8699fc6f4a9417457ffe93d43bba1c1Anton Korobeynikovclass MSP430TargetCodeGenInfo : public TargetCodeGenInfo { 223082d0a418c8699fc6f4a9417457ffe93d43bba1c1Anton Korobeynikovpublic: 2231ea0443212e7ec6ff82e2f174e8e948a6eb0e0876Chris Lattner MSP430TargetCodeGenInfo(CodeGenTypes &CGT) 2232ea0443212e7ec6ff82e2f174e8e948a6eb0e0876Chris Lattner : TargetCodeGenInfo(new DefaultABIInfo(CGT)) {} 223382d0a418c8699fc6f4a9417457ffe93d43bba1c1Anton Korobeynikov void SetTargetAttributes(const Decl *D, llvm::GlobalValue *GV, 223482d0a418c8699fc6f4a9417457ffe93d43bba1c1Anton Korobeynikov CodeGen::CodeGenModule &M) const; 223582d0a418c8699fc6f4a9417457ffe93d43bba1c1Anton Korobeynikov}; 223682d0a418c8699fc6f4a9417457ffe93d43bba1c1Anton Korobeynikov 2237c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov} 2238c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 223982d0a418c8699fc6f4a9417457ffe93d43bba1c1Anton Korobeynikovvoid MSP430TargetCodeGenInfo::SetTargetAttributes(const Decl *D, 224082d0a418c8699fc6f4a9417457ffe93d43bba1c1Anton Korobeynikov llvm::GlobalValue *GV, 224182d0a418c8699fc6f4a9417457ffe93d43bba1c1Anton Korobeynikov CodeGen::CodeGenModule &M) const { 224282d0a418c8699fc6f4a9417457ffe93d43bba1c1Anton Korobeynikov if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(D)) { 224382d0a418c8699fc6f4a9417457ffe93d43bba1c1Anton Korobeynikov if (const MSP430InterruptAttr *attr = FD->getAttr<MSP430InterruptAttr>()) { 224482d0a418c8699fc6f4a9417457ffe93d43bba1c1Anton Korobeynikov // Handle 'interrupt' attribute: 224582d0a418c8699fc6f4a9417457ffe93d43bba1c1Anton Korobeynikov llvm::Function *F = cast<llvm::Function>(GV); 224682d0a418c8699fc6f4a9417457ffe93d43bba1c1Anton Korobeynikov 224782d0a418c8699fc6f4a9417457ffe93d43bba1c1Anton Korobeynikov // Step 1: Set ISR calling convention. 224882d0a418c8699fc6f4a9417457ffe93d43bba1c1Anton Korobeynikov F->setCallingConv(llvm::CallingConv::MSP430_INTR); 224982d0a418c8699fc6f4a9417457ffe93d43bba1c1Anton Korobeynikov 225082d0a418c8699fc6f4a9417457ffe93d43bba1c1Anton Korobeynikov // Step 2: Add attributes goodness. 225182d0a418c8699fc6f4a9417457ffe93d43bba1c1Anton Korobeynikov F->addFnAttr(llvm::Attribute::NoInline); 225282d0a418c8699fc6f4a9417457ffe93d43bba1c1Anton Korobeynikov 225382d0a418c8699fc6f4a9417457ffe93d43bba1c1Anton Korobeynikov // Step 3: Emit ISR vector alias. 225482d0a418c8699fc6f4a9417457ffe93d43bba1c1Anton Korobeynikov unsigned Num = attr->getNumber() + 0xffe0; 225582d0a418c8699fc6f4a9417457ffe93d43bba1c1Anton Korobeynikov new llvm::GlobalAlias(GV->getType(), llvm::Function::ExternalLinkage, 225682d0a418c8699fc6f4a9417457ffe93d43bba1c1Anton Korobeynikov "vector_" + 225782d0a418c8699fc6f4a9417457ffe93d43bba1c1Anton Korobeynikov llvm::LowercaseString(llvm::utohexstr(Num)), 225882d0a418c8699fc6f4a9417457ffe93d43bba1c1Anton Korobeynikov GV, &M.getModule()); 225982d0a418c8699fc6f4a9417457ffe93d43bba1c1Anton Korobeynikov } 226082d0a418c8699fc6f4a9417457ffe93d43bba1c1Anton Korobeynikov } 2261c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov} 2262c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 2263dce5ad0cf70ba74e1ecdbb5e81f1a81d97821636Chris Lattner//===----------------------------------------------------------------------===// 2264aeeb7011a875d3dd439e9fa07dc3ac54d97785b9John McCall// MIPS ABI Implementation. This works for both little-endian and 2265aeeb7011a875d3dd439e9fa07dc3ac54d97785b9John McCall// big-endian variants. 2266dce5ad0cf70ba74e1ecdbb5e81f1a81d97821636Chris Lattner//===----------------------------------------------------------------------===// 2267dce5ad0cf70ba74e1ecdbb5e81f1a81d97821636Chris Lattner 2268aeeb7011a875d3dd439e9fa07dc3ac54d97785b9John McCallnamespace { 2269aeeb7011a875d3dd439e9fa07dc3ac54d97785b9John McCallclass MIPSTargetCodeGenInfo : public TargetCodeGenInfo { 2270aeeb7011a875d3dd439e9fa07dc3ac54d97785b9John McCallpublic: 2271ea0443212e7ec6ff82e2f174e8e948a6eb0e0876Chris Lattner MIPSTargetCodeGenInfo(CodeGenTypes &CGT) 2272ea0443212e7ec6ff82e2f174e8e948a6eb0e0876Chris Lattner : TargetCodeGenInfo(new DefaultABIInfo(CGT)) {} 2273aeeb7011a875d3dd439e9fa07dc3ac54d97785b9John McCall 2274aeeb7011a875d3dd439e9fa07dc3ac54d97785b9John McCall int getDwarfEHStackPointer(CodeGen::CodeGenModule &CGM) const { 2275aeeb7011a875d3dd439e9fa07dc3ac54d97785b9John McCall return 29; 2276aeeb7011a875d3dd439e9fa07dc3ac54d97785b9John McCall } 2277aeeb7011a875d3dd439e9fa07dc3ac54d97785b9John McCall 2278aeeb7011a875d3dd439e9fa07dc3ac54d97785b9John McCall bool initDwarfEHRegSizeTable(CodeGen::CodeGenFunction &CGF, 2279aeeb7011a875d3dd439e9fa07dc3ac54d97785b9John McCall llvm::Value *Address) const; 2280aeeb7011a875d3dd439e9fa07dc3ac54d97785b9John McCall}; 2281aeeb7011a875d3dd439e9fa07dc3ac54d97785b9John McCall} 2282aeeb7011a875d3dd439e9fa07dc3ac54d97785b9John McCall 2283aeeb7011a875d3dd439e9fa07dc3ac54d97785b9John McCallbool 2284aeeb7011a875d3dd439e9fa07dc3ac54d97785b9John McCallMIPSTargetCodeGenInfo::initDwarfEHRegSizeTable(CodeGen::CodeGenFunction &CGF, 2285aeeb7011a875d3dd439e9fa07dc3ac54d97785b9John McCall llvm::Value *Address) const { 2286aeeb7011a875d3dd439e9fa07dc3ac54d97785b9John McCall // This information comes from gcc's implementation, which seems to 2287aeeb7011a875d3dd439e9fa07dc3ac54d97785b9John McCall // as canonical as it gets. 2288aeeb7011a875d3dd439e9fa07dc3ac54d97785b9John McCall 2289aeeb7011a875d3dd439e9fa07dc3ac54d97785b9John McCall CodeGen::CGBuilderTy &Builder = CGF.Builder; 2290aeeb7011a875d3dd439e9fa07dc3ac54d97785b9John McCall llvm::LLVMContext &Context = CGF.getLLVMContext(); 2291aeeb7011a875d3dd439e9fa07dc3ac54d97785b9John McCall 2292aeeb7011a875d3dd439e9fa07dc3ac54d97785b9John McCall // Everything on MIPS is 4 bytes. Double-precision FP registers 2293aeeb7011a875d3dd439e9fa07dc3ac54d97785b9John McCall // are aliased to pairs of single-precision FP registers. 2294aeeb7011a875d3dd439e9fa07dc3ac54d97785b9John McCall const llvm::IntegerType *i8 = llvm::Type::getInt8Ty(Context); 2295aeeb7011a875d3dd439e9fa07dc3ac54d97785b9John McCall llvm::Value *Four8 = llvm::ConstantInt::get(i8, 4); 2296aeeb7011a875d3dd439e9fa07dc3ac54d97785b9John McCall 2297aeeb7011a875d3dd439e9fa07dc3ac54d97785b9John McCall // 0-31 are the general purpose registers, $0 - $31. 2298aeeb7011a875d3dd439e9fa07dc3ac54d97785b9John McCall // 32-63 are the floating-point registers, $f0 - $f31. 2299aeeb7011a875d3dd439e9fa07dc3ac54d97785b9John McCall // 64 and 65 are the multiply/divide registers, $hi and $lo. 2300aeeb7011a875d3dd439e9fa07dc3ac54d97785b9John McCall // 66 is the (notional, I think) register for signal-handler return. 2301aeeb7011a875d3dd439e9fa07dc3ac54d97785b9John McCall AssignToArrayRange(Builder, Address, Four8, 0, 65); 2302aeeb7011a875d3dd439e9fa07dc3ac54d97785b9John McCall 2303aeeb7011a875d3dd439e9fa07dc3ac54d97785b9John McCall // 67-74 are the floating-point status registers, $fcc0 - $fcc7. 2304aeeb7011a875d3dd439e9fa07dc3ac54d97785b9John McCall // They are one bit wide and ignored here. 2305aeeb7011a875d3dd439e9fa07dc3ac54d97785b9John McCall 2306aeeb7011a875d3dd439e9fa07dc3ac54d97785b9John McCall // 80-111 are the coprocessor 0 registers, $c0r0 - $c0r31. 2307aeeb7011a875d3dd439e9fa07dc3ac54d97785b9John McCall // (coprocessor 1 is the FP unit) 2308aeeb7011a875d3dd439e9fa07dc3ac54d97785b9John McCall // 112-143 are the coprocessor 2 registers, $c2r0 - $c2r31. 2309aeeb7011a875d3dd439e9fa07dc3ac54d97785b9John McCall // 144-175 are the coprocessor 3 registers, $c3r0 - $c3r31. 2310aeeb7011a875d3dd439e9fa07dc3ac54d97785b9John McCall // 176-181 are the DSP accumulator registers. 2311aeeb7011a875d3dd439e9fa07dc3ac54d97785b9John McCall AssignToArrayRange(Builder, Address, Four8, 80, 181); 2312aeeb7011a875d3dd439e9fa07dc3ac54d97785b9John McCall 2313aeeb7011a875d3dd439e9fa07dc3ac54d97785b9John McCall return false; 2314aeeb7011a875d3dd439e9fa07dc3ac54d97785b9John McCall} 2315aeeb7011a875d3dd439e9fa07dc3ac54d97785b9John McCall 2316aeeb7011a875d3dd439e9fa07dc3ac54d97785b9John McCall 2317ea0443212e7ec6ff82e2f174e8e948a6eb0e0876Chris Lattnerconst TargetCodeGenInfo &CodeGenModule::getTargetCodeGenInfo() { 231882d0a418c8699fc6f4a9417457ffe93d43bba1c1Anton Korobeynikov if (TheTargetCodeGenInfo) 231982d0a418c8699fc6f4a9417457ffe93d43bba1c1Anton Korobeynikov return *TheTargetCodeGenInfo; 2320c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov 232182d0a418c8699fc6f4a9417457ffe93d43bba1c1Anton Korobeynikov // For now we just cache the TargetCodeGenInfo in CodeGenModule and don't 232282d0a418c8699fc6f4a9417457ffe93d43bba1c1Anton Korobeynikov // free it. 23232c0843f166a82f251b20370fadab57878969e7aaDaniel Dunbar 23249c254f0415bef9a0bafe5b5026ddb54b727597b1Chris Lattner const llvm::Triple &Triple = getContext().Target.getTriple(); 23251752ee4849f4c37f5e03193e658be92650b0e65aDaniel Dunbar switch (Triple.getArch()) { 23262c0843f166a82f251b20370fadab57878969e7aaDaniel Dunbar default: 2327ea0443212e7ec6ff82e2f174e8e948a6eb0e0876Chris Lattner return *(TheTargetCodeGenInfo = new DefaultTargetCodeGenInfo(Types)); 23282c0843f166a82f251b20370fadab57878969e7aaDaniel Dunbar 2329aeeb7011a875d3dd439e9fa07dc3ac54d97785b9John McCall case llvm::Triple::mips: 2330aeeb7011a875d3dd439e9fa07dc3ac54d97785b9John McCall case llvm::Triple::mipsel: 2331ea0443212e7ec6ff82e2f174e8e948a6eb0e0876Chris Lattner return *(TheTargetCodeGenInfo = new MIPSTargetCodeGenInfo(Types)); 2332aeeb7011a875d3dd439e9fa07dc3ac54d97785b9John McCall 233334d91fddd0252d64456cdcea0bd22073f006f4e2Daniel Dunbar case llvm::Triple::arm: 233434d91fddd0252d64456cdcea0bd22073f006f4e2Daniel Dunbar case llvm::Triple::thumb: 23355e7bacef79f7725f4abc45e2a5eccedae40dfcd3Daniel Dunbar // FIXME: We want to know the float calling convention as well. 2336018ba5ab0671d9b6eefecaffc118c869bea151a1Daniel Dunbar if (strcmp(getContext().Target.getABI(), "apcs-gnu") == 0) 233782d0a418c8699fc6f4a9417457ffe93d43bba1c1Anton Korobeynikov return *(TheTargetCodeGenInfo = 2338ea0443212e7ec6ff82e2f174e8e948a6eb0e0876Chris Lattner new ARMTargetCodeGenInfo(Types, ARMABIInfo::APCS)); 23395e7bacef79f7725f4abc45e2a5eccedae40dfcd3Daniel Dunbar 234082d0a418c8699fc6f4a9417457ffe93d43bba1c1Anton Korobeynikov return *(TheTargetCodeGenInfo = 2341ea0443212e7ec6ff82e2f174e8e948a6eb0e0876Chris Lattner new ARMTargetCodeGenInfo(Types, ARMABIInfo::AAPCS)); 234234d91fddd0252d64456cdcea0bd22073f006f4e2Daniel Dunbar 234334d91fddd0252d64456cdcea0bd22073f006f4e2Daniel Dunbar case llvm::Triple::pic16: 2344ea0443212e7ec6ff82e2f174e8e948a6eb0e0876Chris Lattner return *(TheTargetCodeGenInfo = new PIC16TargetCodeGenInfo(Types)); 234534d91fddd0252d64456cdcea0bd22073f006f4e2Daniel Dunbar 2346ec853ba1087f606e9685cb1e800616565ba35093John McCall case llvm::Triple::ppc: 2347ea0443212e7ec6ff82e2f174e8e948a6eb0e0876Chris Lattner return *(TheTargetCodeGenInfo = new PPC32TargetCodeGenInfo(Types)); 2348ec853ba1087f606e9685cb1e800616565ba35093John McCall 234934d91fddd0252d64456cdcea0bd22073f006f4e2Daniel Dunbar case llvm::Triple::systemz: 2350ea0443212e7ec6ff82e2f174e8e948a6eb0e0876Chris Lattner return *(TheTargetCodeGenInfo = new SystemZTargetCodeGenInfo(Types)); 235182d0a418c8699fc6f4a9417457ffe93d43bba1c1Anton Korobeynikov 235282d0a418c8699fc6f4a9417457ffe93d43bba1c1Anton Korobeynikov case llvm::Triple::msp430: 2353ea0443212e7ec6ff82e2f174e8e948a6eb0e0876Chris Lattner return *(TheTargetCodeGenInfo = new MSP430TargetCodeGenInfo(Types)); 235434d91fddd0252d64456cdcea0bd22073f006f4e2Daniel Dunbar 23551752ee4849f4c37f5e03193e658be92650b0e65aDaniel Dunbar case llvm::Triple::x86: 23561752ee4849f4c37f5e03193e658be92650b0e65aDaniel Dunbar switch (Triple.getOS()) { 23577ee68bd706c0ade45d3d1e85c77e25678f5ab1e8Edward O'Callaghan case llvm::Triple::Darwin: 235882d0a418c8699fc6f4a9417457ffe93d43bba1c1Anton Korobeynikov return *(TheTargetCodeGenInfo = 2359ea0443212e7ec6ff82e2f174e8e948a6eb0e0876Chris Lattner new X86_32TargetCodeGenInfo(Types, true, true)); 23602c0843f166a82f251b20370fadab57878969e7aaDaniel Dunbar case llvm::Triple::Cygwin: 23612c0843f166a82f251b20370fadab57878969e7aaDaniel Dunbar case llvm::Triple::MinGW32: 23622c0843f166a82f251b20370fadab57878969e7aaDaniel Dunbar case llvm::Triple::MinGW64: 2363727e268bd2974a7b16af65a5cfdfe47da9ebeb6cEdward O'Callaghan case llvm::Triple::AuroraUX: 2364727e268bd2974a7b16af65a5cfdfe47da9ebeb6cEdward O'Callaghan case llvm::Triple::DragonFly: 236575c135a511c855d94bbfa7f00dd27a165f61e953David Chisnall case llvm::Triple::FreeBSD: 23662c0843f166a82f251b20370fadab57878969e7aaDaniel Dunbar case llvm::Triple::OpenBSD: 236782d0a418c8699fc6f4a9417457ffe93d43bba1c1Anton Korobeynikov return *(TheTargetCodeGenInfo = 2368ea0443212e7ec6ff82e2f174e8e948a6eb0e0876Chris Lattner new X86_32TargetCodeGenInfo(Types, false, true)); 23692c0843f166a82f251b20370fadab57878969e7aaDaniel Dunbar 23702c0843f166a82f251b20370fadab57878969e7aaDaniel Dunbar default: 237182d0a418c8699fc6f4a9417457ffe93d43bba1c1Anton Korobeynikov return *(TheTargetCodeGenInfo = 2372ea0443212e7ec6ff82e2f174e8e948a6eb0e0876Chris Lattner new X86_32TargetCodeGenInfo(Types, false, false)); 2373c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov } 23742c0843f166a82f251b20370fadab57878969e7aaDaniel Dunbar 23752c0843f166a82f251b20370fadab57878969e7aaDaniel Dunbar case llvm::Triple::x86_64: 2376ea0443212e7ec6ff82e2f174e8e948a6eb0e0876Chris Lattner return *(TheTargetCodeGenInfo = new X86_64TargetCodeGenInfo(Types)); 2377c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov } 2378c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov} 2379