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

Reply via email to