Hi, Here is the resubmitting of x32 psABI[1] patches against the latest trunk for code review after the patches[2] to LLVM. The change from last submitting is
- rebase to the latest trunk * 0001-add-x32-psABI-support.patch add x32 psABI support * 0002-revise-codegen-test-for-x32-psABI.patch revise/add codegen test for x32 psABI Looking forward to your comments. Thanks - Michael ------ [1] https://sites.google.com/site/x32abi/ [2] http://lists.cs.uiuc.edu/pipermail/llvm-commits/Week-of-Mon-20120709/146230.html
>From 6f14c9c12618f9ac973631fe76406cf442310aab Mon Sep 17 00:00:00 2001 From: Michael Liao <[email protected]> Date: Mon, 2 Jul 2012 22:39:47 -0700 Subject: [PATCH 1/4] start x32 psABI support - add a new 'X32' environment and new triple 'x86_64-<vendor>-<os>-gnux32' for this new psABI for x86-64 target --- autoconf/config.guess | 9 ++++++++- cmake/modules/GetHostTriple.cmake | 4 ++++ include/llvm/ADT/Triple.h | 3 ++- lib/Support/Triple.cpp | 2 ++ lib/Support/Unix/Host.inc | 9 +++++++++ 5 files changed, 25 insertions(+), 2 deletions(-) diff --git a/autoconf/config.guess b/autoconf/config.guess index f7dd69e..45edd79 100755 --- a/autoconf/config.guess +++ b/autoconf/config.guess @@ -983,7 +983,14 @@ EOF echo ${UNAME_MACHINE}-dec-linux-gnu exit ;; x86_64:Linux:*:*) - echo x86_64-unknown-linux-gnu + eval $set_cc_for_build + if echo __ILP32__ | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep -q __ILP32__ + then + echo x86_64-unknown-linux-gnu + else + echo x86_64-unknown-linux-gnux32 + fi exit ;; xtensa*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu diff --git a/cmake/modules/GetHostTriple.cmake b/cmake/modules/GetHostTriple.cmake index 671a8ce..f9b038a 100644 --- a/cmake/modules/GetHostTriple.cmake +++ b/cmake/modules/GetHostTriple.cmake @@ -16,10 +16,14 @@ function( get_host_triple var ) endif() else( MSVC ) set(config_guess ${LLVM_MAIN_SRC_DIR}/autoconf/config.guess) + set(OLD_ENV_CC "$ENV{CC}") + # Propagate the 1st argument into subprocess as well. + set(ENV{CC} "${CMAKE_C_COMPILER} ${CMAKE_C_COMPILER_ARG1}") execute_process(COMMAND sh ${config_guess} RESULT_VARIABLE TT_RV OUTPUT_VARIABLE TT_OUT OUTPUT_STRIP_TRAILING_WHITESPACE) + set(ENV{CC} "${OLD_ENV_CC}") if( NOT TT_RV EQUAL 0 ) message(FATAL_ERROR "Failed to execute ${config_guess}") endif( NOT TT_RV EQUAL 0 ) diff --git a/include/llvm/ADT/Triple.h b/include/llvm/ADT/Triple.h index 6b11c7a..a73c2ba 100644 --- a/include/llvm/ADT/Triple.h +++ b/include/llvm/ADT/Triple.h @@ -108,7 +108,8 @@ public: GNUEABIHF, EABI, MachO, - ANDROIDEABI + ANDROIDEABI, + X32 }; private: diff --git a/lib/Support/Triple.cpp b/lib/Support/Triple.cpp index 7b26ea9..d9ee84f 100644 --- a/lib/Support/Triple.cpp +++ b/lib/Support/Triple.cpp @@ -138,6 +138,7 @@ const char *Triple::getEnvironmentTypeName(EnvironmentType Kind) { case EABI: return "eabi"; case MachO: return "macho"; case ANDROIDEABI: return "androideabi"; + case X32: return "gnux32"; } llvm_unreachable("Invalid EnvironmentType!"); @@ -301,6 +302,7 @@ static Triple::EnvironmentType parseEnvironment(StringRef EnvironmentName) { .StartsWith("eabi", Triple::EABI) .StartsWith("gnueabihf", Triple::GNUEABIHF) .StartsWith("gnueabi", Triple::GNUEABI) + .StartsWith("gnux32", Triple::X32) .StartsWith("gnu", Triple::GNU) .StartsWith("macho", Triple::MachO) .StartsWith("androideabi", Triple::ANDROIDEABI) diff --git a/lib/Support/Unix/Host.inc b/lib/Support/Unix/Host.inc index 726e2fb..6bb13e1 100644 --- a/lib/Support/Unix/Host.inc +++ b/lib/Support/Unix/Host.inc @@ -59,5 +59,14 @@ std::string sys::getDefaultTargetTriple() { Triple += getOSVersion(); } +#if defined(__x86_64__) && defined(__ILP32__) + // Append 'x32' environment on x86-64 if applicable. + std::string::size_type X32DashIdx = Triple.find("-gnu"); + if (X32DashIdx != std::string::npos) { + Triple.resize(X32DashIdx + strlen("-gnu")); + Triple += "x32"; + } +#endif + return Triple; } -- 1.7.9.5
>From fa5ea4b36cd504cdd82d08e77e25a24121530294 Mon Sep 17 00:00:00 2001 From: Michael Liao <[email protected]> Date: Mon, 2 Jul 2012 22:45:36 -0700 Subject: [PATCH 2/4] add x32 ELF generation support - x32 psABI uses 32-bit ELF file format but with EM_X86_64 target. - detect ELF taget machine directly from the specified target machine instead of the ELF file format being used. --- include/llvm/MC/MCELFObjectWriter.h | 6 ++--- lib/MC/ELFObjectWriter.cpp | 3 ++- lib/Target/X86/MCTargetDesc/X86AsmBackend.cpp | 18 +++++++++++++-- lib/Target/X86/MCTargetDesc/X86ELFObjectWriter.cpp | 24 ++++++++++++-------- lib/Target/X86/MCTargetDesc/X86MCAsmInfo.cpp | 2 +- lib/Target/X86/MCTargetDesc/X86MCTargetDesc.h | 3 ++- 6 files changed, 38 insertions(+), 18 deletions(-) diff --git a/include/llvm/MC/MCELFObjectWriter.h b/include/llvm/MC/MCELFObjectWriter.h index abbe188..dcd065c 100644 --- a/include/llvm/MC/MCELFObjectWriter.h +++ b/include/llvm/MC/MCELFObjectWriter.h @@ -93,9 +93,9 @@ public: /// @name Accessors /// @{ - uint8_t getOSABI() { return OSABI; } - uint16_t getEMachine() { return EMachine; } - bool hasRelocationAddend() { return HasRelocationAddend; } + uint8_t getOSABI() const { return OSABI; } + uint16_t getEMachine() const { return EMachine; } + bool hasRelocationAddend() const { return HasRelocationAddend; } bool is64Bit() const { return Is64Bit; } bool isN64() const { return IsN64; } /// @} diff --git a/lib/MC/ELFObjectWriter.cpp b/lib/MC/ELFObjectWriter.cpp index 7203b9a..162b7b8 100644 --- a/lib/MC/ELFObjectWriter.cpp +++ b/lib/MC/ELFObjectWriter.cpp @@ -135,6 +135,7 @@ class ELFObjectWriter : public MCObjectWriter { } bool is64Bit() const { return TargetObjectWriter->is64Bit(); } + uint16_t getEMachine() const { return TargetObjectWriter->getEMachine(); } bool hasRelocationAddend() const { return TargetObjectWriter->hasRelocationAddend(); } @@ -733,7 +734,7 @@ void ELFObjectWriter::RecordRelocation(const MCAssembler &Asm, } Addend = Value; // Compensate for the addend on i386. - if (is64Bit()) + if (hasRelocationAddend()) Value = 0; } diff --git a/lib/Target/X86/MCTargetDesc/X86AsmBackend.cpp b/lib/Target/X86/MCTargetDesc/X86AsmBackend.cpp index 32e40fe..b892a13 100644 --- a/lib/Target/X86/MCTargetDesc/X86AsmBackend.cpp +++ b/lib/Target/X86/MCTargetDesc/X86AsmBackend.cpp @@ -344,7 +344,7 @@ public: : ELFX86AsmBackend(T, OSABI) {} MCObjectWriter *createObjectWriter(raw_ostream &OS) const { - return createX86ELFObjectWriter(OS, /*Is64Bit*/ false, OSABI); + return createX86ELFObjectWriter(OS, /*Is64Bit*/ false, OSABI, ELF::EM_386); } }; @@ -354,7 +354,17 @@ public: : ELFX86AsmBackend(T, OSABI) {} MCObjectWriter *createObjectWriter(raw_ostream &OS) const { - return createX86ELFObjectWriter(OS, /*Is64Bit*/ true, OSABI); + return createX86ELFObjectWriter(OS, /*Is64Bit*/ true, OSABI, ELF::EM_X86_64); + } +}; + +class ELFX86_X32AsmBackend : public ELFX86AsmBackend { +public: + ELFX86_X32AsmBackend(const Target &T, uint8_t OSABI) + : ELFX86AsmBackend(T, OSABI) {} + + MCObjectWriter *createObjectWriter(raw_ostream &OS) const { + return createX86ELFObjectWriter(OS, /*Is64Bit*/ false, OSABI, ELF::EM_X86_64); } }; @@ -462,5 +472,9 @@ MCAsmBackend *llvm::createX86_64AsmBackend(const Target &T, StringRef TT) { return new WindowsX86AsmBackend(T, true); uint8_t OSABI = MCELFObjectTargetWriter::getOSABI(TheTriple.getOS()); + + if (TheTriple.getEnvironment() == Triple::X32) + return new ELFX86_X32AsmBackend(T, OSABI); + return new ELFX86_64AsmBackend(T, OSABI); } diff --git a/lib/Target/X86/MCTargetDesc/X86ELFObjectWriter.cpp b/lib/Target/X86/MCTargetDesc/X86ELFObjectWriter.cpp index 5a42a80..1d0ba48 100644 --- a/lib/Target/X86/MCTargetDesc/X86ELFObjectWriter.cpp +++ b/lib/Target/X86/MCTargetDesc/X86ELFObjectWriter.cpp @@ -20,7 +20,7 @@ using namespace llvm; namespace { class X86ELFObjectWriter : public MCELFObjectTargetWriter { public: - X86ELFObjectWriter(bool is64Bit, uint8_t OSABI); + X86ELFObjectWriter(bool IsELF64, uint8_t OSABI, uint16_t EMachine); virtual ~X86ELFObjectWriter(); protected: @@ -30,10 +30,11 @@ namespace { }; } -X86ELFObjectWriter::X86ELFObjectWriter(bool Is64Bit, uint8_t OSABI) - : MCELFObjectTargetWriter(Is64Bit, OSABI, - Is64Bit ? ELF::EM_X86_64 : ELF::EM_386, - /*HasRelocationAddend*/ Is64Bit) {} +X86ELFObjectWriter::X86ELFObjectWriter(bool IsELF64, uint8_t OSABI, + uint16_t EMachine) + : MCELFObjectTargetWriter(IsELF64, OSABI, EMachine, + /*HasRelocationAddend*/ EMachine == ELF::EM_X86_64) +{} X86ELFObjectWriter::~X86ELFObjectWriter() {} @@ -48,7 +49,7 @@ unsigned X86ELFObjectWriter::GetRelocType(const MCValue &Target, MCSymbolRefExpr::VariantKind Modifier = Target.isAbsolute() ? MCSymbolRefExpr::VK_None : Target.getSymA()->getKind(); unsigned Type; - if (is64Bit()) { + if (getEMachine() == ELF::EM_X86_64) { if (IsPCRel) { switch ((unsigned)Fixup.getKind()) { default: llvm_unreachable("invalid fixup kind!"); @@ -130,7 +131,7 @@ unsigned X86ELFObjectWriter::GetRelocType(const MCValue &Target, case FK_Data_1: Type = ELF::R_X86_64_8; break; } } - } else { + } else if (getEMachine() == ELF::EM_386) { if (IsPCRel) { switch ((unsigned)Fixup.getKind()) { default: llvm_unreachable("invalid fixup kind!"); @@ -210,15 +211,18 @@ unsigned X86ELFObjectWriter::GetRelocType(const MCValue &Target, case FK_Data_1: Type = ELF::R_386_8; break; } } + } else { + llvm_unreachable("Unsupported ELF machine type."); } return Type; } MCObjectWriter *llvm::createX86ELFObjectWriter(raw_ostream &OS, - bool Is64Bit, - uint8_t OSABI) { + bool IsELF64, + uint8_t OSABI, + uint16_t EMachine) { MCELFObjectTargetWriter *MOTW = - new X86ELFObjectWriter(Is64Bit, OSABI); + new X86ELFObjectWriter(IsELF64, OSABI, EMachine); return createELFObjectWriter(MOTW, OS, /*IsLittleEndian=*/true); } diff --git a/lib/Target/X86/MCTargetDesc/X86MCAsmInfo.cpp b/lib/Target/X86/MCTargetDesc/X86MCAsmInfo.cpp index 49c07f3..adcb1f9 100644 --- a/lib/Target/X86/MCTargetDesc/X86MCAsmInfo.cpp +++ b/lib/Target/X86/MCTargetDesc/X86MCAsmInfo.cpp @@ -71,7 +71,7 @@ X86_64MCAsmInfoDarwin::X86_64MCAsmInfoDarwin(const Triple &Triple) void X86ELFMCAsmInfo::anchor() { } X86ELFMCAsmInfo::X86ELFMCAsmInfo(const Triple &T) { - if (T.getArch() == Triple::x86_64) + if (T.getArch() == Triple::x86_64 && T.getEnvironment() != Triple::X32) PointerSize = 8; AssemblerDialect = AsmWriterFlavor; diff --git a/lib/Target/X86/MCTargetDesc/X86MCTargetDesc.h b/lib/Target/X86/MCTargetDesc/X86MCTargetDesc.h index 4650069..36b25c4 100644 --- a/lib/Target/X86/MCTargetDesc/X86MCTargetDesc.h +++ b/lib/Target/X86/MCTargetDesc/X86MCTargetDesc.h @@ -92,7 +92,8 @@ MCObjectWriter *createX86MachObjectWriter(raw_ostream &OS, /// createX86ELFObjectWriter - Construct an X86 ELF object writer. MCObjectWriter *createX86ELFObjectWriter(raw_ostream &OS, bool Is64Bit, - uint8_t OSABI); + uint8_t OSABI, + uint16_t EMachine); /// createX86WinCOFFObjectWriter - Construct an X86 Win COFF object writer. MCObjectWriter *createX86WinCOFFObjectWriter(raw_ostream &OS, bool Is64Bit); } // End llvm namespace -- 1.7.9.5
_______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
