Fix 64-bit pointer type for non-x32 ABIs.

BUG=swiftshader:9

Change-Id: Ife06416736d47acba4f2cff1ea8b17be61134752
diff --git a/src/IceTargetLowering.cpp b/src/IceTargetLowering.cpp
index 458681c..84ebdac 100644
--- a/src/IceTargetLowering.cpp
+++ b/src/IceTargetLowering.cpp
@@ -58,6 +58,7 @@
   createTargetHeaderLowering(::Ice::GlobalContext *Ctx);                       \
   void staticInit(::Ice::GlobalContext *Ctx);                                  \
   bool shouldBePooled(const ::Ice::Constant *C);                               \
+  ::Ice::Type getPointerType();                                                \
   } // end of namespace X
 #include "SZTargets.def"
 #undef SUBZERO_TARGET
@@ -298,6 +299,19 @@
   }
 }
 
+::Ice::Type TargetLowering::getPointerType() {
+  const TargetArch Target = getFlags().getTargetArch();
+  switch (Target) {
+  default:
+    return ::Ice::IceType_void;
+#define SUBZERO_TARGET(X)                                                      \
+  case TARGET_LOWERING_CLASS_FOR(X):                                           \
+    return ::X::getPointerType();
+#include "SZTargets.def"
+#undef SUBZERO_TARGET
+  }
+}
+
 TargetLowering::SandboxType
 TargetLowering::determineSandboxTypeFromFlags(const ClFlags &Flags) {
   assert(!Flags.getUseSandboxing() || !Flags.getUseNonsfi());
diff --git a/src/IceTargetLowering.h b/src/IceTargetLowering.h
index b8bfff0..568b81f 100644
--- a/src/IceTargetLowering.h
+++ b/src/IceTargetLowering.h
@@ -175,6 +175,7 @@
   // Each target must define a public static method:
   //   static void staticInit(GlobalContext *Ctx);
   static bool shouldBePooled(const class Constant *C);
+  static Type getPointerType();
 
   static std::unique_ptr<TargetLowering> createLowering(TargetArch Target,
                                                         Cfg *Func);
diff --git a/src/IceTargetLoweringARM32.cpp b/src/IceTargetLoweringARM32.cpp
index 2b65064..a2f1123 100644
--- a/src/IceTargetLoweringARM32.cpp
+++ b/src/IceTargetLoweringARM32.cpp
@@ -66,6 +66,10 @@
   return ::Ice::ARM32::TargetARM32::shouldBePooled(C);
 }
 
+::Ice::Type getPointerType() {
+  return ::Ice::ARM32::TargetARM32::getPointerType();
+}
+
 } // end of namespace ARM32
 
 namespace Ice {
diff --git a/src/IceTargetLoweringARM32.h b/src/IceTargetLoweringARM32.h
index 9d31b9e..f6cd66b 100644
--- a/src/IceTargetLoweringARM32.h
+++ b/src/IceTargetLoweringARM32.h
@@ -68,6 +68,8 @@
     return false;
   }
 
+  static ::Ice::Type getPointerType() { return ::Ice::IceType_i32; }
+
   // TODO(jvoung): return a unique_ptr.
   static std::unique_ptr<::Ice::TargetLowering> create(Cfg *Func) {
     return makeUnique<TargetARM32>(Func);
diff --git a/src/IceTargetLoweringMIPS32.cpp b/src/IceTargetLoweringMIPS32.cpp
index 99c32cc..0d02c7c 100644
--- a/src/IceTargetLoweringMIPS32.cpp
+++ b/src/IceTargetLoweringMIPS32.cpp
@@ -52,6 +52,11 @@
 bool shouldBePooled(const ::Ice::Constant *C) {
   return ::Ice::MIPS32::TargetMIPS32::shouldBePooled(C);
 }
+
+::Ice::Type getPointerType() {
+  return ::Ice::MIPS32::TargetMIPS32::getPointerType();
+}
+
 } // end of namespace MIPS32
 
 namespace Ice {
diff --git a/src/IceTargetLoweringMIPS32.h b/src/IceTargetLoweringMIPS32.h
index 283e98c..72fc1cd 100644
--- a/src/IceTargetLoweringMIPS32.h
+++ b/src/IceTargetLoweringMIPS32.h
@@ -43,6 +43,7 @@
     }
     return false;
   }
+  static ::Ice::Type getPointerType() { return ::Ice::IceType_i32; }
   static std::unique_ptr<::Ice::TargetLowering> create(Cfg *Func) {
     return makeUnique<TargetMIPS32>(Func);
   }
