clang  6.0.0svn
Namespaces | Enumerations | Functions
TargetInfo.cpp File Reference
#include "TargetInfo.h"
#include "ABIInfo.h"
#include "CGBlocks.h"
#include "CGCXXABI.h"
#include "CGValue.h"
#include "CodeGenFunction.h"
#include "clang/AST/RecordLayout.h"
#include "clang/CodeGen/CGFunctionInfo.h"
#include "clang/CodeGen/SwiftCallingConv.h"
#include "clang/Frontend/CodeGenOptions.h"
#include "llvm/ADT/StringExtras.h"
#include "llvm/ADT/StringSwitch.h"
#include "llvm/ADT/Triple.h"
#include "llvm/ADT/Twine.h"
#include "llvm/IR/DataLayout.h"
#include "llvm/IR/Type.h"
#include "llvm/Support/raw_ostream.h"
#include <algorithm>
Include dependency graph for TargetInfo.cpp:

Go to the source code of this file.

Namespaces

 clang
 Dataflow Directional Tag Classes.
 
 clang::CodeGen
 

Enumerations

enum  
 
enum  X86AVXABILevel
 The AVX ABI level for X86 targets. More...
 

Functions

static ABIArgInfo coerceToIntArray (QualType Ty, ASTContext &Context, llvm::LLVMContext &LLVMContext)
 
static void AssignToArrayRange (CodeGen::CGBuilderTy &Builder, llvm::Value *Array, llvm::Value *Value, unsigned FirstIndex, unsigned LastIndex)
 
static bool isAggregateTypeForABI (QualType T)
 
static bool occupiesMoreThan (CodeGenTypes &cgt, ArrayRef< llvm::Type *> scalarTypes, unsigned maxAllRegisters)
 Does the given lowering require more than the given number of registers when expanded? More...
 
static CGCXXABI::RecordArgABI getRecordArgABI (const RecordType *RT, CGCXXABI &CXXABI)
 
static CGCXXABI::RecordArgABI getRecordArgABI (QualType T, CGCXXABI &CXXABI)
 
static QualType useFirstFieldIfTransparentUnion (QualType Ty)
 Pass transparent unions as if they were the type of the first element. More...
 
static llvm::ValueemitRoundPointerUpToAlignment (CodeGenFunction &CGF, llvm::Value *Ptr, CharUnits Align)
 
static Address emitVoidPtrDirectVAArg (CodeGenFunction &CGF, Address VAListAddr, llvm::Type *DirectTy, CharUnits DirectSize, CharUnits DirectAlign, CharUnits SlotSize, bool AllowHigherAlign)
 Emit va_arg for a platform using the common void* representation, where arguments are simply emitted in an array of slots on the stack. More...
 
static Address emitVoidPtrVAArg (CodeGenFunction &CGF, Address VAListAddr, QualType ValueTy, bool IsIndirect, std::pair< CharUnits, CharUnits > ValueInfo, CharUnits SlotSizeAndAlign, bool AllowHigherAlign)
 Emit va_arg for a platform using the common void* representation, where arguments are simply emitted in an array of slots on the stack. More...
 
static Address emitMergePHI (CodeGenFunction &CGF, Address Addr1, llvm::BasicBlock *Block1, Address Addr2, llvm::BasicBlock *Block2, const llvm::Twine &Name="")
 
static bool isEmptyRecord (ASTContext &Context, QualType T, bool AllowArrays)
 isEmptyRecord - Return true iff a structure contains only empty fields. More...
 
static bool isEmptyField (ASTContext &Context, const FieldDecl *FD, bool AllowArrays)
 isEmptyField - Return true iff a the field is "empty", that is it is an unnamed bit-field or an (array of) empty record(s). More...
 
static const TypeisSingleElementStruct (QualType T, ASTContext &Context)
 isSingleElementStruct - Determine if a structure is a "single element struct", i.e. More...
 
static void rewriteInputConstraintReferences (unsigned FirstIn, unsigned NumNewOuts, std::string &AsmString)
 Rewrite input constraint references after adding some output constraints. More...
 
