Make X86_64ABIInfo clean for ABIs with 32 bit pointers, such as X32

and Native Client

llvm-svn: 165715
This commit is contained in:
Derek Schuff 2012-10-11 15:52:22 +00:00
parent 22162470ba
commit c7dd722f0f
2 changed files with 23 additions and 14 deletions

View File

@ -1551,9 +1551,10 @@ public:
virtual bool hasFeature(StringRef Feature) const; virtual bool hasFeature(StringRef Feature) const;
virtual void HandleTargetFeatures(std::vector<std::string> &Features); virtual void HandleTargetFeatures(std::vector<std::string> &Features);
virtual const char* getABI() const { virtual const char* getABI() const {
if (PointerWidth == 64 && SSELevel >= AVX) if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX)
return "avx"; return "avx";
else if (PointerWidth == 32 && MMX3DNowLevel == NoMMX3DNow) else if (getTriple().getArch() == llvm::Triple::x86 &&
MMX3DNowLevel == NoMMX3DNow)
return "no-mmx"; return "no-mmx";
return ""; return "";
} }
@ -1647,7 +1648,7 @@ public:
case CK_AthlonMP: case CK_AthlonMP:
case CK_Geode: case CK_Geode:
// Only accept certain architectures when compiling in 32-bit mode. // Only accept certain architectures when compiling in 32-bit mode.
if (PointerWidth != 32) if (getTriple().getArch() != llvm::Triple::x86)
return false; return false;
// Fallthrough // Fallthrough
@ -1719,7 +1720,7 @@ void X86TargetInfo::getDefaultFeatures(llvm::StringMap<bool> &Features) const {
// FIXME: This *really* should not be here. // FIXME: This *really* should not be here.
// X86_64 always has SSE2. // X86_64 always has SSE2.
if (PointerWidth == 64) if (getTriple().getArch() == llvm::Triple::x86_64)
Features["sse2"] = Features["sse"] = Features["mmx"] = true; Features["sse2"] = Features["sse"] = Features["mmx"] = true;
switch (CPU) { switch (CPU) {
@ -2101,7 +2102,7 @@ void X86TargetInfo::HandleTargetFeatures(std::vector<std::string> &Features) {
void X86TargetInfo::getTargetDefines(const LangOptions &Opts, void X86TargetInfo::getTargetDefines(const LangOptions &Opts,
MacroBuilder &Builder) const { MacroBuilder &Builder) const {
// Target identification. // Target identification.
if (PointerWidth == 64) { if (getTriple().getArch() == llvm::Triple::x86_64) {
Builder.defineMacro("__amd64__"); Builder.defineMacro("__amd64__");
Builder.defineMacro("__amd64"); Builder.defineMacro("__amd64");
Builder.defineMacro("__x86_64"); Builder.defineMacro("__x86_64");
@ -2300,7 +2301,7 @@ void X86TargetInfo::getTargetDefines(const LangOptions &Opts,
break; break;
} }
if (Opts.MicrosoftExt && PointerWidth == 32) { if (Opts.MicrosoftExt && getTriple().getArch() == llvm::Triple::x86) {
switch (SSELevel) { switch (SSELevel) {
case AVX2: case AVX2:
case AVX: case AVX:
@ -2356,8 +2357,8 @@ bool X86TargetInfo::hasFeature(StringRef Feature) const {
.Case("sse42", SSELevel >= SSE42) .Case("sse42", SSELevel >= SSE42)
.Case("sse4a", HasSSE4a) .Case("sse4a", HasSSE4a)
.Case("x86", true) .Case("x86", true)
.Case("x86_32", PointerWidth == 32) .Case("x86_32", getTriple().getArch() == llvm::Triple::x86)
.Case("x86_64", PointerWidth == 64) .Case("x86_64", getTriple().getArch() == llvm::Triple::x86_64)
.Case("xop", HasXOP) .Case("xop", HasXOP)
.Case("f16c", HasF16C) .Case("f16c", HasF16C)
.Default(false); .Default(false);

View File

@ -1115,10 +1115,15 @@ class X86_64ABIInfo : public ABIInfo {
} }
bool HasAVX; bool HasAVX;
// Some ABIs (e.g. X32 ABI and Native Client OS) use 32 bit pointers on
// 64-bit hardware.
bool Has64BitPointers;
public: public:
X86_64ABIInfo(CodeGen::CodeGenTypes &CGT, bool hasavx) : X86_64ABIInfo(CodeGen::CodeGenTypes &CGT, bool hasavx) :
ABIInfo(CGT), HasAVX(hasavx) {} ABIInfo(CGT), HasAVX(hasavx),
Has64BitPointers(CGT.getDataLayout().getPointerSize() == 8) {
}
bool isPassedUsingAVXType(QualType type) const { bool isPassedUsingAVXType(QualType type) const {
unsigned neededInt, neededSSE; unsigned neededInt, neededSSE;
@ -1155,7 +1160,7 @@ public:
class X86_64TargetCodeGenInfo : public TargetCodeGenInfo { class X86_64TargetCodeGenInfo : public TargetCodeGenInfo {
public: public:
X86_64TargetCodeGenInfo(CodeGen::CodeGenTypes &CGT, bool HasAVX) X86_64TargetCodeGenInfo(CodeGen::CodeGenTypes &CGT, bool HasAVX)
: TargetCodeGenInfo(new X86_64ABIInfo(CGT, HasAVX)) {} : TargetCodeGenInfo(new X86_64ABIInfo(CGT, HasAVX)) {}
const X86_64ABIInfo &getABIInfo() const { const X86_64ABIInfo &getABIInfo() const {
return static_cast<const X86_64ABIInfo&>(TargetCodeGenInfo::getABIInfo()); return static_cast<const X86_64ABIInfo&>(TargetCodeGenInfo::getABIInfo());
@ -1351,7 +1356,7 @@ void X86_64ABIInfo::classify(QualType Ty, uint64_t OffsetBase,
} }
if (Ty->isMemberPointerType()) { if (Ty->isMemberPointerType()) {
if (Ty->isMemberFunctionPointerType()) if (Ty->isMemberFunctionPointerType() && Has64BitPointers)
Lo = Hi = Integer; Lo = Hi = Integer;
else else
Current = Integer; Current = Integer;
@ -1862,7 +1867,8 @@ GetINTEGERTypeAtOffset(llvm::Type *IRType, unsigned IROffset,
// returning an 8-byte unit starting with it. See if we can safely use it. // returning an 8-byte unit starting with it. See if we can safely use it.
if (IROffset == 0) { if (IROffset == 0) {
// Pointers and int64's always fill the 8-byte unit. // Pointers and int64's always fill the 8-byte unit.
if (isa<llvm::PointerType>(IRType) || IRType->isIntegerTy(64)) if ((isa<llvm::PointerType>(IRType) && Has64BitPointers) ||
IRType->isIntegerTy(64))
return IRType; return IRType;
// If we have a 1/2/4-byte integer, we can use it only if the rest of the // If we have a 1/2/4-byte integer, we can use it only if the rest of the
@ -1872,8 +1878,10 @@ GetINTEGERTypeAtOffset(llvm::Type *IRType, unsigned IROffset,
// have to do this analysis on the source type because we can't depend on // have to do this analysis on the source type because we can't depend on
// unions being lowered a specific way etc. // unions being lowered a specific way etc.
if (IRType->isIntegerTy(8) || IRType->isIntegerTy(16) || if (IRType->isIntegerTy(8) || IRType->isIntegerTy(16) ||
IRType->isIntegerTy(32)) { IRType->isIntegerTy(32) ||
unsigned BitWidth = cast<llvm::IntegerType>(IRType)->getBitWidth(); (isa<llvm::PointerType>(IRType) && !Has64BitPointers)) {
unsigned BitWidth = isa<llvm::PointerType>(IRType) ? 32 :
cast<llvm::IntegerType>(IRType)->getBitWidth();
if (BitsContainNoUserData(SourceTy, SourceOffset*8+BitWidth, if (BitsContainNoUserData(SourceTy, SourceOffset*8+BitWidth,
SourceOffset*8+64, getContext())) SourceOffset*8+64, getContext()))