diff --git a/src/IceTargetLoweringX8632.cpp b/src/IceTargetLoweringX8632.cpp
index 36e5964..89adf3a 100644
--- a/src/IceTargetLoweringX8632.cpp
+++ b/src/IceTargetLoweringX8632.cpp
@@ -48,6 +48,11 @@
 bool shouldBePooled(const class ::Ice::Constant *C) {
   return ::Ice::X8632::TargetX8632::shouldBePooled(C);
 }
+
+::Ice::Type getPointerType() {
+  return ::Ice::X8632::TargetX8632::getPointerType();
+}
+
 } // end of namespace X8632
 
 namespace Ice {
diff --git a/src/IceTargetLoweringX8664.cpp b/src/IceTargetLoweringX8664.cpp
index df454b0..a3602a9 100644
--- a/src/IceTargetLoweringX8664.cpp
+++ b/src/IceTargetLoweringX8664.cpp
@@ -41,6 +41,10 @@
   return ::Ice::X8664::TargetX8664::shouldBePooled(C);
 }
 
+::Ice::Type getPointerType() {
+  return ::Ice::X8664::TargetX8664::getPointerType();
+}
+
 } // end of namespace X8664
 
 namespace Ice {
diff --git a/src/IceTargetLoweringX86Base.h b/src/IceTargetLoweringX86Base.h
index 7b1e730..97576ee 100644
--- a/src/IceTargetLoweringX86Base.h
+++ b/src/IceTargetLoweringX86Base.h
@@ -79,6 +79,7 @@
 
   static void staticInit(GlobalContext *Ctx);
   static bool shouldBePooled(const Constant *C);
+  static ::Ice::Type getPointerType();
 
   static FixupKind getPcRelFixup() { return PcRelFixup; }
   static FixupKind getAbsFixup() { return AbsFixup; }
diff --git a/src/IceTargetLoweringX86BaseImpl.h b/src/IceTargetLoweringX86BaseImpl.h
index 52a5d07..e9fee53 100644
--- a/src/IceTargetLoweringX86BaseImpl.h
+++ b/src/IceTargetLoweringX86BaseImpl.h
@@ -430,6 +430,16 @@
   return C->shouldBeRandomizedOrPooled();
 }
 
+template <typename TraitsType>
+::Ice::Type TargetX86Base<TraitsType>::getPointerType() {
+  if (!Traits::Is64Bit ||
+      ::Ice::getFlags().getApplicationBinaryInterface() == ::Ice::ABI_PNaCl) {
+    return ::Ice::IceType_i32;
+  } else {
+    return ::Ice::IceType_i64;
+  }
+}
+
 template <typename TraitsType> void TargetX86Base<TraitsType>::translateO2() {
   TimerMarker T(TimerStack::TT_O2, Func);
 
@@ -7456,7 +7466,7 @@
   // TODO(wala,stichnot): lea should not
   // be required. The address of the stack slot is known at compile time
   // (although not until after addProlog()).
-  constexpr Type PointerType = IceType_i32;
+  const Type PointerType = getPointerType();
   Variable *Loc = makeReg(PointerType);
   _lea(Loc, Slot);
   Constant *ConstantOffset = Ctx->getConstantInt32(Offset);
diff --git a/src/IceTypes.cpp b/src/IceTypes.cpp
index f8cbaf9..db3d93f 100644
--- a/src/IceTypes.cpp
+++ b/src/IceTypes.cpp
@@ -15,6 +15,7 @@
 #include "IceTypes.h"
 
 #include "IceDefs.h"
+#include "IceTargetLowering.h"
 
 #include "llvm/Support/ErrorHandling.h"
 
@@ -176,6 +177,8 @@
   return IceType_void;
 }
 
+Type getPointerType() { return TargetLowering::getPointerType(); }
+
 bool isVectorType(Type Ty) {
   if (Ty < IceType_NUM)
     return TypePropertiesTable[Ty].TypeIsVectorType;
diff --git a/src/IceTypes.h b/src/IceTypes.h
index 5376e73..8972b08 100644
--- a/src/IceTypes.h
+++ b/src/IceTypes.h
@@ -85,7 +85,7 @@
 inline std::string typeStdString(Type Ty) { return typeString(Ty); }
 const char *regClassString(RegClass C);
 
-inline Type getPointerType() { return IceType_i32; }
+Type getPointerType();
 
 bool isVectorType(Type Ty);