static bool is32Or64BitBasicType (QualType Ty, ASTContext &Context)
 
static bool addFieldSizes (ASTContext &Context, const RecordDecl *RD, uint64_t &Size)
 
static bool addBaseAndFieldSizes (ASTContext &Context, const CXXRecordDecl *RD, uint64_t &Size)
 
static bool isSSEVectorType (ASTContext &Context, QualType Ty)
 
static bool isRecordWithSSEVectorType (ASTContext &Context, QualType Ty)
 
static bool isArgInAlloca (const ABIArgInfo &Info)
 
static bool BitsContainNoUserData (QualType Ty, unsigned StartBit, unsigned EndBit, ASTContext &Context)
 BitsContainNoUserData - Return true if the specified [start,end) bit range is known to either be off the end of the specified type or being in alignment padding. More...
 
static bool ContainsFloatAtOffset (llvm::Type *IRType, unsigned IROffset, const llvm::DataLayout &TD)
 ContainsFloatAtOffset - Return true if the specified LLVM IR type has a float member at the specified offset. More...
 
static llvm::Type * GetX86_64ByValArgumentPair (llvm::Type *Lo, llvm::Type *Hi, const llvm::DataLayout &TD)
 GetX86_64ByValArgumentPair - Given a high and low type that can ideally be used as elements of a two register pair to pass or return, return a first class aggregate to represent them. More...
 
static Address EmitX86_64VAArgFromMemory (CodeGenFunction &CGF, Address VAListAddr, QualType Ty)
 
static bool PPC64_initDwarfEHRegSizeTable (CodeGen::CodeGenFunction &CGF, llvm::Value *Address)
 
static bool isIntegerLikeType (QualType Ty, ASTContext &Context, llvm::LLVMContext &VMContext)
 
static bool getTypeString (SmallStringEnc &Enc, const Decl *D, CodeGen::CodeGenModule &CGM, TypeStringCache &TSC)
 The XCore ABI includes a type information section that communicates symbol type information to the linker. More...
 
void clang::CodeGen::computeSPIRKernelABIInfo (CodeGenModule &CGM, CGFunctionInfo &FI)
 
static bool appendType (SmallStringEnc &Enc, QualType QType, const CodeGen::CodeGenModule &CGM, TypeStringCache &TSC)
 Handles the type's qualifier before dispatching a call to handle specific type encodings. More...
 
static bool extractFieldType (SmallVectorImpl< FieldEncoding > &FE, const RecordDecl *RD, const CodeGen::CodeGenModule &CGM, TypeStringCache &TSC)
 Helper function for appendRecordType(). More...
 
static bool appendRecordType (SmallStringEnc &Enc, const RecordType *RT, const CodeGen::CodeGenModule &CGM, TypeStringCache &TSC, const IdentifierInfo *ID)
 Appends structure and union types to Enc and adds encoding to cache. More...
 
static bool appendEnumType (SmallStringEnc &Enc, const EnumType *ET, TypeStringCache &TSC, const IdentifierInfo *ID)
 Appends enum types to Enc and adds the encoding to the cache. More...
 
static void appendQualifier (SmallStringEnc &Enc, QualType QT)
 Appends type's qualifier to Enc. More...
 
static bool appendBuiltinType (SmallStringEnc &Enc, const BuiltinType *BT)
 Appends built-in types to Enc. More...
 
static bool appendPointerType (SmallStringEnc &Enc, const PointerType *PT, const CodeGen::CodeGenModule &CGM, TypeStringCache &TSC)
 Appends a pointer encoding to Enc before calling appendType for the pointee. More...
 
static bool appendArrayType (SmallStringEnc &Enc, QualType QT, const ArrayType *AT, const CodeGen::CodeGenModule &CGM, TypeStringCache &TSC, StringRef NoSizeEnc)
 Appends array encoding to Enc before calling appendType for the element. More...
 
static bool appendFunctionType (SmallStringEnc &Enc, const FunctionType *FT, const CodeGen::CodeGenModule &CGM, TypeStringCache &TSC)
 Appends a function encoding to Enc, calling appendType for the return type and the arguments. More...
 

Enumeration Type Documentation

◆ anonymous enum

anonymous enum

Definition at line 944 of file TargetInfo.cpp.

◆ X86AVXABILevel

enum X86AVXABILevel
strong

The AVX ABI level for X86 targets.

Definition at line 1992 of file TargetInfo.cpp.

Function Documentation

◆ addBaseAndFieldSizes()

static bool addBaseAndFieldSizes ( ASTContext Context,
const CXXRecordDecl RD,
uint64_t &  Size 
)
static

◆ addFieldSizes()

static bool addFieldSizes ( ASTContext Context,
const RecordDecl RD,
uint64_t &  Size 
)
static

Definition at line 1249 of file TargetInfo.cpp.

References clang::RecordDecl::fields(), and is32Or64BitBasicType().

Referenced by addBaseAndFieldSizes().

◆ appendArrayType()

static bool appendArrayType ( SmallStringEnc &  Enc,
QualType  QT,
const ArrayType AT,
const CodeGen::CodeGenModule CGM,
TypeStringCache &  TSC,
StringRef  NoSizeEnc 
)
static

Appends array encoding to Enc before calling appendType for the element.

Definition at line 8667 of file TargetInfo.cpp.

References appendQualifier(), appendType(), clang::ArrayType::getElementType(), clang::ArrayType::getSizeModifier(), and clang::ArrayType::Normal.

Referenced by appendType(), and getTypeString().

◆ appendBuiltinType()

static bool appendBuiltinType ( SmallStringEnc &  Enc,
const BuiltinType BT 
)
static

Appends built-in types to Enc.

Definition at line 8597 of file TargetInfo.cpp.

References clang::BuiltinType::getKind().

Referenced by appendType().

◆ appendEnumType()

static bool appendEnumType ( SmallStringEnc &  Enc,
const EnumType ET,
TypeStringCache &  TSC,
const IdentifierInfo ID 
)
static

Appends enum types to Enc and adds the encoding to the cache.

Definition at line 8539 of file TargetInfo.cpp.

References clang::EnumType::getDecl(), clang::EnumDecl::getDefinition(), and clang::IdentifierInfo::getName().

Referenced by appendType().

◆ appendFunctionType()

static bool appendFunctionType ( SmallStringEnc &  Enc,
const FunctionType FT,
const CodeGen::CodeGenModule CGM,
TypeStringCache &  TSC 
)
static

Appends a function encoding to Enc, calling appendType for the return type and the arguments.

Definition at line 8689 of file TargetInfo.cpp.

References appendType(), clang::Type::getAs(), and clang::FunctionType::getReturnType().

Referenced by appendType().

◆ appendPointerType()

static bool appendPointerType ( SmallStringEnc &  Enc,
const PointerType PT,
const CodeGen::CodeGenModule CGM,
TypeStringCache &  TSC 
)
static

Appends a pointer encoding to Enc before calling appendType for the pointee.

Definition at line 8656 of file TargetInfo.cpp.

References appendType(), and clang::PointerType::getPointeeType().

Referenced by appendType().

◆ appendQualifier()

static void appendQualifier ( SmallStringEnc &  Enc,
QualType  QT 
)
static

Appends type's qualifier to Enc.

This is done prior to appending the type's encoding.

Definition at line 8583 of file TargetInfo.cpp.

References clang::QualType::isConstQualified(), clang::QualType::isRestrictQualified(), and clang::QualType::isVolatileQualified().

Referenced by appendArrayType(), and appendType().

◆ appendRecordType()

static bool appendRecordType ( SmallStringEnc &  Enc,
const RecordType RT,
const CodeGen::CodeGenModule CGM,
TypeStringCache &  TSC,
const IdentifierInfo ID 
)
static

Appends structure and union types to Enc and adds encoding to cache.

Recursively calls appendType (via extractFieldType) for each field. Union types have their fields ordered according to the ABI.

Definition at line 8487 of file TargetInfo.cpp.

References extractFieldType(), clang::RecordDecl::field_empty(), clang::RecordType::getDecl(), clang::RecordDecl::getDefinition(), clang::IdentifierInfo::getName(), and clang::Type::isUnionType().

Referenced by appendType().

◆ appendType()

static bool appendType ( SmallStringEnc &  Enc,
QualType  QType,
const CodeGen::CodeGenModule CGM,
TypeStringCache &  TSC 
)
static

◆ AssignToArrayRange()

static void AssignToArrayRange ( CodeGen::CGBuilderTy Builder,
llvm::Value Array,
llvm::Value Value,
unsigned  FirstIndex,
unsigned  LastIndex 
)
static

Definition at line 62 of file TargetInfo.cpp.

◆ BitsContainNoUserData()

static bool BitsContainNoUserData ( QualType  Ty,
unsigned  StartBit,
unsigned  EndBit,
ASTContext Context 
)
static

BitsContainNoUserData - Return true if the specified [start,end) bit range is known to either be off the end of the specified type or being in alignment padding.

The user type specified is known to be at most 128 bits in size, and have passed through X86_64ABIInfo::classify with a successful classification that put one of the two halves in the INTEGER class.

It is conservatively correct to return false.

Definition at line 2978 of file TargetInfo.cpp.

References clang::ASTContext::getAsConstantArrayType(), and clang::ASTContext::getTypeSize().

Referenced by ContainsFloatAtOffset().

◆ coerceToIntArray()

static ABIArgInfo coerceToIntArray ( QualType  Ty,
ASTContext Context,
llvm::LLVMContext &  LLVMContext 
)
static

Definition at line 51 of file TargetInfo.cpp.

◆ ContainsFloatAtOffset()

static bool ContainsFloatAtOffset ( llvm::Type *  IRType,
unsigned  IROffset,
const llvm::DataLayout &  TD 
)
static

ContainsFloatAtOffset - Return true if the specified LLVM IR type has a float member at the specified offset.

For example, {int,{float}} has a float at offset 4. It is conservatively correct for this routine to return false.

Definition at line 3059 of file TargetInfo.cpp.

References BitsContainNoUserData(), clang::CodeGen::ABIInfo::getContext(), clang::CodeGen::ABIInfo::getDataLayout(), clang::CharUnits::getQuantity(), clang::ASTContext::getTypeSizeInChars(), clang::CodeGen::ABIInfo::getVMContext(), min(), and clang::CodeGen::Type.

◆ emitMergePHI()

static Address emitMergePHI ( CodeGenFunction CGF,
Address  Addr1,
llvm::BasicBlock *  Block1,
Address  Addr2,
llvm::BasicBlock *  Block2,
const llvm::Twine &  Name = "" 
)
static

Definition at line 362 of file TargetInfo.cpp.

Referenced by EmitX86_64VAArgFromMemory().

◆ emitRoundPointerUpToAlignment()

static llvm::Value* emitRoundPointerUpToAlignment ( CodeGenFunction CGF,
llvm::Value Ptr,
CharUnits  Align 
)
static

◆ emitVoidPtrDirectVAArg()

static Address emitVoidPtrDirectVAArg ( CodeGenFunction CGF,
Address  VAListAddr,
llvm::Type *  DirectTy,
CharUnits  DirectSize,
CharUnits  DirectAlign,
CharUnits  SlotSize,
bool  AllowHigherAlign 
)
static

Emit va_arg for a platform using the common void* representation, where arguments are simply emitted in an array of slots on the stack.

This version implements the core direct-value passing rules.

Parameters
SlotSize- The size and alignment of a stack slot. Each argument will be allocated to a multiple of this number of slots, and all the slots will be aligned to this value.
AllowHigherAlign- The slot alignment is not a cap; an argument type with an alignment greater than the slot size will be emitted on a higher-alignment address, potentially leaving one or more empty slots behind as padding. If this is false, the returned address might be less-aligned than DirectAlign.

Definition at line 275 of file TargetInfo.cpp.

References clang::CharUnits::alignTo(), clang::CodeGen::CodeGenFunction::Builder, clang::CodeGen::CodeGenFunction::CGM, clang::CodeGen::CGBuilderTy::CreateConstInBoundsByteGEP(), clang::CodeGen::CGBuilderTy::CreateElementBitCast(), clang::CodeGen::CGBuilderTy::CreateLoad(), clang::CodeGen::CGBuilderTy::CreateStore(), emitRoundPointerUpToAlignment(), clang::CodeGen::CodeGenModule::getDataLayout(), clang::CodeGen::Address::getElementType(), clang::CodeGen::Address::getPointer(), clang::CodeGen::CodeGenTypeCache::Int8PtrTy, and clang::CodeGen::Address::invalid().

Referenced by emitVoidPtrVAArg().

◆ emitVoidPtrVAArg()

static Address emitVoidPtrVAArg ( CodeGenFunction CGF,
Address  VAListAddr,
QualType  ValueTy,
bool  IsIndirect,
std::pair< CharUnits, CharUnits ValueInfo,
CharUnits  SlotSizeAndAlign,
bool  AllowHigherAlign 
)
static

Emit va_arg for a platform using the common void* representation, where arguments are simply emitted in an array of slots on the stack.

Parameters
IsIndirect- Values of this type are passed indirectly.
ValueInfo- The size and alignment of this type, generally computed with getContext().getTypeInfoInChars(ValueTy).
SlotSizeAndAlign- The size and alignment of a stack slot. Each argument will be allocated to a multiple of this number of slots, and all the slots will be aligned to this value.
AllowHigherAlign- The slot alignment is not a cap; an argument type with an alignment greater than the slot size will be emitted on a higher-alignment address, potentially leaving one or more empty slots behind as padding.

Definition at line 329 of file TargetInfo.cpp.

References clang::CodeGen::CodeGenFunction::Builder, clang::CodeGen::CodeGenFunction::ConvertTypeForMem(), clang::CodeGen::CGBuilderTy::CreateLoad(), emitVoidPtrDirectVAArg(), clang::CodeGen::CodeGenTypeCache::getPointerAlign(), clang::CodeGen::CodeGenTypeCache::getPointerSize(), and clang::CodeGen::Type.

Referenced by EmitX86_64VAArgFromMemory().

◆ EmitX86_64VAArgFromMemory()

static Address EmitX86_64VAArgFromMemory ( CodeGenFunction CGF,
Address  VAListAddr,
QualType  Ty 
)
static

Definition at line 3611 of file TargetInfo.cpp.

References clang::TypeInfo::Align, clang::CodeGen::CodeGenFunction::Builder, clang::CodeGen::ABIInfo::CGT, clang::CodeGen::swiftcall::classifyArgumentType(), clang::CodeGen::CodeGenTypes::ConvertType(), clang::CodeGen::CodeGenFunction::ConvertTypeForMem(), clang::CodeGen::CGBuilderTy::CreateAlignedLoad(), clang::CodeGen::CodeGenFunction::createBasicBlock(), clang::CodeGen::CGBuilderTy::CreateBitCast(), clang::CodeGen::CGBuilderTy::CreateConstInBoundsByteGEP(), clang::CodeGen::CGBuilderTy::CreateElementBitCast(), clang::CodeGen::CGBuilderTy::CreateLoad(), clang::CodeGen::CGBuilderTy::CreateMemCpy(), clang::CodeGen::CodeGenFunction::CreateMemTemp(), clang::CodeGen::CGBuilderTy::CreateStore(), clang::CodeGen::CGBuilderTy::CreateStructGEP(), clang::CodeGen::CodeGenTypeCache::DoubleTy, clang::CodeGen::CodeGenFunction::EmitBlock(), clang::CodeGen::CodeGenFunction::EmitBranch(), emitMergePHI(), emitRoundPointerUpToAlignment(), emitVoidPtrVAArg(), clang::CharUnits::fromQuantity(), clang::Type::getAs(), clang::ASTContext::getCanonicalType(), clang::CodeGen::ABIArgInfo::getCoerceToType(), clang::CodeGen::ABIInfo::getContext(), clang::CodeGen::CodeGenFunction::getContext(), clang::CodeGen::ABIInfo::getCXXABI(), clang::CodeGen::ABIInfo::getDataLayout(), clang::RecordType::getDecl(), clang::CodeGen::ABIArgInfo::getDirect(), clang::CodeGen::ABIArgInfo::getExpand(), clang::CodeGen::ABIArgInfo::getExtend(), clang::CodeGen::ABIArgInfo::getIgnore(), clang::CodeGen::ABIArgInfo::getIndirect(), clang::BuiltinType::getKind(), clang::TargetInfo::getLongDoubleFormat(), clang::CodeGen::ABIInfo::getNaturalAlignIndirect(), clang::CharUnits::getQuantity(), getRecordArgABI(), clang::CodeGen::ABIInfo::getTarget(), clang::ASTContext::getTypeAlignInChars(), clang::ASTContext::getTypeInfo(), clang::ASTContext::getTypeInfoInChars(), clang::ASTContext::getTypeSize(), clang::CodeGen::ABIInfo::getVMContext(), clang::RecordDecl::hasFlexibleArrayMember(), clang::CodeGen::CodeGenTypeCache::Int32Ty, clang::CodeGen::Address::invalid(), clang::Type::isAnyComplexType(), clang::Type::isBuiltinType(), clang::CodeGen::ABIArgInfo::isDirect(), clang::CodeGen::ABIInfo::isHomogeneousAggregate(), clang::Type::isMemberPointerType(), clang::Type::isVectorType(), clang::Type::isVoidType(), clang::CodeGen::CGCXXABI::RAA_DirectInMemory, clang::ASTContext::toCharUnitsFromBits(), clang::CodeGen::Type, clang::TypeInfo::Width, and clang::CharUnits::Zero().

◆ extractFieldType()

static bool extractFieldType ( SmallVectorImpl< FieldEncoding > &  FE,
const RecordDecl RD,
const CodeGen::CodeGenModule CGM,
TypeStringCache &  TSC 
)
static

Helper function for appendRecordType().

Builds a SmallVector containing the encoded field types in declaration order.

Definition at line 8459 of file TargetInfo.cpp.

References appendType(), clang::RecordDecl::fields(), and clang::CodeGen::CodeGenModule::getContext().

Referenced by appendRecordType().

◆ getRecordArgABI() [1/2]

static CGCXXABI::RecordArgABI getRecordArgABI ( const RecordType RT,
CGCXXABI CXXABI 
)
static

◆ getRecordArgABI() [2/2]

static CGCXXABI::RecordArgABI getRecordArgABI ( QualType  T,
CGCXXABI CXXABI 
)
static

◆ getTypeString()

static bool getTypeString ( SmallStringEnc &  Enc,
const Decl D,
CodeGen::CodeGenModule CGM,
TypeStringCache &  TSC 
)
static

The XCore ABI includes a type information section that communicates symbol type information to the linker.

The linker uses this information to verify safety/correctness of things such as array bound and pointers et al. The ABI only requires C (and XC) language modules to emit TypeStrings. This type information (TypeString) is emitted into meta data for all global symbols: definitions, declarations, functions & variables.

The TypeString carries type, qualifier, name, size & value details. Please see 'Tools Development Guide' section 2.16.2 for format details: https://www.xmos.com/download/public/Tools-Development-Guide%28X9114A%29.pdf The output is tested by test/CodeGen/xcore-stringtype.c.

Definition at line 8757 of file TargetInfo.cpp.

References appendArrayType(), appendType(), clang::CLanguageLinkage, and clang::Type::getAsArrayTypeUnsafe().

◆ GetX86_64ByValArgumentPair()

static llvm::Type* GetX86_64ByValArgumentPair ( llvm::Type *  Lo,
llvm::Type *  Hi,
const llvm::DataLayout &  TD 
)
static

◆ is32Or64BitBasicType()

static bool is32Or64BitBasicType ( QualType  Ty,
ASTContext Context 
)
static

◆ isAggregateTypeForABI()

static bool isAggregateTypeForABI ( QualType  T)
static

◆ isArgInAlloca()

static bool isArgInAlloca ( const ABIArgInfo Info)
static

◆ isEmptyField()

static bool isEmptyField ( ASTContext Context,
const FieldDecl FD,
bool  AllowArrays 
)
static

isEmptyField - Return true iff a the field is "empty", that is it is an unnamed bit-field or an (array of) empty record(s).

Definition at line 462 of file TargetInfo.cpp.

References clang::Type::getAs(), clang::ASTContext::getAsConstantArrayType(), clang::RecordType::getDecl(), clang::ValueDecl::getType(), isEmptyRecord(), and clang::FieldDecl::isUnnamedBitfield().

◆ isEmptyRecord()

static bool isEmptyRecord ( ASTContext Context,
QualType  T,
bool  AllowArrays 
)
static

isEmptyRecord - Return true iff a structure contains only empty fields.

Note that a structure with a flexible array member is not considered empty.

Definition at line 495 of file TargetInfo.cpp.

References clang::Type::getAs(), clang::RecordType::getDecl(), and clang::RecordDecl::hasFlexibleArrayMember().

Referenced by addBaseAndFieldSizes(), and isEmptyField().

◆ isIntegerLikeType()

static bool isIntegerLikeType ( QualType  Ty,
ASTContext Context,
llvm::LLVMContext &  VMContext 
)
static

◆ isRecordWithSSEVectorType()

static bool isRecordWithSSEVectorType ( ASTContext Context,
QualType  Ty 
)
static

Definition at line 1415 of file TargetInfo.cpp.

References clang::Type::getAs(), and clang::RecordType::getDecl().

◆ isSingleElementStruct()

static const Type* isSingleElementStruct ( QualType  T,
ASTContext Context 
)
static

isSingleElementStruct - Determine if a structure is a "single element struct", i.e.

it has exactly one non-empty field or exactly one field which is itself a single element struct. Structures with flexible array members are never considered single element structs.

Returns
The field declaration for the single non-empty field, if it exists.

Definition at line 523 of file TargetInfo.cpp.

References clang::Type::getAs(), clang::RecordType::getDecl(), and clang::RecordDecl::hasFlexibleArrayMember().

Referenced by addBaseAndFieldSizes().

◆ isSSEVectorType()

static bool isSSEVectorType ( ASTContext Context,
QualType  Ty 
)
static

Definition at line 1411 of file TargetInfo.cpp.

References clang::Type::getAs(), and clang::ASTContext::getTypeSize().

◆ occupiesMoreThan()

static bool occupiesMoreThan ( CodeGenTypes cgt,
ArrayRef< llvm::Type *>  scalarTypes,
unsigned  maxAllRegisters 
)
static

Does the given lowering require more than the given number of registers when expanded?

This is intended to be the basis of a reasonable basic implementation of should{Pass,Return}IndirectlyForSwift.

For most targets, a limit of four total registers is reasonable; this limits the amount of code required in order to move around the value in case it wasn't produced immediately prior to the call by the caller (or wasn't produced in exactly the right registers) or isn't used immediately within the callee. But some targets may need to further limit the register count due to an inability to support that many return registers.

Definition at line 113 of file TargetInfo.cpp.

References clang::TargetInfo::getPointerWidth(), clang::CodeGen::CodeGenTypes::getTarget(), and clang::CodeGen::Type.

◆ PPC64_initDwarfEHRegSizeTable()

static bool PPC64_initDwarfEHRegSizeTable ( CodeGen::CodeGenFunction CGF,
llvm::Value Address 
)
static

Definition at line 4807 of file TargetInfo.cpp.

◆ rewriteInputConstraintReferences()

static void rewriteInputConstraintReferences ( unsigned  FirstIn,
unsigned  NumNewOuts,
std::string &  AsmString 
)
static

◆ useFirstFieldIfTransparentUnion()

static QualType useFirstFieldIfTransparentUnion ( QualType  Ty)
static

Pass transparent unions as if they were the type of the first element.

Sema should ensure that all elements of the union have the same "machine type".

Definition at line 158 of file TargetInfo.cpp.

References clang::RecordDecl::field_begin(), clang::RecordDecl::field_empty(), clang::Type::getAsUnionType(), and clang::Decl::hasAttr().

Referenced by GetX86_64ByValArgumentPair().