[llvm] r241022 - [WebAssembly] Initial WebAssembly backend

Frédéric Riss friss at apple.com
Mon Jun 29 17:37:25 PDT 2015


> On Jun 29, 2015, at 4:51 PM, Dan Gohman <dan433584 at gmail.com> wrote:
> 
> Author: djg
> Date: Mon Jun 29 18:51:55 2015
> New Revision: 241022
> 
> URL: http://llvm.org/viewvc/llvm-project?rev=241022&view=rev
> Log:
> [WebAssembly] Initial WebAssembly backend
> 
> This WebAssembly backend is just a skeleton at this time and is not yet
> functional.
> 
> Added:
>    llvm/trunk/lib/Target/WebAssembly/
>    llvm/trunk/lib/Target/WebAssembly/CMakeLists.txt
>    llvm/trunk/lib/Target/WebAssembly/InstPrinter/
>    llvm/trunk/lib/Target/WebAssembly/InstPrinter/CMakeLists.txt
>    llvm/trunk/lib/Target/WebAssembly/InstPrinter/LLVMBuild.txt
>    llvm/trunk/lib/Target/WebAssembly/InstPrinter/Makefile
>    llvm/trunk/lib/Target/WebAssembly/InstPrinter/WebAssemblyInstPrinter.cpp
>    llvm/trunk/lib/Target/WebAssembly/InstPrinter/WebAssemblyInstPrinter.h
>    llvm/trunk/lib/Target/WebAssembly/LLVMBuild.txt
>    llvm/trunk/lib/Target/WebAssembly/MCTargetDesc/
>    llvm/trunk/lib/Target/WebAssembly/MCTargetDesc/CMakeLists.txt
>    llvm/trunk/lib/Target/WebAssembly/MCTargetDesc/LLVMBuild.txt
>    llvm/trunk/lib/Target/WebAssembly/MCTargetDesc/Makefile
>    llvm/trunk/lib/Target/WebAssembly/MCTargetDesc/WebAssemblyMCAsmInfo.cpp
>    llvm/trunk/lib/Target/WebAssembly/MCTargetDesc/WebAssemblyMCAsmInfo.h
>    llvm/trunk/lib/Target/WebAssembly/MCTargetDesc/WebAssemblyMCTargetDesc.cpp
>    llvm/trunk/lib/Target/WebAssembly/MCTargetDesc/WebAssemblyMCTargetDesc.h
>    llvm/trunk/lib/Target/WebAssembly/Makefile
>    llvm/trunk/lib/Target/WebAssembly/README.txt
>    llvm/trunk/lib/Target/WebAssembly/TargetInfo/
>    llvm/trunk/lib/Target/WebAssembly/TargetInfo/CMakeLists.txt
>    llvm/trunk/lib/Target/WebAssembly/TargetInfo/LLVMBuild.txt
>    llvm/trunk/lib/Target/WebAssembly/TargetInfo/Makefile
>    llvm/trunk/lib/Target/WebAssembly/TargetInfo/WebAssemblyTargetInfo.cpp
>    llvm/trunk/lib/Target/WebAssembly/WebAssembly.h
>    llvm/trunk/lib/Target/WebAssembly/WebAssembly.td
>    llvm/trunk/lib/Target/WebAssembly/WebAssemblyFrameLowering.cpp
>    llvm/trunk/lib/Target/WebAssembly/WebAssemblyFrameLowering.h
>    llvm/trunk/lib/Target/WebAssembly/WebAssemblyISelDAGToDAG.cpp
>    llvm/trunk/lib/Target/WebAssembly/WebAssemblyISelLowering.cpp
>    llvm/trunk/lib/Target/WebAssembly/WebAssemblyISelLowering.h
>    llvm/trunk/lib/Target/WebAssembly/WebAssemblyInstrAtomics.td
>    llvm/trunk/lib/Target/WebAssembly/WebAssemblyInstrFormats.td
>    llvm/trunk/lib/Target/WebAssembly/WebAssemblyInstrInfo.cpp
>    llvm/trunk/lib/Target/WebAssembly/WebAssemblyInstrInfo.h
>    llvm/trunk/lib/Target/WebAssembly/WebAssemblyInstrInfo.td
>    llvm/trunk/lib/Target/WebAssembly/WebAssemblyInstrSIMD.td
>    llvm/trunk/lib/Target/WebAssembly/WebAssemblyMachineFunctionInfo.cpp
>    llvm/trunk/lib/Target/WebAssembly/WebAssemblyMachineFunctionInfo.h
>    llvm/trunk/lib/Target/WebAssembly/WebAssemblyRegisterInfo.cpp
>    llvm/trunk/lib/Target/WebAssembly/WebAssemblyRegisterInfo.h
>    llvm/trunk/lib/Target/WebAssembly/WebAssemblyRegisterInfo.td
>    llvm/trunk/lib/Target/WebAssembly/WebAssemblySelectionDAGInfo.cpp
>    llvm/trunk/lib/Target/WebAssembly/WebAssemblySelectionDAGInfo.h
>    llvm/trunk/lib/Target/WebAssembly/WebAssemblySubtarget.cpp
>    llvm/trunk/lib/Target/WebAssembly/WebAssemblySubtarget.h
>    llvm/trunk/lib/Target/WebAssembly/WebAssemblyTargetMachine.cpp
>    llvm/trunk/lib/Target/WebAssembly/WebAssemblyTargetMachine.h
>    llvm/trunk/lib/Target/WebAssembly/WebAssemblyTargetObjectFile.h
>    llvm/trunk/lib/Target/WebAssembly/WebAssemblyTargetTransformInfo.cpp
>    llvm/trunk/lib/Target/WebAssembly/WebAssemblyTargetTransformInfo.h
> Modified:
>    llvm/trunk/CODE_OWNERS.TXT
>    llvm/trunk/CREDITS.TXT
>    llvm/trunk/autoconf/configure.ac
>    llvm/trunk/cmake/config-ix.cmake
>    llvm/trunk/configure
>    llvm/trunk/include/llvm/ADT/Triple.h
>    llvm/trunk/lib/Support/Triple.cpp
>    llvm/trunk/lib/Target/LLVMBuild.txt
>    llvm/trunk/unittests/ADT/TripleTest.cpp
> 
> Modified: llvm/trunk/CODE_OWNERS.TXT
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/CODE_OWNERS.TXT?rev=241022&r1=241021&r2=241022&view=diff
> ==============================================================================
> --- llvm/trunk/CODE_OWNERS.TXT (original)
> +++ llvm/trunk/CODE_OWNERS.TXT Mon Jun 29 18:51:55 2015
> @@ -65,6 +65,10 @@ N: Hal Finkel
> E: hfinkel at anl.gov
> D: BBVectorize, the loop reroller, alias analysis and the PowerPC target
> 
> +N: Dan Gohman
> +E: sunfish at mozilla.com
> +D: WebAssembly Backend (lib/Target/WebAssembly/*)
> +
> N: Renato Golin
> E: renato.golin at linaro.org
> D: ARM Linux support
> 
> Modified: llvm/trunk/CREDITS.TXT
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/CREDITS.TXT?rev=241022&r1=241021&r2=241022&view=diff
> ==============================================================================
> --- llvm/trunk/CREDITS.TXT (original)
> +++ llvm/trunk/CREDITS.TXT Mon Jun 29 18:51:55 2015
> @@ -152,8 +152,9 @@ E: foldr at codedgers.com
> D: Author of llvmc2
> 
> N: Dan Gohman
> -E: dan433584 at gmail.com
> +E: sunfish at mozilla.com
> D: Miscellaneous bug fixes
> +D: WebAssembly Backend
> 
> N: David Goodwin
> E: david at goodwinz.net
> 
> Modified: llvm/trunk/autoconf/configure.ac
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/autoconf/configure.ac?rev=241022&r1=241021&r2=241022&view=diff
> ==============================================================================
> --- llvm/trunk/autoconf/configure.ac (original)
> +++ llvm/trunk/autoconf/configure.ac Mon Jun 29 18:51:55 2015
> @@ -445,6 +445,7 @@ AC_CACHE_CHECK([target architecture],[ll
>   hexagon-*)              llvm_cv_target_arch="Hexagon" ;;
>   nvptx-*)                llvm_cv_target_arch="NVPTX" ;;
>   s390x-*)                llvm_cv_target_arch="SystemZ" ;;
> +  wasm*-*)                llvm_cv_target_arch="WebAssembly" ;;
>   *)                      llvm_cv_target_arch="Unknown" ;;
> esac])
> 
> @@ -480,6 +481,7 @@ case $host in
>   msp430-*)               host_arch="MSP430" ;;
>   hexagon-*)              host_arch="Hexagon" ;;
>   s390x-*)                host_arch="SystemZ" ;;
> +  wasm*-*)                host_arch="WebAssembly" ;;
>   *)                      host_arch="Unknown" ;;
> esac
> 
> @@ -812,6 +814,7 @@ else
>     Hexagon)     AC_SUBST(TARGET_HAS_JIT,0) ;;
>     NVPTX)       AC_SUBST(TARGET_HAS_JIT,0) ;;
>     SystemZ)     AC_SUBST(TARGET_HAS_JIT,1) ;;
> +    WebAssembly) AC_SUBST(TARGET_HAS_JIT,0) ;;
>     *)           AC_SUBST(TARGET_HAS_JIT,0) ;;
>   esac
> fi
> @@ -1105,7 +1108,7 @@ TARGETS_TO_BUILD=""
> AC_ARG_ENABLE([targets],AS_HELP_STRING([--enable-targets],
>     [Build specific host targets: all or target1,target2,... Valid targets are:
>      host, x86, x86_64, sparc, powerpc, arm64, arm, aarch64, mips, hexagon,
> -     xcore, msp430, nvptx, systemz, r600, bpf, and cpp (default=all)]),,
> +     xcore, msp430, nvptx, systemz, r600, bpf, wasm, and cpp (default=all)]),,
>     enableval=all)
> if test "$enableval" = host-only ; then
>   enableval=host
> @@ -1134,6 +1137,7 @@ case "$enableval" in
>         systemz)  TARGETS_TO_BUILD="SystemZ $TARGETS_TO_BUILD" ;;
>         amdgpu)   TARGETS_TO_BUILD="AMDGPU $TARGETS_TO_BUILD" ;;
>         r600)     TARGETS_TO_BUILD="AMDGPU $TARGETS_TO_BUILD" ;;
> +        wasm)     TARGETS_TO_BUILD="WebAssembly $TARGETS_TO_BUILD" ;;
>         host) case "$llvm_cv_target_arch" in
>             x86)         TARGETS_TO_BUILD="X86 $TARGETS_TO_BUILD" ;;
>             x86_64)      TARGETS_TO_BUILD="X86 $TARGETS_TO_BUILD" ;;
> @@ -1147,6 +1151,7 @@ case "$enableval" in
>             Hexagon)     TARGETS_TO_BUILD="Hexagon $TARGETS_TO_BUILD" ;;
>             NVPTX)       TARGETS_TO_BUILD="NVPTX $TARGETS_TO_BUILD" ;;
>             SystemZ)     TARGETS_TO_BUILD="SystemZ $TARGETS_TO_BUILD" ;;
> +            WebAssembly) TARGETS_TO_BUILD="WebAssembly $TARGETS_TO_BUILD" ;;
>             *)       AC_MSG_ERROR([Can not set target to build]) ;;
>           esac ;;
>         *) AC_MSG_ERROR([Unrecognized target $a_target]) ;;
> 
> Modified: llvm/trunk/cmake/config-ix.cmake
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/cmake/config-ix.cmake?rev=241022&r1=241021&r2=241022&view=diff
> ==============================================================================
> --- llvm/trunk/cmake/config-ix.cmake (original)
> +++ llvm/trunk/cmake/config-ix.cmake Mon Jun 29 18:51:55 2015
> @@ -358,6 +358,10 @@ elseif (LLVM_NATIVE_ARCH MATCHES "hexago
>   set(LLVM_NATIVE_ARCH Hexagon)
> elseif (LLVM_NATIVE_ARCH MATCHES "s390x")
>   set(LLVM_NATIVE_ARCH SystemZ)
> +elseif (LLVM_NATIVE_ARCH MATCHES "wasm32")
> +  set(LLVM_NATIVE_ARCH WebAssembly)
> +elseif (LLVM_NATIVE_ARCH MATCHES "wasm64")
> +  set(LLVM_NATIVE_ARCH WebAssembly)
> else ()
>   message(FATAL_ERROR "Unknown architecture ${LLVM_NATIVE_ARCH}")
> endif ()
> 
> Modified: llvm/trunk/configure
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/configure?rev=241022&r1=241021&r2=241022&view=diff
> ==============================================================================
> --- llvm/trunk/configure (original)
> +++ llvm/trunk/configure Mon Jun 29 18:51:55 2015
> @@ -1463,7 +1463,7 @@ Optional Features:
>                           target1,target2,... Valid targets are: host, x86,
>                           x86_64, sparc, powerpc, arm64, arm, aarch64, mips,
>                           hexagon, xcore, msp430, nvptx, systemz, r600, bpf,
> -                          and cpp (default=all)
> +                          wasm, and cpp (default=all)
>   --enable-experimental-targets
>                           Build experimental host targets: disable or
>                           target1,target2,... (default=disable)
> @@ -4207,6 +4207,7 @@ else
>   hexagon-*)              llvm_cv_target_arch="Hexagon" ;;
>   nvptx-*)                llvm_cv_target_arch="NVPTX" ;;
>   s390x-*)                llvm_cv_target_arch="SystemZ" ;;
> +  wasm*-*)                llvm_cv_target_arch="WebAssembly" ;;
>   *)                      llvm_cv_target_arch="Unknown" ;;
> esac
> fi
> @@ -4243,6 +4244,7 @@ case $host in
>   msp430-*)               host_arch="MSP430" ;;
>   hexagon-*)              host_arch="Hexagon" ;;
>   s390x-*)                host_arch="SystemZ" ;;
> +  wasm*-*)                host_arch="WebAssembly" ;;
>   *)                      host_arch="Unknown" ;;
> esac
> 
> @@ -5170,6 +5172,8 @@ else
>  ;;
>     SystemZ)     TARGET_HAS_JIT=1
>  ;;
> +    WebAssembly) TARGET_HAS_JIT=0
> + ;;
>     *)           TARGET_HAS_JIT=0
>  ;;
>   esac
> @@ -5667,6 +5671,7 @@ case "$enableval" in
>         systemz)  TARGETS_TO_BUILD="SystemZ $TARGETS_TO_BUILD" ;;
>         amdgpu)   TARGETS_TO_BUILD="AMDGPU $TARGETS_TO_BUILD" ;;
>         r600)     TARGETS_TO_BUILD="AMDGPU $TARGETS_TO_BUILD" ;;
> +        wasm)     TARGETS_TO_BUILD="WebAssembly $TARGETS_TO_BUILD" ;;
>         host) case "$llvm_cv_target_arch" in
>             x86)         TARGETS_TO_BUILD="X86 $TARGETS_TO_BUILD" ;;
>             x86_64)      TARGETS_TO_BUILD="X86 $TARGETS_TO_BUILD" ;;
> @@ -5680,6 +5685,7 @@ case "$enableval" in
>             Hexagon)     TARGETS_TO_BUILD="Hexagon $TARGETS_TO_BUILD" ;;
>             NVPTX)       TARGETS_TO_BUILD="NVPTX $TARGETS_TO_BUILD" ;;
>             SystemZ)     TARGETS_TO_BUILD="SystemZ $TARGETS_TO_BUILD" ;;
> +            WebAssembly) TARGETS_TO_BUILD="WebAssembly $TARGETS_TO_BUILD" ;;
>             *)       { { echo "$as_me:$LINENO: error: Can not set target to build" >&5
> echo "$as_me: error: Can not set target to build" >&2;}
>    { (exit 1); exit 1; }; } ;;
> 
> Modified: llvm/trunk/include/llvm/ADT/Triple.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ADT/Triple.h?rev=241022&r1=241021&r2=241022&view=diff
> ==============================================================================
> --- llvm/trunk/include/llvm/ADT/Triple.h (original)
> +++ llvm/trunk/include/llvm/ADT/Triple.h Mon Jun 29 18:51:55 2015
> @@ -85,6 +85,8 @@ public:
>     spir64,     // SPIR: standard portable IR for OpenCL 64-bit version
>     kalimba,    // Kalimba: generic kalimba
>     shave,      // SHAVE: Movidius vector VLIW processors
> +    wasm32,     // WebAssembly with 32-bit pointers
> +    wasm64,     // WebAssembly with 64-bit pointers
>     LastArchType = shave
>   };

LastArchType looks wrong.

Fred

>   enum SubArchType {
> @@ -151,7 +153,8 @@ public:
>     NVCL,       // NVIDIA OpenCL
>     AMDHSA,     // AMD HSA Runtime
>     PS4,
> -    LastOSType = PS4
> +    WebAssembly,
> +    LastOSType = WebAssembly
>   };
>   enum EnvironmentType {
>     UnknownEnvironment,
> 
> Modified: llvm/trunk/lib/Support/Triple.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/Triple.cpp?rev=241022&r1=241021&r2=241022&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Support/Triple.cpp (original)
> +++ llvm/trunk/lib/Support/Triple.cpp Mon Jun 29 18:51:55 2015
> @@ -60,6 +60,8 @@ const char *Triple::getArchTypeName(Arch
>   case spir64:      return "spir64";
>   case kalimba:     return "kalimba";
>   case shave:       return "shave";
> +  case wasm32:      return "wasm32";
> +  case wasm64:      return "wasm64";
>   }
> 
>   llvm_unreachable("Invalid ArchType!");
> @@ -122,6 +124,8 @@ const char *Triple::getArchTypePrefix(Ar
>   case spir64:      return "spir";
>   case kalimba:     return "kalimba";
>   case shave:       return "shave";
> +  case wasm32:      return "wasm32";
> +  case wasm64:      return "wasm64";
>   }
> }
> 
> @@ -173,6 +177,7 @@ const char *Triple::getOSTypeName(OSType
>   case NVCL: return "nvcl";
>   case AMDHSA: return "amdhsa";
>   case PS4: return "ps4";
> +  case WebAssembly: return "wasm";
>   }
> 
>   llvm_unreachable("Invalid OSType");
> @@ -255,6 +260,8 @@ Triple::ArchType Triple::getArchTypeForL
>     .Case("spir64", spir64)
>     .Case("kalimba", kalimba)
>     .Case("shave", shave)
> +    .Case("wasm32", wasm32)
> +    .Case("wasm64", wasm64)
>     .Default(UnknownArch);
> }
> 
> @@ -360,6 +367,8 @@ static Triple::ArchType parseArch(String
>     .Case("spir64", Triple::spir64)
>     .StartsWith("kalimba", Triple::kalimba)
>     .Case("shave", Triple::shave)
> +    .Case("wasm32", Triple::wasm32)
> +    .Case("wasm64", Triple::wasm64)
>     .Default(Triple::UnknownArch);
> }
> 
> @@ -406,6 +415,7 @@ static Triple::OSType parseOS(StringRef
>     .StartsWith("nvcl", Triple::NVCL)
>     .StartsWith("amdhsa", Triple::AMDHSA)
>     .StartsWith("ps4", Triple::PS4)
> +    .StartsWith("wasm", Triple::WebAssembly)
>     .Default(Triple::UnknownOS);
> }
> 
> @@ -1009,6 +1019,7 @@ static unsigned getArchPointerBitWidth(l
>   case llvm::Triple::spir:
>   case llvm::Triple::kalimba:
>   case llvm::Triple::shave:
> +  case llvm::Triple::wasm32:
>     return 32;
> 
>   case llvm::Triple::aarch64:
> @@ -1028,6 +1039,7 @@ static unsigned getArchPointerBitWidth(l
>   case llvm::Triple::amdil64:
>   case llvm::Triple::hsail64:
>   case llvm::Triple::spir64:
> +  case llvm::Triple::wasm64:
>     return 64;
>   }
>   llvm_unreachable("Invalid architecture value");
> @@ -1081,6 +1093,7 @@ Triple Triple::get32BitArchVariant() con
>   case Triple::x86:
>   case Triple::xcore:
>   case Triple::shave:
> +  case Triple::wasm32:
>     // Already 32-bit.
>     break;
> 
> @@ -1094,6 +1107,7 @@ Triple Triple::get32BitArchVariant() con
>   case Triple::amdil64:   T.setArch(Triple::amdil);   break;
>   case Triple::hsail64:   T.setArch(Triple::hsail);   break;
>   case Triple::spir64:    T.setArch(Triple::spir);    break;
> +  case Triple::wasm64:    T.setArch(Triple::wasm32);  break;
>   }
>   return T;
> }
> @@ -1134,6 +1148,7 @@ Triple Triple::get64BitArchVariant() con
>   case Triple::sparcv9:
>   case Triple::systemz:
>   case Triple::x86_64:
> +  case Triple::wasm64:
>     // Already 64-bit.
>     break;
> 
> @@ -1147,6 +1162,7 @@ Triple Triple::get64BitArchVariant() con
>   case Triple::amdil:   T.setArch(Triple::amdil64);   break;
>   case Triple::hsail:   T.setArch(Triple::hsail64);   break;
>   case Triple::spir:    T.setArch(Triple::spir64);    break;
> +  case Triple::wasm32:  T.setArch(Triple::wasm64);    break;
>   }
>   return T;
> }
> 
> Modified: llvm/trunk/lib/Target/LLVMBuild.txt
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/LLVMBuild.txt?rev=241022&r1=241021&r2=241022&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Target/LLVMBuild.txt (original)
> +++ llvm/trunk/lib/Target/LLVMBuild.txt Mon Jun 29 18:51:55 2015
> @@ -31,6 +31,7 @@ subdirectories =
>  PowerPC
>  Sparc
>  SystemZ
> + WebAssembly
>  X86
>  XCore
> 
> 
> Added: llvm/trunk/lib/Target/WebAssembly/CMakeLists.txt
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/WebAssembly/CMakeLists.txt?rev=241022&view=auto
> ==============================================================================
> --- llvm/trunk/lib/Target/WebAssembly/CMakeLists.txt (added)
> +++ llvm/trunk/lib/Target/WebAssembly/CMakeLists.txt Mon Jun 29 18:51:55 2015
> @@ -0,0 +1,24 @@
> +set(LLVM_TARGET_DEFINITIONS WebAssembly.td)
> +
> +tablegen(LLVM WebAssemblyGenMCCodeEmitter.inc -gen-emitter)
> +tablegen(LLVM WebAssemblyGenSubtargetInfo.inc -gen-subtarget)
> +add_public_tablegen_target(WebAssemblyCommonTableGen)
> +
> +add_llvm_target(WebAssemblyCodeGen
> +  WebAssemblyFrameLowering.cpp
> +  WebAssemblyInstrInfo.cpp
> +  WebAssemblyISelDAGToDAG.cpp
> +  WebAssemblyISelLowering.cpp
> +  WebAssemblyMachineFunctionInfo.cpp
> +  WebAssemblyRegisterInfo.cpp
> +  WebAssemblySelectionDAGInfo.cpp
> +  WebAssemblySubtarget.cpp
> +  WebAssemblyTargetMachine.cpp
> +  WebAssemblyTargetTransformInfo.cpp
> +)
> +
> +add_dependencies(LLVMWebAssemblyCodeGen intrinsics_gen)
> +
> +add_subdirectory(InstPrinter)
> +add_subdirectory(TargetInfo)
> +add_subdirectory(MCTargetDesc)
> 
> Added: llvm/trunk/lib/Target/WebAssembly/InstPrinter/CMakeLists.txt
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/WebAssembly/InstPrinter/CMakeLists.txt?rev=241022&view=auto
> ==============================================================================
> --- llvm/trunk/lib/Target/WebAssembly/InstPrinter/CMakeLists.txt (added)
> +++ llvm/trunk/lib/Target/WebAssembly/InstPrinter/CMakeLists.txt Mon Jun 29 18:51:55 2015
> @@ -0,0 +1,3 @@
> +add_llvm_library(LLVMWebAssemblyAsmPrinter
> +  WebAssemblyInstPrinter.cpp
> +  )
> 
> Added: llvm/trunk/lib/Target/WebAssembly/InstPrinter/LLVMBuild.txt
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/WebAssembly/InstPrinter/LLVMBuild.txt?rev=241022&view=auto
> ==============================================================================
> --- llvm/trunk/lib/Target/WebAssembly/InstPrinter/LLVMBuild.txt (added)
> +++ llvm/trunk/lib/Target/WebAssembly/InstPrinter/LLVMBuild.txt Mon Jun 29 18:51:55 2015
> @@ -0,0 +1,23 @@
> +;===- ./lib/Target/WebAssembly/InstPrinter/LLVMBuild.txt -------*- Conf -*--===;
> +;
> +;                     The LLVM Compiler Infrastructure
> +;
> +; This file is distributed under the University of Illinois Open Source
> +; License. See LICENSE.TXT for details.
> +;
> +;===------------------------------------------------------------------------===;
> +;
> +; This is an LLVMBuild description file for the components in this subdirectory.
> +;
> +; For more information on the LLVMBuild system, please see:
> +;
> +;   http://llvm.org/docs/LLVMBuild.html
> +;
> +;===------------------------------------------------------------------------===;
> +
> +[component_0]
> +type = Library
> +name = WebAssemblyAsmPrinter
> +parent = WebAssembly
> +required_libraries = MC Support
> +add_to_library_groups = WebAssembly
> 
> Added: llvm/trunk/lib/Target/WebAssembly/InstPrinter/Makefile
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/WebAssembly/InstPrinter/Makefile?rev=241022&view=auto
> ==============================================================================
> --- llvm/trunk/lib/Target/WebAssembly/InstPrinter/Makefile (added)
> +++ llvm/trunk/lib/Target/WebAssembly/InstPrinter/Makefile Mon Jun 29 18:51:55 2015
> @@ -0,0 +1,16 @@
> +##===- lib/Target/WebAssembly/AsmPrinter/Makefile ----------*- Makefile -*-===##
> +#
> +#                     The LLVM Compiler Infrastructure
> +#
> +# This file is distributed under the University of Illinois Open Source
> +# License. See LICENSE.TXT for details.
> +#
> +##===----------------------------------------------------------------------===##
> +
> +LEVEL = ../../../..
> +LIBRARYNAME = LLVMWebAssemblyAsmPrinter
> +
> +# Hack: we need to include 'main' wasm target directory to grab private headers
> +CPP.Flags += -I$(PROJ_OBJ_DIR)/.. -I$(PROJ_SRC_DIR)/..
> +
> +include $(LEVEL)/Makefile.common
> 
> Added: llvm/trunk/lib/Target/WebAssembly/InstPrinter/WebAssemblyInstPrinter.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/WebAssembly/InstPrinter/WebAssemblyInstPrinter.cpp?rev=241022&view=auto
> ==============================================================================
> --- llvm/trunk/lib/Target/WebAssembly/InstPrinter/WebAssemblyInstPrinter.cpp (added)
> +++ llvm/trunk/lib/Target/WebAssembly/InstPrinter/WebAssemblyInstPrinter.cpp Mon Jun 29 18:51:55 2015
> @@ -0,0 +1,43 @@
> +//=- WebAssemblyInstPrinter.cpp - WebAssembly assembly instruction printing -=//
> +//
> +//                     The LLVM Compiler Infrastructure
> +//
> +// This file is distributed under the University of Illinois Open Source
> +// License. See LICENSE.TXT for details.
> +//
> +//===----------------------------------------------------------------------===//
> +///
> +/// \file
> +/// \brief Print MCInst instructions to wasm format.
> +///
> +//===----------------------------------------------------------------------===//
> +
> +#include "InstPrinter/WebAssemblyInstPrinter.h"
> +#include "WebAssembly.h"
> +#include "llvm/MC/MCExpr.h"
> +#include "llvm/MC/MCInst.h"
> +#include "llvm/MC/MCInstrInfo.h"
> +#include "llvm/MC/MCSubtargetInfo.h"
> +#include "llvm/MC/MCSymbol.h"
> +#include "llvm/Support/ErrorHandling.h"
> +#include "llvm/Support/FormattedStream.h"
> +#include <cctype>
> +using namespace llvm;
> +
> +#define DEBUG_TYPE "asm-printer"
> +
> +WebAssemblyInstPrinter::WebAssemblyInstPrinter(const MCAsmInfo &MAI,
> +                                               const MCInstrInfo &MII,
> +                                               const MCRegisterInfo &MRI)
> +    : MCInstPrinter(MAI, MII, MRI) {}
> +
> +void WebAssemblyInstPrinter::printRegName(raw_ostream &OS,
> +                                          unsigned RegNo) const {
> +  llvm_unreachable("TODO: implement printRegName");
> +}
> +
> +void WebAssemblyInstPrinter::printInst(const MCInst *MI, raw_ostream &OS,
> +                                       StringRef Annot,
> +                                       const MCSubtargetInfo &STI) {
> +  llvm_unreachable("TODO: implement printInst");
> +}
> 
> Added: llvm/trunk/lib/Target/WebAssembly/InstPrinter/WebAssemblyInstPrinter.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/WebAssembly/InstPrinter/WebAssemblyInstPrinter.h?rev=241022&view=auto
> ==============================================================================
> --- llvm/trunk/lib/Target/WebAssembly/InstPrinter/WebAssemblyInstPrinter.h (added)
> +++ llvm/trunk/lib/Target/WebAssembly/InstPrinter/WebAssemblyInstPrinter.h Mon Jun 29 18:51:55 2015
> @@ -0,0 +1,38 @@
> +// WebAssemblyInstPrinter.h - Print wasm MCInst to assembly syntax -*- C++ -*-//
> +//
> +//                     The LLVM Compiler Infrastructure
> +//
> +// This file is distributed under the University of Illinois Open Source
> +// License. See LICENSE.TXT for details.
> +//
> +//===----------------------------------------------------------------------===//
> +///
> +/// \file
> +/// \brief This class prints an WebAssembly MCInst to wasm file syntax.
> +///
> +//===----------------------------------------------------------------------===//
> +
> +#ifndef LLVM_LIB_TARGET_WEBASSEMBLY_INSTPRINTER_WEBASSEMBLYINSTPRINTER_H
> +#define LLVM_LIB_TARGET_WEBASSEMBLY_INSTPRINTER_WEBASSEMBLYINSTPRINTER_H
> +
> +#include "llvm/MC/MCInstPrinter.h"
> +#include "llvm/Support/raw_ostream.h"
> +
> +namespace llvm {
> +
> +class MCOperand;
> +class MCSubtargetInfo;
> +
> +class WebAssemblyInstPrinter : public MCInstPrinter {
> +public:
> +  WebAssemblyInstPrinter(const MCAsmInfo &MAI, const MCInstrInfo &MII,
> +                         const MCRegisterInfo &MRI);
> +
> +  void printRegName(raw_ostream &OS, unsigned RegNo) const override;
> +  void printInst(const MCInst *MI, raw_ostream &OS, StringRef Annot,
> +                 const MCSubtargetInfo &STI) override;
> +};
> +
> +} // end namespace llvm
> +
> +#endif
> 
> Added: llvm/trunk/lib/Target/WebAssembly/LLVMBuild.txt
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/WebAssembly/LLVMBuild.txt?rev=241022&view=auto
> ==============================================================================
> --- llvm/trunk/lib/Target/WebAssembly/LLVMBuild.txt (added)
> +++ llvm/trunk/lib/Target/WebAssembly/LLVMBuild.txt Mon Jun 29 18:51:55 2015
> @@ -0,0 +1,32 @@
> +;===- ./lib/Target/WebAssembly/LLVMBuild.txt -------------------*- Conf -*--===;
> +;
> +;                     The LLVM Compiler Infrastructure
> +;
> +; This file is distributed under the University of Illinois Open Source
> +; License. See LICENSE.TXT for details.
> +;
> +;===------------------------------------------------------------------------===;
> +;
> +; This is an LLVMBuild description file for the components in this subdirectory.
> +;
> +; For more information on the LLVMBuild system, please see:
> +;
> +;   http://llvm.org/docs/LLVMBuild.html
> +;
> +;===------------------------------------------------------------------------===;
> +
> +[common]
> +subdirectories = InstPrinter MCTargetDesc TargetInfo
> +
> +[component_0]
> +type = TargetGroup
> +name = WebAssembly
> +parent = Target
> +has_asmprinter = 1
> +
> +[component_1]
> +type = Library
> +name = WebAssemblyCodeGen
> +parent = WebAssembly
> +required_libraries = Analysis AsmPrinter CodeGen Core MC Scalar SelectionDAG Support Target WebAssemblyDesc WebAssemblyInfo
> +add_to_library_groups = WebAssembly
> 
> Added: llvm/trunk/lib/Target/WebAssembly/MCTargetDesc/CMakeLists.txt
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/WebAssembly/MCTargetDesc/CMakeLists.txt?rev=241022&view=auto
> ==============================================================================
> --- llvm/trunk/lib/Target/WebAssembly/MCTargetDesc/CMakeLists.txt (added)
> +++ llvm/trunk/lib/Target/WebAssembly/MCTargetDesc/CMakeLists.txt Mon Jun 29 18:51:55 2015
> @@ -0,0 +1,4 @@
> +add_llvm_library(LLVMWebAssemblyDesc
> +  WebAssemblyMCAsmInfo.cpp
> +  WebAssemblyMCTargetDesc.cpp
> +)
> 
> Added: llvm/trunk/lib/Target/WebAssembly/MCTargetDesc/LLVMBuild.txt
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/WebAssembly/MCTargetDesc/LLVMBuild.txt?rev=241022&view=auto
> ==============================================================================
> --- llvm/trunk/lib/Target/WebAssembly/MCTargetDesc/LLVMBuild.txt (added)
> +++ llvm/trunk/lib/Target/WebAssembly/MCTargetDesc/LLVMBuild.txt Mon Jun 29 18:51:55 2015
> @@ -0,0 +1,23 @@
> +;===- ./lib/Target/WebAssembly/MCTargetDesc/LLVMBuild.txt ------*- Conf -*--===;
> +;
> +;                     The LLVM Compiler Infrastructure
> +;
> +; This file is distributed under the University of Illinois Open Source
> +; License. See LICENSE.TXT for details.
> +;
> +;===------------------------------------------------------------------------===;
> +;
> +; This is an LLVMBuild description file for the components in this subdirectory.
> +;
> +; For more information on the LLVMBuild system, please see:
> +;
> +;   http://llvm.org/docs/LLVMBuild.html
> +;
> +;===------------------------------------------------------------------------===;
> +
> +[component_0]
> +type = Library
> +name = WebAssemblyDesc
> +parent = WebAssembly
> +required_libraries = MC Support WebAssemblyAsmPrinter WebAssemblyInfo
> +add_to_library_groups = WebAssembly
> 
> Added: llvm/trunk/lib/Target/WebAssembly/MCTargetDesc/Makefile
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/WebAssembly/MCTargetDesc/Makefile?rev=241022&view=auto
> ==============================================================================
> --- llvm/trunk/lib/Target/WebAssembly/MCTargetDesc/Makefile (added)
> +++ llvm/trunk/lib/Target/WebAssembly/MCTargetDesc/Makefile Mon Jun 29 18:51:55 2015
> @@ -0,0 +1,16 @@
> +##===- lib/Target/WebAssembly/TargetDesc/Makefile ----------*- Makefile -*-===##
> +#
> +#                     The LLVM Compiler Infrastructure
> +#
> +# This file is distributed under the University of Illinois Open Source
> +# License. See LICENSE.TXT for details.
> +#
> +##===----------------------------------------------------------------------===##
> +
> +LEVEL = ../../../..
> +LIBRARYNAME = LLVMWebAssemblyDesc
> +
> +# Hack: we need to include 'main' target directory to grab private headers
> +CPP.Flags += -I$(PROJ_OBJ_DIR)/.. -I$(PROJ_SRC_DIR)/..
> +
> +include $(LEVEL)/Makefile.common
> 
> Added: llvm/trunk/lib/Target/WebAssembly/MCTargetDesc/WebAssemblyMCAsmInfo.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/WebAssembly/MCTargetDesc/WebAssemblyMCAsmInfo.cpp?rev=241022&view=auto
> ==============================================================================
> --- llvm/trunk/lib/Target/WebAssembly/MCTargetDesc/WebAssemblyMCAsmInfo.cpp (added)
> +++ llvm/trunk/lib/Target/WebAssembly/MCTargetDesc/WebAssemblyMCAsmInfo.cpp Mon Jun 29 18:51:55 2015
> @@ -0,0 +1,53 @@
> +//===-- WebAssemblyMCAsmInfo.cpp - WebAssembly asm properties -------------===//
> +//
> +//                     The LLVM Compiler Infrastructure
> +//
> +// This file is distributed under the University of Illinois Open Source
> +// License. See LICENSE.TXT for details.
> +//
> +//===----------------------------------------------------------------------===//
> +///
> +/// \file
> +/// \brief This file contains the declarations of the WebAssemblyMCAsmInfo
> +/// properties.
> +///
> +//===----------------------------------------------------------------------===//
> +
> +#include "WebAssemblyMCAsmInfo.h"
> +#include "llvm/ADT/Triple.h"
> +#include "llvm/Support/CommandLine.h"
> +using namespace llvm;
> +
> +#define DEBUG_TYPE "wasm-mc-asm-info"
> +
> +WebAssemblyMCAsmInfo::~WebAssemblyMCAsmInfo() {}
> +
> +WebAssemblyMCAsmInfo::WebAssemblyMCAsmInfo(const Triple &T) {
> +  PointerSize = CalleeSaveStackSlotSize = T.isArch64Bit();
> +
> +  // TODO: What should MaxInstLength be?
> +
> +  PrivateGlobalPrefix = "";
> +  PrivateLabelPrefix = "";
> +
> +  UseDataRegionDirectives = true;
> +
> +  Data8bitsDirective = "\t.int8\t";
> +  Data16bitsDirective = "\t.int16\t";
> +  Data32bitsDirective = "\t.int32\t";
> +  Data64bitsDirective = "\t.int64\t";
> +
> +  AlignmentIsInBytes = false;
> +  COMMDirectiveAlignmentIsInBytes = false;
> +  LCOMMDirectiveAlignmentType = LCOMM::Log2Alignment;
> +
> +  HasDotTypeDotSizeDirective = false;
> +  HasSingleParameterDotFile = false;
> +
> +  SupportsDebugInformation = true;
> +
> +  // For now, WebAssembly does not support exceptions.
> +  ExceptionsType = ExceptionHandling::None;
> +
> +  // TODO: UseIntegratedAssembler?
> +}
> 
> Added: llvm/trunk/lib/Target/WebAssembly/MCTargetDesc/WebAssemblyMCAsmInfo.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/WebAssembly/MCTargetDesc/WebAssemblyMCAsmInfo.h?rev=241022&view=auto
> ==============================================================================
> --- llvm/trunk/lib/Target/WebAssembly/MCTargetDesc/WebAssemblyMCAsmInfo.h (added)
> +++ llvm/trunk/lib/Target/WebAssembly/MCTargetDesc/WebAssemblyMCAsmInfo.h Mon Jun 29 18:51:55 2015
> @@ -0,0 +1,32 @@
> +//===-- WebAssemblyMCAsmInfo.h - WebAssembly asm properties -----*- C++ -*-===//
> +//
> +//                     The LLVM Compiler Infrastructure
> +//
> +// This file is distributed under the University of Illinois Open Source
> +// License. See LICENSE.TXT for details.
> +//
> +//===----------------------------------------------------------------------===//
> +///
> +/// \file
> +/// \brief This file contains the declaration of the WebAssemblyMCAsmInfo class.
> +///
> +//===----------------------------------------------------------------------===//
> +
> +#ifndef LLVM_LIB_TARGET_WEBASSEMBLY_MCTARGETDESC_WEBASSEMBLYMCASMINFO_H
> +#define LLVM_LIB_TARGET_WEBASSEMBLY_MCTARGETDESC_WEBASSEMBLYMCASMINFO_H
> +
> +#include "llvm/MC/MCAsmInfo.h"
> +
> +namespace llvm {
> +
> +class Triple;
> +
> +class WebAssemblyMCAsmInfo final : public MCAsmInfo {
> +public:
> +  explicit WebAssemblyMCAsmInfo(const Triple &T);
> +  ~WebAssemblyMCAsmInfo() override;
> +};
> +
> +} // end namespace llvm
> +
> +#endif
> 
> Added: llvm/trunk/lib/Target/WebAssembly/MCTargetDesc/WebAssemblyMCTargetDesc.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/WebAssembly/MCTargetDesc/WebAssemblyMCTargetDesc.cpp?rev=241022&view=auto
> ==============================================================================
> --- llvm/trunk/lib/Target/WebAssembly/MCTargetDesc/WebAssemblyMCTargetDesc.cpp (added)
> +++ llvm/trunk/lib/Target/WebAssembly/MCTargetDesc/WebAssemblyMCTargetDesc.cpp Mon Jun 29 18:51:55 2015
> @@ -0,0 +1,56 @@
> +//===-- WebAssemblyMCTargetDesc.cpp - WebAssembly Target Descriptions -----===//
> +//
> +//                     The LLVM Compiler Infrastructure
> +//
> +// This file is distributed under the University of Illinois Open Source
> +// License. See LICENSE.TXT for details.
> +//
> +//===----------------------------------------------------------------------===//
> +///
> +/// \file
> +/// \brief This file provides WebAssembly-specific target descriptions.
> +///
> +//===----------------------------------------------------------------------===//
> +
> +#include "WebAssemblyMCTargetDesc.h"
> +#include "InstPrinter/WebAssemblyInstPrinter.h"
> +#include "WebAssemblyMCAsmInfo.h"
> +#include "llvm/MC/MCCodeGenInfo.h"
> +#include "llvm/MC/MCInstrInfo.h"
> +#include "llvm/MC/MCRegisterInfo.h"
> +#include "llvm/MC/MCStreamer.h"
> +#include "llvm/MC/MCSubtargetInfo.h"
> +#include "llvm/Support/ErrorHandling.h"
> +#include "llvm/Support/TargetRegistry.h"
> +using namespace llvm;
> +
> +#define DEBUG_TYPE "wasm-mc-target-desc"
> +
> +#define GET_SUBTARGETINFO_MC_DESC
> +#include "WebAssemblyGenSubtargetInfo.inc"
> +
> +static MCAsmInfo *createWebAssemblyMCAsmInfo(const MCRegisterInfo &MRI,
> +                                             const Triple &TT) {
> +  MCAsmInfo *MAI = new WebAssemblyMCAsmInfo(TT);
> +  return MAI;
> +}
> +
> +static MCInstPrinter *
> +createWebAssemblyMCInstPrinter(const Triple &T, unsigned SyntaxVariant,
> +                               const MCAsmInfo &MAI, const MCInstrInfo &MII,
> +                               const MCRegisterInfo &MRI) {
> +  if (SyntaxVariant == 0 || SyntaxVariant == 1)
> +    return new WebAssemblyInstPrinter(MAI, MII, MRI);
> +  return nullptr;
> +}
> +
> +// Force static initialization.
> +extern "C" void LLVMInitializeWebAssemblyTargetMC() {
> +  for (Target *T : {&TheWebAssemblyTarget}) {
> +    // Register the MC asm info.
> +    RegisterMCAsmInfoFn X(*T, createWebAssemblyMCAsmInfo);
> +
> +    // Register the MCInstPrinter.
> +    TargetRegistry::RegisterMCInstPrinter(*T, createWebAssemblyMCInstPrinter);
> +  }
> +}
> 
> Added: llvm/trunk/lib/Target/WebAssembly/MCTargetDesc/WebAssemblyMCTargetDesc.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/WebAssembly/MCTargetDesc/WebAssemblyMCTargetDesc.h?rev=241022&view=auto
> ==============================================================================
> --- llvm/trunk/lib/Target/WebAssembly/MCTargetDesc/WebAssemblyMCTargetDesc.h (added)
> +++ llvm/trunk/lib/Target/WebAssembly/MCTargetDesc/WebAssemblyMCTargetDesc.h Mon Jun 29 18:51:55 2015
> @@ -0,0 +1,52 @@
> +//==- WebAssemblyMCTargetDesc.h - WebAssembly Target Descriptions -*- C++ -*-=//
> +//
> +//                     The LLVM Compiler Infrastructure
> +//
> +// This file is distributed under the University of Illinois Open Source
> +// License. See LICENSE.TXT for details.
> +//
> +//===----------------------------------------------------------------------===//
> +///
> +/// \file
> +/// \brief This file provides WebAssembly-specific target descriptions.
> +///
> +//===----------------------------------------------------------------------===//
> +
> +#ifndef LLVM_LIB_TARGET_WEBASSEMBLY_MCTARGETDESC_WEBASSEMBLYMCTARGETDESC_H
> +#define LLVM_LIB_TARGET_WEBASSEMBLY_MCTARGETDESC_WEBASSEMBLYMCTARGETDESC_H
> +
> +#include "llvm/Support/DataTypes.h"
> +#include <string>
> +
> +namespace llvm {
> +
> +class formatted_raw_ostream;
> +class MCAsmBackend;
> +class MCCodeEmitter;
> +class MCContext;
> +class MCInstrInfo;
> +class MCRegisterInfo;
> +class MCObjectWriter;
> +class MCStreamer;
> +class MCSubtargetInfo;
> +class MCTargetStreamer;
> +class StringRef;
> +class Target;
> +class Triple;
> +class raw_ostream;
> +
> +extern Target TheWebAssemblyTarget;
> +
> +MCAsmBackend *createWebAssemblyAsmBackend(const Target &T,
> +                                          const MCRegisterInfo &MRI,
> +                                          StringRef TT, StringRef CPU);
> +
> +} // end namespace llvm
> +
> +// Defines symbolic names for WebAssembly registers. This defines a mapping from
> +// register name to register number.
> +//
> +#define GET_SUBTARGETINFO_ENUM
> +#include "WebAssemblyGenSubtargetInfo.inc"
> +
> +#endif
> 
> Added: llvm/trunk/lib/Target/WebAssembly/Makefile
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/WebAssembly/Makefile?rev=241022&view=auto
> ==============================================================================
> --- llvm/trunk/lib/Target/WebAssembly/Makefile (added)
> +++ llvm/trunk/lib/Target/WebAssembly/Makefile Mon Jun 29 18:51:55 2015
> @@ -0,0 +1,19 @@
> +##===- lib/Target/WebAssembly/Makefile ---------------------*- Makefile -*-===##
> +#
> +#                     The LLVM Compiler Infrastructure
> +#
> +# This file is distributed under the University of Illinois Open Source
> +# License. See LICENSE.TXT for details.
> +#
> +##===----------------------------------------------------------------------===##
> +
> +LEVEL = ../../..
> +LIBRARYNAME = LLVMWebAssemblyCodeGen
> +TARGET = WebAssembly
> +
> +# Make sure that tblgen is run, first thing.
> +BUILT_SOURCES = WebAssemblyGenSubtargetInfo.inc WebAssemblyGenMCCodeEmitter.inc
> +
> +DIRS = InstPrinter TargetInfo MCTargetDesc
> +
> +include $(LEVEL)/Makefile.common
> 
> Added: llvm/trunk/lib/Target/WebAssembly/README.txt
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/WebAssembly/README.txt?rev=241022&view=auto
> ==============================================================================
> --- llvm/trunk/lib/Target/WebAssembly/README.txt (added)
> +++ llvm/trunk/lib/Target/WebAssembly/README.txt Mon Jun 29 18:51:55 2015
> @@ -0,0 +1,15 @@
> +//===-- README.txt - Notes for WebAssembly code gen -----------------------===//
> +
> +This WebAssembly backend is presently in a very early stage of development.
> +The code should build and not break anything else, but don't expect a lot more
> +at this point.
> +
> +For more information on WebAssembly itself, see the design documents:
> +  * https://github.com/WebAssembly/design/blob/master/README.md
> +
> +The following documents contain some information on the planned semantics and
> +binary encoding of WebAssembly itself:
> +  * https://github.com/WebAssembly/design/blob/master/AstSemantics.md
> +  * https://github.com/WebAssembly/design/blob/master/BinaryEncoding.md
> +
> +//===---------------------------------------------------------------------===//
> 
> Added: llvm/trunk/lib/Target/WebAssembly/TargetInfo/CMakeLists.txt
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/WebAssembly/TargetInfo/CMakeLists.txt?rev=241022&view=auto
> ==============================================================================
> --- llvm/trunk/lib/Target/WebAssembly/TargetInfo/CMakeLists.txt (added)
> +++ llvm/trunk/lib/Target/WebAssembly/TargetInfo/CMakeLists.txt Mon Jun 29 18:51:55 2015
> @@ -0,0 +1,7 @@
> +include_directories( ${CMAKE_CURRENT_BINARY_DIR}/.. ${CMAKE_CURRENT_SOURCE_DIR}/.. )
> +
> +add_llvm_library(LLVMWebAssemblyInfo
> +  WebAssemblyTargetInfo.cpp
> +  )
> +
> +add_dependencies(LLVMWebAssemblyInfo WebAssemblyCommonTableGen)
> 
> Added: llvm/trunk/lib/Target/WebAssembly/TargetInfo/LLVMBuild.txt
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/WebAssembly/TargetInfo/LLVMBuild.txt?rev=241022&view=auto
> ==============================================================================
> --- llvm/trunk/lib/Target/WebAssembly/TargetInfo/LLVMBuild.txt (added)
> +++ llvm/trunk/lib/Target/WebAssembly/TargetInfo/LLVMBuild.txt Mon Jun 29 18:51:55 2015
> @@ -0,0 +1,23 @@
> +;===- ./lib/Target/WebAssembly/TargetInfo/LLVMBuild.txt --------*- Conf -*--===;
> +;
> +;                     The LLVM Compiler Infrastructure
> +;
> +; This file is distributed under the University of Illinois Open Source
> +; License. See LICENSE.TXT for details.
> +;
> +;===------------------------------------------------------------------------===;
> +;
> +; This is an LLVMBuild description file for the components in this subdirectory.
> +;
> +; For more information on the LLVMBuild system, please see:
> +;
> +;   http://llvm.org/docs/LLVMBuild.html
> +;
> +;===------------------------------------------------------------------------===;
> +
> +[component_0]
> +type = Library
> +name = WebAssemblyInfo
> +parent = WebAssembly
> +required_libraries = Support
> +add_to_library_groups = WebAssembly
> 
> Added: llvm/trunk/lib/Target/WebAssembly/TargetInfo/Makefile
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/WebAssembly/TargetInfo/Makefile?rev=241022&view=auto
> ==============================================================================
> --- llvm/trunk/lib/Target/WebAssembly/TargetInfo/Makefile (added)
> +++ llvm/trunk/lib/Target/WebAssembly/TargetInfo/Makefile Mon Jun 29 18:51:55 2015
> @@ -0,0 +1,15 @@
> +##===- lib/Target/WebAssembly/TargetInfo/Makefile ----------*- Makefile -*-===##
> +#
> +#                     The LLVM Compiler Infrastructure
> +#
> +# This file is distributed under the University of Illinois Open Source
> +# License. See LICENSE.TXT for details.
> +#
> +##===----------------------------------------------------------------------===##
> +LEVEL = ../../../..
> +LIBRARYNAME = LLVMWebAssemblyInfo
> +
> +# Hack: we need to include 'main' target directory to grab private headers
> +CPPFLAGS = -I$(PROJ_OBJ_DIR)/.. -I$(PROJ_SRC_DIR)/..
> +
> +include $(LEVEL)/Makefile.common
> 
> Added: llvm/trunk/lib/Target/WebAssembly/TargetInfo/WebAssemblyTargetInfo.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/WebAssembly/TargetInfo/WebAssemblyTargetInfo.cpp?rev=241022&view=auto
> ==============================================================================
> --- llvm/trunk/lib/Target/WebAssembly/TargetInfo/WebAssemblyTargetInfo.cpp (added)
> +++ llvm/trunk/lib/Target/WebAssembly/TargetInfo/WebAssemblyTargetInfo.cpp Mon Jun 29 18:51:55 2015
> @@ -0,0 +1,29 @@
> +//===-- WebAssemblyTargetInfo.cpp - WebAssembly Target Implementation -----===//
> +//
> +//                     The LLVM Compiler Infrastructure
> +//
> +// This file is distributed under the University of Illinois Open Source
> +// License. See LICENSE.TXT for details.
> +//
> +//===----------------------------------------------------------------------===//
> +///
> +/// \file
> +/// \brief This file registers the WebAssembly target.
> +///
> +//===----------------------------------------------------------------------===//
> +
> +#include "MCTargetDesc/WebAssemblyMCTargetDesc.h"
> +#include "llvm/ADT/Triple.h"
> +#include "llvm/Support/TargetRegistry.h"
> +using namespace llvm;
> +
> +#define DEBUG_TYPE "wasm-target-info"
> +
> +Target llvm::TheWebAssemblyTarget;
> +
> +extern "C" void LLVMInitializeWebAssemblyTargetInfo() {
> +  RegisterTarget<Triple::wasm32> X(TheWebAssemblyTarget, "wasm32",
> +                                   "WebAssembly 32-bit");
> +  RegisterTarget<Triple::wasm64> Y(TheWebAssemblyTarget, "wasm64",
> +                                   "WebAssembly 64-bit");
> +}
> 
> Added: llvm/trunk/lib/Target/WebAssembly/WebAssembly.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/WebAssembly/WebAssembly.h?rev=241022&view=auto
> ==============================================================================
> --- llvm/trunk/lib/Target/WebAssembly/WebAssembly.h (added)
> +++ llvm/trunk/lib/Target/WebAssembly/WebAssembly.h Mon Jun 29 18:51:55 2015
> @@ -0,0 +1,31 @@
> +//===-- WebAssembly.h - Top-level interface for WebAssembly  ----*- C++ -*-===//
> +//
> +//                     The LLVM Compiler Infrastructure
> +//
> +// This file is distributed under the University of Illinois Open Source
> +// License. See LICENSE.TXT for details.
> +//
> +//===----------------------------------------------------------------------===//
> +///
> +/// \file
> +/// \brief This file contains the entry points for global functions defined in
> +/// the LLVM WebAssembly back-end.
> +///
> +//===----------------------------------------------------------------------===//
> +
> +#ifndef LLVM_LIB_TARGET_WEBASSEMBLY_WEBASSEMBLY_H
> +#define LLVM_LIB_TARGET_WEBASSEMBLY_WEBASSEMBLY_H
> +
> +#include "llvm/Support/CodeGen.h"
> +
> +namespace llvm {
> +
> +class WebAssemblyTargetMachine;
> +class FunctionPass;
> +
> +FunctionPass *createWebAssemblyISelDag(WebAssemblyTargetMachine &TM,
> +                                       CodeGenOpt::Level OptLevel);
> +
> +} // end namespace llvm
> +
> +#endif
> 
> Added: llvm/trunk/lib/Target/WebAssembly/WebAssembly.td
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/WebAssembly/WebAssembly.td?rev=241022&view=auto
> ==============================================================================
> --- llvm/trunk/lib/Target/WebAssembly/WebAssembly.td (added)
> +++ llvm/trunk/lib/Target/WebAssembly/WebAssembly.td Mon Jun 29 18:51:55 2015
> @@ -0,0 +1,58 @@
> +//- WebAssembly.td - Describe the WebAssembly Target Machine --*- tablegen -*-//
> +//
> +//                     The LLVM Compiler Infrastructure
> +//
> +// This file is distributed under the University of Illinois Open Source
> +// License. See LICENSE.TXT for details.
> +//
> +//===----------------------------------------------------------------------===//
> +//
> +// This is a target description file for the WebAssembly architecture, which is
> +// also known as "wasm".
> +//
> +//===----------------------------------------------------------------------===//
> +
> +//===----------------------------------------------------------------------===//
> +// Target-independent interfaces which we are implementing
> +//===----------------------------------------------------------------------===//
> +
> +include "llvm/Target/Target.td"
> +
> +//===----------------------------------------------------------------------===//
> +// WebAssembly Subtarget features.
> +//===----------------------------------------------------------------------===//
> +
> +def FeatureSIMD : SubtargetFeature<"simd", "HasSIMD", "true",
> +                                   "Enable SIMD">;
> +
> +//===----------------------------------------------------------------------===//
> +// Architectures.
> +//===----------------------------------------------------------------------===//
> +
> +//===----------------------------------------------------------------------===//
> +// Register File Description
> +//===----------------------------------------------------------------------===//
> +
> +include "WebAssemblyRegisterInfo.td"
> +
> +//===----------------------------------------------------------------------===//
> +// Instruction Descriptions
> +//===----------------------------------------------------------------------===//
> +
> +include "WebAssemblyInstrInfo.td"
> +
> +def WebAssemblyInstrInfo : InstrInfo;
> +
> +//===----------------------------------------------------------------------===//
> +// WebAssembly Processors supported.
> +//===----------------------------------------------------------------------===//
> +
> +def : ProcessorModel<"generic", NoSchedModel, [FeatureSIMD]>;
> +
> +//===----------------------------------------------------------------------===//
> +// Target Declaration
> +//===----------------------------------------------------------------------===//
> +
> +def WebAssembly : Target {
> +  let InstructionSet = WebAssemblyInstrInfo;
> +}
> 
> Added: llvm/trunk/lib/Target/WebAssembly/WebAssemblyFrameLowering.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/WebAssembly/WebAssemblyFrameLowering.cpp?rev=241022&view=auto
> ==============================================================================
> --- llvm/trunk/lib/Target/WebAssembly/WebAssemblyFrameLowering.cpp (added)
> +++ llvm/trunk/lib/Target/WebAssembly/WebAssemblyFrameLowering.cpp Mon Jun 29 18:51:55 2015
> @@ -0,0 +1,74 @@
> +//===-- WebAssemblyFrameLowering.cpp - WebAssembly Frame Lowering ----------==//
> +//
> +//                     The LLVM Compiler Infrastructure
> +//
> +// This file is distributed under the University of Illinois Open Source
> +// License. See LICENSE.TXT for details.
> +//
> +//===----------------------------------------------------------------------===//
> +///
> +/// \file
> +/// \brief This file contains the WebAssembly implementation of
> +/// TargetFrameLowering class.
> +///
> +/// On WebAssembly, there aren't a lot of things to do here. There are no
> +/// callee-saved registers to save, and no spill slots.
> +///
> +/// The stack grows downward.
> +///
> +//===----------------------------------------------------------------------===//
> +
> +#include "WebAssemblyFrameLowering.h"
> +#include "MCTargetDesc/WebAssemblyMCTargetDesc.h"
> +#include "WebAssemblyInstrInfo.h"
> +#include "WebAssemblyMachineFunctionInfo.h"
> +#include "WebAssemblySubtarget.h"
> +#include "WebAssemblyTargetMachine.h"
> +#include "llvm/CodeGen/MachineFrameInfo.h"
> +#include "llvm/CodeGen/MachineFunction.h"
> +#include "llvm/CodeGen/MachineInstrBuilder.h"
> +#include "llvm/CodeGen/MachineModuleInfo.h"
> +#include "llvm/CodeGen/MachineRegisterInfo.h"
> +#include "llvm/Support/Debug.h"
> +using namespace llvm;
> +
> +#define DEBUG_TYPE "frame-info"
> +
> +// TODO: Implement a red zone?
> +
> +/// Return true if the specified function should have a dedicated frame pointer
> +/// register.
> +bool WebAssemblyFrameLowering::hasFP(const MachineFunction &MF) const {
> +  llvm_unreachable("TODO: implement hasFP");
> +}
> +
> +/// Under normal circumstances, when a frame pointer is not required, we reserve
> +/// argument space for call sites in the function immediately on entry to the
> +/// current function. This eliminates the need for add/sub sp brackets around
> +/// call sites. Returns true if the call frame is included as part of the stack
> +/// frame.
> +bool WebAssemblyFrameLowering::hasReservedCallFrame(
> +    const MachineFunction &MF) const {
> +  return !MF.getFrameInfo()->hasVarSizedObjects();
> +}
> +
> +void WebAssemblyFrameLowering::eliminateCallFramePseudoInstr(
> +    MachineFunction &MF, MachineBasicBlock &MBB,
> +    MachineBasicBlock::iterator I) const {
> +  llvm_unreachable("TODO: implement eliminateCallFramePseudoInstr");
> +}
> +
> +void WebAssemblyFrameLowering::emitPrologue(MachineFunction &MF,
> +                                            MachineBasicBlock &MBB) const {
> +  llvm_unreachable("TODO: implement emitPrologue");
> +}
> +
> +void WebAssemblyFrameLowering::emitEpilogue(MachineFunction &MF,
> +                                            MachineBasicBlock &MBB) const {
> +  llvm_unreachable("TODO: implement emitEpilogue");
> +}
> +
> +void WebAssemblyFrameLowering::processFunctionBeforeCalleeSavedScan(
> +    MachineFunction &MF, RegScavenger *RS) const {
> +  llvm_unreachable("TODO: implement processFunctionBeforeCalleeSavedScan");
> +}
> 
> Added: llvm/trunk/lib/Target/WebAssembly/WebAssemblyFrameLowering.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/WebAssembly/WebAssemblyFrameLowering.h?rev=241022&view=auto
> ==============================================================================
> --- llvm/trunk/lib/Target/WebAssembly/WebAssemblyFrameLowering.h (added)
> +++ llvm/trunk/lib/Target/WebAssembly/WebAssemblyFrameLowering.h Mon Jun 29 18:51:55 2015
> @@ -0,0 +1,48 @@
> +// WebAssemblyFrameLowering.h - TargetFrameLowering for WebAssembly -*- C++ -*-/
> +//
> +//                     The LLVM Compiler Infrastructure
> +//
> +// This file is distributed under the University of Illinois Open Source
> +// License. See LICENSE.TXT for details.
> +//
> +//===----------------------------------------------------------------------===//
> +///
> +/// \file
> +/// \brief This class implements WebAssembly-specific bits of
> +/// TargetFrameLowering class.
> +///
> +//===----------------------------------------------------------------------===//
> +
> +#ifndef LLVM_LIB_TARGET_WEBASSEMBLY_WEBASSEMBLYFRAMELOWERING_H
> +#define LLVM_LIB_TARGET_WEBASSEMBLY_WEBASSEMBLYFRAMELOWERING_H
> +
> +#include "llvm/Target/TargetFrameLowering.h"
> +
> +namespace llvm {
> +
> +class WebAssemblyFrameLowering final : public TargetFrameLowering {
> +public:
> +  WebAssemblyFrameLowering()
> +      : TargetFrameLowering(StackGrowsDown, /*StackAlignment=*/16,
> +                            /*LocalAreaOffset=*/0,
> +                            /*TransientStackAlignment=*/16,
> +                            /*StackRealignable=*/true) {}
> +
> +  void
> +  eliminateCallFramePseudoInstr(MachineFunction &MF, MachineBasicBlock &MBB,
> +                                MachineBasicBlock::iterator I) const override;
> +
> +  /// These methods insert prolog and epilog code into the function.
> +  void emitPrologue(MachineFunction &MF, MachineBasicBlock &MBB) const override;
> +  void emitEpilogue(MachineFunction &MF, MachineBasicBlock &MBB) const override;
> +
> +  bool hasFP(const MachineFunction &MF) const override;
> +  bool hasReservedCallFrame(const MachineFunction &MF) const override;
> +
> +  void processFunctionBeforeCalleeSavedScan(MachineFunction &MF,
> +                                            RegScavenger *RS) const override;
> +};
> +
> +} // end namespace llvm
> +
> +#endif
> 
> Added: llvm/trunk/lib/Target/WebAssembly/WebAssemblyISelDAGToDAG.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/WebAssembly/WebAssemblyISelDAGToDAG.cpp?rev=241022&view=auto
> ==============================================================================
> --- llvm/trunk/lib/Target/WebAssembly/WebAssemblyISelDAGToDAG.cpp (added)
> +++ llvm/trunk/lib/Target/WebAssembly/WebAssemblyISelDAGToDAG.cpp Mon Jun 29 18:51:55 2015
> @@ -0,0 +1,73 @@
> +//- WebAssemblyISelDAGToDAG.cpp - A dag to dag inst selector for WebAssembly -//
> +//
> +//                     The LLVM Compiler Infrastructure
> +//
> +// This file is distributed under the University of Illinois Open Source
> +// License. See LICENSE.TXT for details.
> +//
> +//===----------------------------------------------------------------------===//
> +///
> +/// \file
> +/// \brief This file defines an instruction selector for the WebAssembly target.
> +///
> +//===----------------------------------------------------------------------===//
> +
> +#include "WebAssembly.h"
> +#include "MCTargetDesc/WebAssemblyMCTargetDesc.h"
> +#include "WebAssemblyTargetMachine.h"
> +#include "llvm/CodeGen/SelectionDAGISel.h"
> +#include "llvm/IR/Function.h" // To access function attributes.
> +#include "llvm/Support/Debug.h"
> +#include "llvm/Support/MathExtras.h"
> +#include "llvm/Support/raw_ostream.h"
> +using namespace llvm;
> +
> +#define DEBUG_TYPE "wasm-isel"
> +
> +//===--------------------------------------------------------------------===//
> +/// WebAssembly-specific code to select WebAssembly machine instructions for
> +/// SelectionDAG operations.
> +///
> +namespace {
> +class WebAssemblyDAGToDAGISel final : public SelectionDAGISel {
> +  /// Keep a pointer to the WebAssemblySubtarget around so that we can make the
> +  /// right decision when generating code for different targets.
> +  const WebAssemblySubtarget *Subtarget;
> +
> +  bool ForCodeSize;
> +
> +public:
> +  WebAssemblyDAGToDAGISel(WebAssemblyTargetMachine &tm,
> +                          CodeGenOpt::Level OptLevel)
> +      : SelectionDAGISel(tm, OptLevel), Subtarget(nullptr), ForCodeSize(false) {
> +  }
> +
> +  const char *getPassName() const override {
> +    return "WebAssembly Instruction Selection";
> +  }
> +
> +  bool runOnMachineFunction(MachineFunction &MF) override {
> +    ForCodeSize =
> +        MF.getFunction()->hasFnAttribute(Attribute::OptimizeForSize) ||
> +        MF.getFunction()->hasFnAttribute(Attribute::MinSize);
> +    Subtarget = &MF.getSubtarget<WebAssemblySubtarget>();
> +    return SelectionDAGISel::runOnMachineFunction(MF);
> +  }
> +
> +  SDNode *Select(SDNode *Node) override;
> +
> +private:
> +  // add select functions here...
> +};
> +} // end anonymous namespace
> +
> +SDNode *WebAssemblyDAGToDAGISel::Select(SDNode *Node) {
> +  llvm_unreachable("TODO: implement Select");
> +}
> +
> +/// This pass converts a legalized DAG into a WebAssembly-specific DAG, ready
> +/// for instruction scheduling.
> +FunctionPass *llvm::createWebAssemblyISelDag(WebAssemblyTargetMachine &TM,
> +                                             CodeGenOpt::Level OptLevel) {
> +  return new WebAssemblyDAGToDAGISel(TM, OptLevel);
> +}
> 
> Added: llvm/trunk/lib/Target/WebAssembly/WebAssemblyISelLowering.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/WebAssembly/WebAssemblyISelLowering.cpp?rev=241022&view=auto
> ==============================================================================
> --- llvm/trunk/lib/Target/WebAssembly/WebAssemblyISelLowering.cpp (added)
> +++ llvm/trunk/lib/Target/WebAssembly/WebAssemblyISelLowering.cpp Mon Jun 29 18:51:55 2015
> @@ -0,0 +1,59 @@
> +//=- WebAssemblyISelLowering.cpp - WebAssembly DAG Lowering Implementation -==//
> +//
> +//                     The LLVM Compiler Infrastructure
> +//
> +// This file is distributed under the University of Illinois Open Source
> +// License. See LICENSE.TXT for details.
> +//
> +//===----------------------------------------------------------------------===//
> +///
> +/// \file
> +/// \brief This file implements the WebAssemblyTargetLowering class.
> +///
> +//===----------------------------------------------------------------------===//
> +
> +#include "WebAssemblyISelLowering.h"
> +#include "MCTargetDesc/WebAssemblyMCTargetDesc.h"
> +#include "WebAssemblyMachineFunctionInfo.h"
> +#include "WebAssemblySubtarget.h"
> +#include "WebAssemblyTargetMachine.h"
> +#include "WebAssemblyTargetObjectFile.h"
> +#include "llvm/CodeGen/Analysis.h"
> +#include "llvm/CodeGen/MachineRegisterInfo.h"
> +#include "llvm/CodeGen/SelectionDAG.h"
> +#include "llvm/IR/Function.h"
> +#include "llvm/IR/Intrinsics.h"
> +#include "llvm/Support/CommandLine.h"
> +#include "llvm/Support/Debug.h"
> +#include "llvm/Support/ErrorHandling.h"
> +#include "llvm/Support/raw_ostream.h"
> +#include "llvm/Target/TargetOptions.h"
> +using namespace llvm;
> +
> +#define DEBUG_TYPE "wasm-lower"
> +
> +WebAssemblyTargetLowering::WebAssemblyTargetLowering(
> +    const TargetMachine &TM, const WebAssemblySubtarget &STI)
> +    : TargetLowering(TM), Subtarget(&STI) {}
> +
> +//===----------------------------------------------------------------------===//
> +// WebAssembly Lowering private implementation.
> +//===----------------------------------------------------------------------===//
> +
> +//===----------------------------------------------------------------------===//
> +// Lowering Code
> +//===----------------------------------------------------------------------===//
> +
> +//===----------------------------------------------------------------------===//
> +//  Other Lowering Code
> +//===----------------------------------------------------------------------===//
> +
> +//===----------------------------------------------------------------------===//
> +//                          WebAssembly Optimization Hooks
> +//===----------------------------------------------------------------------===//
> +
> +MCSection *WebAssemblyTargetObjectFile::SelectSectionForGlobal(
> +    const GlobalValue *GV, SectionKind Kind, Mangler &Mang,
> +    const TargetMachine &TM) const {
> +  return getDataSection();
> +}
> 
> Added: llvm/trunk/lib/Target/WebAssembly/WebAssemblyISelLowering.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/WebAssembly/WebAssemblyISelLowering.h?rev=241022&view=auto
> ==============================================================================
> --- llvm/trunk/lib/Target/WebAssembly/WebAssemblyISelLowering.h (added)
> +++ llvm/trunk/lib/Target/WebAssembly/WebAssemblyISelLowering.h Mon Jun 29 18:51:55 2015
> @@ -0,0 +1,49 @@
> +//- WebAssemblyISelLowering.h - WebAssembly DAG Lowering Interface -*- C++ -*-//
> +//
> +//                     The LLVM Compiler Infrastructure
> +//
> +// This file is distributed under the University of Illinois Open Source
> +// License. See LICENSE.TXT for details.
> +//
> +//===----------------------------------------------------------------------===//
> +///
> +/// \file
> +/// \brief This file defines the interfaces that WebAssembly uses to lower LLVM
> +/// code into a selection DAG.
> +///
> +//===----------------------------------------------------------------------===//
> +
> +#ifndef LLVM_LIB_TARGET_WEBASSEMBLY_WEBASSEMBLYISELLOWERING_H
> +#define LLVM_LIB_TARGET_WEBASSEMBLY_WEBASSEMBLYISELLOWERING_H
> +
> +#include "llvm/Target/TargetLowering.h"
> +
> +namespace llvm {
> +
> +namespace WebAssemblyISD {
> +
> +enum {
> +  FIRST_NUMBER = ISD::BUILTIN_OP_END,
> +
> +  // add memory opcodes starting at ISD::FIRST_TARGET_MEMORY_OPCODE here...
> +};
> +
> +} // end namespace WebAssemblyISD
> +
> +class WebAssemblySubtarget;
> +class WebAssemblyTargetMachine;
> +
> +class WebAssemblyTargetLowering final : public TargetLowering {
> +public:
> +  WebAssemblyTargetLowering(const TargetMachine &TM,
> +                            const WebAssemblySubtarget &STI);
> +
> +private:
> +  /// Keep a pointer to the WebAssemblySubtarget around so that we can make the
> +  /// right decision when generating code for different targets.
> +  const WebAssemblySubtarget *Subtarget;
> +};
> +
> +} // end namespace llvm
> +
> +#endif
> 
> Added: llvm/trunk/lib/Target/WebAssembly/WebAssemblyInstrAtomics.td
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/WebAssembly/WebAssemblyInstrAtomics.td?rev=241022&view=auto
> ==============================================================================
> --- llvm/trunk/lib/Target/WebAssembly/WebAssemblyInstrAtomics.td (added)
> +++ llvm/trunk/lib/Target/WebAssembly/WebAssemblyInstrAtomics.td Mon Jun 29 18:51:55 2015
> @@ -0,0 +1,44 @@
> +// WebAssemblyInstrAtomics.td-WebAssembly Atomic codegen support-*- tablegen -*-
> +//
> +//                     The LLVM Compiler Infrastructure
> +//
> +// This file is distributed under the University of Illinois Open Source
> +// License. See LICENSE.TXT for details.
> +//
> +//===----------------------------------------------------------------------===//
> +//
> +// WebAssembly Atomic operand code-gen constructs.
> +//
> +//===----------------------------------------------------------------------===//
> +
> +//===----------------------------------------------------------------------===//
> +// Atomic fences
> +//===----------------------------------------------------------------------===//
> +
> +// TODO: add atomic fences here...
> +
> +//===----------------------------------------------------------------------===//
> +// Atomic loads
> +//===----------------------------------------------------------------------===//
> +
> +// TODO: add atomic loads here...
> +
> +//===----------------------------------------------------------------------===//
> +// Atomic stores
> +//===----------------------------------------------------------------------===//
> +
> +// TODO: add atomic stores here...
> +
> +//===----------------------------------------------------------------------===//
> +// Low-level exclusive operations
> +//===----------------------------------------------------------------------===//
> +
> +// TODO: add exclusive operations here...
> +
> +// Load-exclusives.
> +
> +// Store-exclusives.
> +
> +// Store-release-exclusives.
> +
> +// And clear exclusive.
> 
> Added: llvm/trunk/lib/Target/WebAssembly/WebAssemblyInstrFormats.td
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/WebAssembly/WebAssemblyInstrFormats.td?rev=241022&view=auto
> ==============================================================================
> --- llvm/trunk/lib/Target/WebAssembly/WebAssemblyInstrFormats.td (added)
> +++ llvm/trunk/lib/Target/WebAssembly/WebAssemblyInstrFormats.td Mon Jun 29 18:51:55 2015
> @@ -0,0 +1,28 @@
> +// WebAssemblyInstrFormats.td - WebAssembly Instruction Formats -*- tblgen -*-//
> +//
> +//                     The LLVM Compiler Infrastructure
> +//
> +// This file is distributed under the University of Illinois Open Source
> +// License. See LICENSE.TXT for details.
> +//
> +//===----------------------------------------------------------------------===//
> +//
> +// WebAssembly instruction format definitions.
> +//
> +//===----------------------------------------------------------------------===//
> +
> +// WebAssembly Instruction Format
> +class WebAssemblyInst<string cstr> : Instruction {
> +  field bits<0> Inst; // Instruction encoding.
> +  let Namespace   = "WebAssembly";
> +  let Pattern     = [];
> +  let Constraints = cstr;
> +}
> +
> +// Normal instructions
> +class I<dag oops, dag iops, list<dag> pattern, string cstr = "">
> +    : WebAssemblyInst<cstr> {
> +  dag OutOperandList = oops;
> +  dag InOperandList  = iops;
> +  let Pattern        = pattern;
> +}
> 
> Added: llvm/trunk/lib/Target/WebAssembly/WebAssemblyInstrInfo.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/WebAssembly/WebAssemblyInstrInfo.cpp?rev=241022&view=auto
> ==============================================================================
> --- llvm/trunk/lib/Target/WebAssembly/WebAssemblyInstrInfo.cpp (added)
> +++ llvm/trunk/lib/Target/WebAssembly/WebAssemblyInstrInfo.cpp Mon Jun 29 18:51:55 2015
> @@ -0,0 +1,28 @@
> +//===-- WebAssemblyInstrInfo.cpp - WebAssembly Instruction Information ----===//
> +//
> +//                     The LLVM Compiler Infrastructure
> +//
> +// This file is distributed under the University of Illinois Open Source
> +// License. See LICENSE.TXT for details.
> +//
> +//===----------------------------------------------------------------------===//
> +///
> +/// \file
> +/// \brief This file contains the WebAssembly implementation of the
> +/// TargetInstrInfo class.
> +///
> +//===----------------------------------------------------------------------===//
> +
> +#include "WebAssemblyInstrInfo.h"
> +#include "MCTargetDesc/WebAssemblyMCTargetDesc.h"
> +#include "WebAssemblySubtarget.h"
> +#include "llvm/CodeGen/MachineFrameInfo.h"
> +#include "llvm/CodeGen/MachineInstrBuilder.h"
> +#include "llvm/CodeGen/MachineMemOperand.h"
> +#include "llvm/CodeGen/MachineRegisterInfo.h"
> +using namespace llvm;
> +
> +#define DEBUG_TYPE "wasm-instr-info"
> +
> +WebAssemblyInstrInfo::WebAssemblyInstrInfo(const WebAssemblySubtarget &STI)
> +    : RI(STI.getTargetTriple()) {}
> 
> Added: llvm/trunk/lib/Target/WebAssembly/WebAssemblyInstrInfo.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/WebAssembly/WebAssemblyInstrInfo.h?rev=241022&view=auto
> ==============================================================================
> --- llvm/trunk/lib/Target/WebAssembly/WebAssemblyInstrInfo.h (added)
> +++ llvm/trunk/lib/Target/WebAssembly/WebAssemblyInstrInfo.h Mon Jun 29 18:51:55 2015
> @@ -0,0 +1,37 @@
> +//=- WebAssemblyInstrInfo.h - WebAssembly Instruction Information -*- C++ -*-=//
> +//
> +//                     The LLVM Compiler Infrastructure
> +//
> +// This file is distributed under the University of Illinois Open Source
> +// License. See LICENSE.TXT for details.
> +//
> +//===----------------------------------------------------------------------===//
> +///
> +/// \file
> +/// \brief This file contains the WebAssembly implementation of the
> +/// TargetInstrInfo class.
> +///
> +//===----------------------------------------------------------------------===//
> +
> +#ifndef LLVM_LIB_TARGET_WEBASSEMBLY_WEBASSEMBLYINSTRINFO_H
> +#define LLVM_LIB_TARGET_WEBASSEMBLY_WEBASSEMBLYINSTRINFO_H
> +
> +#include "WebAssemblyRegisterInfo.h"
> +#include "llvm/Target/TargetInstrInfo.h"
> +
> +namespace llvm {
> +
> +class WebAssemblySubtarget;
> +
> +class WebAssemblyInstrInfo final {
> +  const WebAssemblyRegisterInfo RI;
> +
> +public:
> +  explicit WebAssemblyInstrInfo(const WebAssemblySubtarget &STI);
> +
> +  const WebAssemblyRegisterInfo &getRegisterInfo() const { return RI; }
> +};
> +
> +} // end namespace llvm
> +
> +#endif
> 
> Added: llvm/trunk/lib/Target/WebAssembly/WebAssemblyInstrInfo.td
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/WebAssembly/WebAssemblyInstrInfo.td?rev=241022&view=auto
> ==============================================================================
> --- llvm/trunk/lib/Target/WebAssembly/WebAssemblyInstrInfo.td (added)
> +++ llvm/trunk/lib/Target/WebAssembly/WebAssemblyInstrInfo.td Mon Jun 29 18:51:55 2015
> @@ -0,0 +1,41 @@
> +// WebAssemblyInstrInfo.td-Describe the WebAssembly Instructions-*- tablegen -*-
> +//
> +//                     The LLVM Compiler Infrastructure
> +//
> +// This file is distributed under the University of Illinois Open Source
> +// License. See LICENSE.TXT for details.
> +//
> +//===----------------------------------------------------------------------===//
> +//
> +// WebAssembly Instruction definitions.
> +//
> +//===----------------------------------------------------------------------===//
> +
> +//===----------------------------------------------------------------------===//
> +// WebAssembly Instruction Predicate Definitions.
> +//===----------------------------------------------------------------------===//
> +
> +//===----------------------------------------------------------------------===//
> +// WebAssembly-specific DAG Node Types.
> +//===----------------------------------------------------------------------===//
> +
> +//===----------------------------------------------------------------------===//
> +// WebAssembly-specific DAG Nodes.
> +//===----------------------------------------------------------------------===//
> +
> +//===----------------------------------------------------------------------===//
> +// WebAssembly-specific Operands.
> +//===----------------------------------------------------------------------===//
> +
> +//===----------------------------------------------------------------------===//
> +// WebAssembly Instruction Format Definitions.
> +//===----------------------------------------------------------------------===//
> +
> +include "WebAssemblyInstrFormats.td"
> +
> +//===----------------------------------------------------------------------===//
> +// Additional sets of instructions.
> +//===----------------------------------------------------------------------===//
> +
> +include "WebAssemblyInstrAtomics.td"
> +include "WebAssemblyInstrSIMD.td"
> 
> Added: llvm/trunk/lib/Target/WebAssembly/WebAssemblyInstrSIMD.td
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/WebAssembly/WebAssemblyInstrSIMD.td?rev=241022&view=auto
> ==============================================================================
> --- llvm/trunk/lib/Target/WebAssembly/WebAssemblyInstrSIMD.td (added)
> +++ llvm/trunk/lib/Target/WebAssembly/WebAssemblyInstrSIMD.td Mon Jun 29 18:51:55 2015
> @@ -0,0 +1,15 @@
> +// WebAssemblyInstrSIMD.td - WebAssembly SIMD codegen support -*- tablegen -*-//
> +//
> +//                     The LLVM Compiler Infrastructure
> +//
> +// This file is distributed under the University of Illinois Open Source
> +// License. See LICENSE.TXT for details.
> +//
> +//===----------------------------------------------------------------------===//
> +//
> +// WebAssembly SIMD operand code-gen constructs.
> +//
> +//===----------------------------------------------------------------------===//
> +
> +// TODO: Implement SIMD instructions.
> +// Note: use Requires<[HasSIMD]>.
> 
> Added: llvm/trunk/lib/Target/WebAssembly/WebAssemblyMachineFunctionInfo.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/WebAssembly/WebAssemblyMachineFunctionInfo.cpp?rev=241022&view=auto
> ==============================================================================
> --- llvm/trunk/lib/Target/WebAssembly/WebAssemblyMachineFunctionInfo.cpp (added)
> +++ llvm/trunk/lib/Target/WebAssembly/WebAssemblyMachineFunctionInfo.cpp Mon Jun 29 18:51:55 2015
> @@ -0,0 +1,19 @@
> +//=- WebAssemblyMachineFunctionInfo.cpp - WebAssembly Machine Function Info -=//
> +//
> +//                     The LLVM Compiler Infrastructure
> +//
> +// This file is distributed under the University of Illinois Open Source
> +// License. See LICENSE.TXT for details.
> +//
> +//===----------------------------------------------------------------------===//
> +///
> +/// \file
> +/// \brief This file implements WebAssembly-specific per-machine-function
> +/// information.
> +///
> +//===----------------------------------------------------------------------===//
> +
> +#include "WebAssemblyMachineFunctionInfo.h"
> +using namespace llvm;
> +
> +WebAssemblyFunctionInfo::~WebAssemblyFunctionInfo() {}
> 
> Added: llvm/trunk/lib/Target/WebAssembly/WebAssemblyMachineFunctionInfo.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/WebAssembly/WebAssemblyMachineFunctionInfo.h?rev=241022&view=auto
> ==============================================================================
> --- llvm/trunk/lib/Target/WebAssembly/WebAssemblyMachineFunctionInfo.h (added)
> +++ llvm/trunk/lib/Target/WebAssembly/WebAssemblyMachineFunctionInfo.h Mon Jun 29 18:51:55 2015
> @@ -0,0 +1,37 @@
> +// WebAssemblyMachineFuctionInfo.h-WebAssembly machine function info -*- C++ -*-
> +//
> +//                     The LLVM Compiler Infrastructure
> +//
> +// This file is distributed under the University of Illinois Open Source
> +// License. See LICENSE.TXT for details.
> +//
> +//===----------------------------------------------------------------------===//
> +///
> +/// \file
> +/// \brief This file declares WebAssembly-specific per-machine-function
> +/// information.
> +///
> +//===----------------------------------------------------------------------===//
> +
> +#ifndef LLVM_LIB_TARGET_WEBASSEMBLY_WEBASSEMBLYMACHINEFUNCTIONINFO_H
> +#define LLVM_LIB_TARGET_WEBASSEMBLY_WEBASSEMBLYMACHINEFUNCTIONINFO_H
> +
> +#include "WebAssemblyRegisterInfo.h"
> +#include "llvm/CodeGen/MachineFunction.h"
> +#include "llvm/CodeGen/MachineRegisterInfo.h"
> +
> +namespace llvm {
> +
> +/// This class is derived from MachineFunctionInfo and contains private
> +/// WebAssembly-specific information for each MachineFunction.
> +class WebAssemblyFunctionInfo final : public MachineFunctionInfo {
> +  MachineFunction &MF;
> +
> +public:
> +  explicit WebAssemblyFunctionInfo(MachineFunction &MF) : MF(MF) {}
> +  ~WebAssemblyFunctionInfo() override;
> +};
> +
> +} // end namespace llvm
> +
> +#endif
> 
> Added: llvm/trunk/lib/Target/WebAssembly/WebAssemblyRegisterInfo.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/WebAssembly/WebAssemblyRegisterInfo.cpp?rev=241022&view=auto
> ==============================================================================
> --- llvm/trunk/lib/Target/WebAssembly/WebAssemblyRegisterInfo.cpp (added)
> +++ llvm/trunk/lib/Target/WebAssembly/WebAssemblyRegisterInfo.cpp Mon Jun 29 18:51:55 2015
> @@ -0,0 +1,33 @@
> +//===-- WebAssemblyRegisterInfo.cpp - WebAssembly Register Information ----===//
> +//
> +//                     The LLVM Compiler Infrastructure
> +//
> +// This file is distributed under the University of Illinois Open Source
> +// License. See LICENSE.TXT for details.
> +//
> +//===----------------------------------------------------------------------===//
> +///
> +/// \file
> +/// \brief This file contains the WebAssembly implementation of the
> +/// TargetRegisterInfo class.
> +///
> +//===----------------------------------------------------------------------===//
> +
> +#include "WebAssemblyRegisterInfo.h"
> +#include "MCTargetDesc/WebAssemblyMCTargetDesc.h"
> +#include "WebAssemblyFrameLowering.h"
> +#include "WebAssemblyInstrInfo.h"
> +#include "WebAssemblyMachineFunctionInfo.h"
> +#include "WebAssemblySubtarget.h"
> +#include "llvm/CodeGen/MachineFrameInfo.h"
> +#include "llvm/CodeGen/MachineInstrBuilder.h"
> +#include "llvm/CodeGen/MachineRegisterInfo.h"
> +#include "llvm/IR/Function.h"
> +#include "llvm/Support/raw_ostream.h"
> +#include "llvm/Target/TargetFrameLowering.h"
> +#include "llvm/Target/TargetOptions.h"
> +using namespace llvm;
> +
> +#define DEBUG_TYPE "wasm-reg-info"
> +
> +WebAssemblyRegisterInfo::WebAssemblyRegisterInfo(const Triple &TT) : TT(TT) {}
> 
> Added: llvm/trunk/lib/Target/WebAssembly/WebAssemblyRegisterInfo.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/WebAssembly/WebAssemblyRegisterInfo.h?rev=241022&view=auto
> ==============================================================================
> --- llvm/trunk/lib/Target/WebAssembly/WebAssemblyRegisterInfo.h (added)
> +++ llvm/trunk/lib/Target/WebAssembly/WebAssemblyRegisterInfo.h Mon Jun 29 18:51:55 2015
> @@ -0,0 +1,35 @@
> +// WebAssemblyRegisterInfo.h - WebAssembly Register Information Impl -*- C++ -*-
> +//
> +//                     The LLVM Compiler Infrastructure
> +//
> +// This file is distributed under the University of Illinois Open Source
> +// License. See LICENSE.TXT for details.
> +//
> +//===----------------------------------------------------------------------===//
> +///
> +/// \file
> +/// \brief This file contains the WebAssembly implementation of the
> +/// WebAssemblyRegisterInfo class.
> +///
> +//===----------------------------------------------------------------------===//
> +
> +#ifndef LLVM_LIB_TARGET_WEBASSEMBLY_WEBASSEMBLYREGISTERINFO_H
> +#define LLVM_LIB_TARGET_WEBASSEMBLY_WEBASSEMBLYREGISTERINFO_H
> +
> +namespace llvm {
> +
> +class MachineFunction;
> +class RegScavenger;
> +class TargetRegisterClass;
> +class Triple;
> +
> +class WebAssemblyRegisterInfo final {
> +  const Triple &TT;
> +
> +public:
> +  explicit WebAssemblyRegisterInfo(const Triple &TT);
> +};
> +
> +} // end namespace llvm
> +
> +#endif
> 
> Added: llvm/trunk/lib/Target/WebAssembly/WebAssemblyRegisterInfo.td
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/WebAssembly/WebAssemblyRegisterInfo.td?rev=241022&view=auto
> ==============================================================================
> --- llvm/trunk/lib/Target/WebAssembly/WebAssemblyRegisterInfo.td (added)
> +++ llvm/trunk/lib/Target/WebAssembly/WebAssemblyRegisterInfo.td Mon Jun 29 18:51:55 2015
> @@ -0,0 +1,28 @@
> +//WebAssemblyRegisterInfo.td-Describe the WebAssembly Registers -*- tablegen -*-
> +//
> +//                     The LLVM Compiler Infrastructure
> +//
> +// This file is distributed under the University of Illinois Open Source
> +// License. See LICENSE.TXT for details.
> +//
> +//===----------------------------------------------------------------------===//
> +//
> +// This file describes the WebAssembly register classes and some nominal
> +// physical registers.
> +//
> +//===----------------------------------------------------------------------===//
> +
> +class WebAssemblyReg<string n> : Register<n> {
> +  let Namespace = "WebAssembly";
> +}
> +
> +class WebAssemblyRegClass<list<ValueType> regTypes, int alignment, dag regList>
> +     : RegisterClass<"WebAssembly", regTypes, alignment, regList>;
> +
> +//===----------------------------------------------------------------------===//
> +// Registers
> +//===----------------------------------------------------------------------===//
> +
> +//===----------------------------------------------------------------------===//
> +//  Register classes
> +//===----------------------------------------------------------------------===//
> 
> Added: llvm/trunk/lib/Target/WebAssembly/WebAssemblySelectionDAGInfo.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/WebAssembly/WebAssemblySelectionDAGInfo.cpp?rev=241022&view=auto
> ==============================================================================
> --- llvm/trunk/lib/Target/WebAssembly/WebAssemblySelectionDAGInfo.cpp (added)
> +++ llvm/trunk/lib/Target/WebAssembly/WebAssemblySelectionDAGInfo.cpp Mon Jun 29 18:51:55 2015
> @@ -0,0 +1,23 @@
> +//===-- WebAssemblySelectionDAGInfo.cpp - WebAssembly SelectionDAG Info ---===//
> +//
> +//                     The LLVM Compiler Infrastructure
> +//
> +// This file is distributed under the University of Illinois Open Source
> +// License. See LICENSE.TXT for details.
> +//
> +//===----------------------------------------------------------------------===//
> +///
> +/// \file
> +/// \brief This file implements the WebAssemblySelectionDAGInfo class.
> +///
> +//===----------------------------------------------------------------------===//
> +
> +#include "WebAssemblyTargetMachine.h"
> +using namespace llvm;
> +
> +#define DEBUG_TYPE "wasm-selectiondag-info"
> +
> +WebAssemblySelectionDAGInfo::WebAssemblySelectionDAGInfo(const DataLayout *DL)
> +    : TargetSelectionDAGInfo(DL) {}
> +
> +WebAssemblySelectionDAGInfo::~WebAssemblySelectionDAGInfo() {}
> 
> Added: llvm/trunk/lib/Target/WebAssembly/WebAssemblySelectionDAGInfo.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/WebAssembly/WebAssemblySelectionDAGInfo.h?rev=241022&view=auto
> ==============================================================================
> --- llvm/trunk/lib/Target/WebAssembly/WebAssemblySelectionDAGInfo.h (added)
> +++ llvm/trunk/lib/Target/WebAssembly/WebAssemblySelectionDAGInfo.h Mon Jun 29 18:51:55 2015
> @@ -0,0 +1,31 @@
> +//=- WebAssemblySelectionDAGInfo.h - WebAssembly SelectionDAG Info -*- C++ -*-//
> +//
> +//                     The LLVM Compiler Infrastructure
> +//
> +// This file is distributed under the University of Illinois Open Source
> +// License. See LICENSE.TXT for details.
> +//
> +//===----------------------------------------------------------------------===//
> +///
> +/// \file
> +/// \brief This file defines the WebAssembly subclass for
> +/// TargetSelectionDAGInfo.
> +///
> +//===----------------------------------------------------------------------===//
> +
> +#ifndef LLVM_LIB_TARGET_WEBASSEMBLY_WEBASSEMBLYSELECTIONDAGINFO_H
> +#define LLVM_LIB_TARGET_WEBASSEMBLY_WEBASSEMBLYSELECTIONDAGINFO_H
> +
> +#include "llvm/Target/TargetSelectionDAGInfo.h"
> +
> +namespace llvm {
> +
> +class WebAssemblySelectionDAGInfo final : public TargetSelectionDAGInfo {
> +public:
> +  explicit WebAssemblySelectionDAGInfo(const DataLayout *DL);
> +  ~WebAssemblySelectionDAGInfo() override;
> +};
> +
> +} // end namespace llvm
> +
> +#endif
> 
> Added: llvm/trunk/lib/Target/WebAssembly/WebAssemblySubtarget.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/WebAssembly/WebAssemblySubtarget.cpp?rev=241022&view=auto
> ==============================================================================
> --- llvm/trunk/lib/Target/WebAssembly/WebAssemblySubtarget.cpp (added)
> +++ llvm/trunk/lib/Target/WebAssembly/WebAssemblySubtarget.cpp Mon Jun 29 18:51:55 2015
> @@ -0,0 +1,48 @@
> +//===-- WebAssemblySubtarget.cpp - WebAssembly Subtarget Information ------===//
> +//
> +//                     The LLVM Compiler Infrastructure
> +//
> +// This file is distributed under the University of Illinois Open Source
> +// License. See LICENSE.TXT for details.
> +//
> +//===----------------------------------------------------------------------===//
> +///
> +/// \file
> +/// \brief This file implements the WebAssembly-specific subclass of
> +/// TargetSubtarget.
> +///
> +//===----------------------------------------------------------------------===//
> +
> +#include "WebAssemblyInstrInfo.h"
> +#include "MCTargetDesc/WebAssemblyMCTargetDesc.h"
> +#include "WebAssemblySubtarget.h"
> +#include "llvm/Support/TargetRegistry.h"
> +using namespace llvm;
> +
> +#define DEBUG_TYPE "subtarget"
> +
> +#define GET_SUBTARGETINFO_CTOR
> +#define GET_SUBTARGETINFO_TARGET_DESC
> +#include "WebAssemblyGenSubtargetInfo.inc"
> +
> +WebAssemblySubtarget &
> +WebAssemblySubtarget::initializeSubtargetDependencies(StringRef FS) {
> +  // Determine default and user-specified characteristics
> +
> +  if (CPUString.empty())
> +    CPUString = "generic";
> +
> +  ParseSubtargetFeatures(CPUString, FS);
> +  return *this;
> +}
> +
> +WebAssemblySubtarget::WebAssemblySubtarget(const Triple &TT,
> +                                           const std::string &CPU,
> +                                           const std::string &FS,
> +                                           const TargetMachine &TM)
> +    : WebAssemblyGenSubtargetInfo(TT, CPU, FS), HasSIMD(true), CPUString(CPU),
> +      TargetTriple(TT), FrameLowering(),
> +      InstrInfo(initializeSubtargetDependencies(FS)),
> +      TSInfo(TM.getDataLayout()), TLInfo(TM, *this) {}
> +
> +bool WebAssemblySubtarget::enableMachineScheduler() const { return true; }
> 
> Added: llvm/trunk/lib/Target/WebAssembly/WebAssemblySubtarget.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/WebAssembly/WebAssemblySubtarget.h?rev=241022&view=auto
> ==============================================================================
> --- llvm/trunk/lib/Target/WebAssembly/WebAssemblySubtarget.h (added)
> +++ llvm/trunk/lib/Target/WebAssembly/WebAssemblySubtarget.h Mon Jun 29 18:51:55 2015
> @@ -0,0 +1,78 @@
> +//=- WebAssemblySubtarget.h - Define Subtarget for the WebAssembly -*- C++ -*-//
> +//
> +//                     The LLVM Compiler Infrastructure
> +//
> +// This file is distributed under the University of Illinois Open Source
> +// License. See LICENSE.TXT for details.
> +//
> +//===----------------------------------------------------------------------===//
> +///
> +/// \file
> +/// \brief This file declares the WebAssembly-specific subclass of
> +/// TargetSubtarget.
> +///
> +//===----------------------------------------------------------------------===//
> +
> +#ifndef LLVM_LIB_TARGET_WEBASSEMBLY_WEBASSEMBLYSUBTARGET_H
> +#define LLVM_LIB_TARGET_WEBASSEMBLY_WEBASSEMBLYSUBTARGET_H
> +
> +#include "WebAssemblyFrameLowering.h"
> +#include "WebAssemblyISelLowering.h"
> +#include "WebAssemblyInstrInfo.h"
> +#include "WebAssemblySelectionDAGInfo.h"
> +#include "llvm/Target/TargetSubtargetInfo.h"
> +#include <string>
> +
> +#define GET_SUBTARGETINFO_HEADER
> +#include "WebAssemblyGenSubtargetInfo.inc"
> +
> +namespace llvm {
> +
> +class WebAssemblySubtarget final : public WebAssemblyGenSubtargetInfo {
> +  bool HasSIMD;
> +
> +  /// String name of used CPU.
> +  std::string CPUString;
> +
> +  /// What processor and OS we're targeting.
> +  Triple TargetTriple;
> +
> +  WebAssemblyFrameLowering FrameLowering;
> +  WebAssemblyInstrInfo InstrInfo;
> +  WebAssemblySelectionDAGInfo TSInfo;
> +  WebAssemblyTargetLowering TLInfo;
> +
> +  /// Initializes using CPUString and the passed in feature string so that we
> +  /// can use initializer lists for subtarget initialization.
> +  WebAssemblySubtarget &initializeSubtargetDependencies(StringRef FS);
> +
> +public:
> +  /// This constructor initializes the data members to match that
> +  /// of the specified triple.
> +  WebAssemblySubtarget(const Triple &TT, const std::string &CPU,
> +                       const std::string &FS, const TargetMachine &TM);
> +
> +  const WebAssemblySelectionDAGInfo *getSelectionDAGInfo() const override {
> +    return &TSInfo;
> +  }
> +  const WebAssemblyFrameLowering *getFrameLowering() const override {
> +    return &FrameLowering;
> +  }
> +  const WebAssemblyTargetLowering *getTargetLowering() const override {
> +    return &TLInfo;
> +  }
> +  const Triple &getTargetTriple() const { return TargetTriple; }
> +  bool enableMachineScheduler() const override;
> +  bool useAA() const override { return true; }
> +
> +  // Predicates used by WebAssemblyInstrInfo.td.
> +  bool hasSIMD() const { return HasSIMD; }
> +
> +  /// Parses features string setting specified subtarget options. Definition of
> +  /// function is auto generated by tblgen.
> +  void ParseSubtargetFeatures(StringRef CPU, StringRef FS);
> +};
> +
> +} // end namespace llvm
> +
> +#endif
> 
> Added: llvm/trunk/lib/Target/WebAssembly/WebAssemblyTargetMachine.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/WebAssembly/WebAssemblyTargetMachine.cpp?rev=241022&view=auto
> ==============================================================================
> --- llvm/trunk/lib/Target/WebAssembly/WebAssemblyTargetMachine.cpp (added)
> +++ llvm/trunk/lib/Target/WebAssembly/WebAssemblyTargetMachine.cpp Mon Jun 29 18:51:55 2015
> @@ -0,0 +1,166 @@
> +//===- WebAssemblyTargetMachine.cpp - Define TargetMachine for WebAssembly -==//
> +//
> +//                     The LLVM Compiler Infrastructure
> +//
> +// This file is distributed under the University of Illinois Open Source
> +// License. See LICENSE.TXT for details.
> +//
> +//===----------------------------------------------------------------------===//
> +///
> +/// \file
> +/// \brief This file defines the WebAssembly-specific subclass of TargetMachine.
> +///
> +//===----------------------------------------------------------------------===//
> +
> +#include "WebAssembly.h"
> +#include "MCTargetDesc/WebAssemblyMCTargetDesc.h"
> +#include "WebAssemblyTargetMachine.h"
> +#include "WebAssemblyTargetObjectFile.h"
> +#include "WebAssemblyTargetTransformInfo.h"
> +#include "llvm/CodeGen/MachineFunctionPass.h"
> +#include "llvm/CodeGen/Passes.h"
> +#include "llvm/CodeGen/RegAllocRegistry.h"
> +#include "llvm/IR/Function.h"
> +#include "llvm/Support/CommandLine.h"
> +#include "llvm/Support/TargetRegistry.h"
> +#include "llvm/Target/TargetOptions.h"
> +using namespace llvm;
> +
> +#define DEBUG_TYPE "wasm"
> +
> +extern "C" void LLVMInitializeWebAssemblyTarget() {
> +  // Register the target.
> +  RegisterTargetMachine<WebAssemblyTargetMachine> X(TheWebAssemblyTarget);
> +}
> +
> +//===----------------------------------------------------------------------===//
> +// WebAssembly Lowering public interface.
> +//===----------------------------------------------------------------------===//
> +
> +/// Create an WebAssembly architecture model.
> +///
> +WebAssemblyTargetMachine::WebAssemblyTargetMachine(
> +    const Target &T, const Triple &TT, StringRef CPU, StringRef FS,
> +    const TargetOptions &Options, Reloc::Model RM, CodeModel::Model CM,
> +    CodeGenOpt::Level OL)
> +    : LLVMTargetMachine(T, TT.isArch64Bit()
> +                               ? "e-p:64:64-i64:64-v128:8:128-n32:64-S128"
> +                               : "e-p:32:32-i64:64-v128:8:128-n32:64-S128",
> +                        TT, CPU, FS, Options, RM, CM, OL),
> +      TLOF(make_unique<WebAssemblyTargetObjectFile>()) {
> +  initAsmInfo();
> +
> +  // We need a reducible CFG, so disable some optimizations which tend to
> +  // introduce irreducibility.
> +  setRequiresStructuredCFG(true);
> +}
> +
> +WebAssemblyTargetMachine::~WebAssemblyTargetMachine() {}
> +
> +const WebAssemblySubtarget *
> +WebAssemblyTargetMachine::getSubtargetImpl(const Function &F) const {
> +  Attribute CPUAttr = F.getFnAttribute("target-cpu");
> +  Attribute FSAttr = F.getFnAttribute("target-features");
> +
> +  std::string CPU = !CPUAttr.hasAttribute(Attribute::None)
> +                        ? CPUAttr.getValueAsString().str()
> +                        : TargetCPU;
> +  std::string FS = !FSAttr.hasAttribute(Attribute::None)
> +                       ? FSAttr.getValueAsString().str()
> +                       : TargetFS;
> +
> +  auto &I = SubtargetMap[CPU + FS];
> +  if (!I) {
> +    // This needs to be done before we create a new subtarget since any
> +    // creation will depend on the TM and the code generation flags on the
> +    // function that reside in TargetOptions.
> +    resetTargetOptions(F);
> +    I = make_unique<WebAssemblySubtarget>(TargetTriple, CPU, FS, *this);
> +  }
> +  return I.get();
> +}
> +
> +namespace {
> +/// WebAssembly Code Generator Pass Configuration Options.
> +class WebAssemblyPassConfig final : public TargetPassConfig {
> +public:
> +  WebAssemblyPassConfig(WebAssemblyTargetMachine *TM, PassManagerBase &PM)
> +      : TargetPassConfig(TM, PM) {}
> +
> +  WebAssemblyTargetMachine &getWebAssemblyTargetMachine() const {
> +    return getTM<WebAssemblyTargetMachine>();
> +  }
> +
> +  FunctionPass *createTargetRegisterAllocator(bool) override;
> +  void addFastRegAlloc(FunctionPass *RegAllocPass) override;
> +  void addOptimizedRegAlloc(FunctionPass *RegAllocPass) override;
> +
> +  void addIRPasses() override;
> +  bool addPreISel() override;
> +  bool addInstSelector() override;
> +  bool addILPOpts() override;
> +  void addPreRegAlloc() override;
> +  void addRegAllocPasses(bool Optimized);
> +  void addPostRegAlloc() override;
> +  void addPreSched2() override;
> +  void addPreEmitPass() override;
> +};
> +} // end anonymous namespace
> +
> +TargetIRAnalysis WebAssemblyTargetMachine::getTargetIRAnalysis() {
> +  return TargetIRAnalysis([this](Function &F) {
> +    return TargetTransformInfo(WebAssemblyTTIImpl(this, F));
> +  });
> +}
> +
> +TargetPassConfig *
> +WebAssemblyTargetMachine::createPassConfig(PassManagerBase &PM) {
> +  return new WebAssemblyPassConfig(this, PM);
> +}
> +
> +FunctionPass *WebAssemblyPassConfig::createTargetRegisterAllocator(bool) {
> +  return nullptr; // No reg alloc
> +}
> +
> +void WebAssemblyPassConfig::addFastRegAlloc(FunctionPass *RegAllocPass) {
> +  assert(!RegAllocPass && "WebAssembly uses no regalloc!");
> +  addRegAllocPasses(false);
> +}
> +
> +void WebAssemblyPassConfig::addOptimizedRegAlloc(FunctionPass *RegAllocPass) {
> +  assert(!RegAllocPass && "WebAssembly uses no regalloc!");
> +  addRegAllocPasses(true);
> +}
> +
> +//===----------------------------------------------------------------------===//
> +// The following functions are called from lib/CodeGen/Passes.cpp to modify
> +// the CodeGen pass sequence.
> +//===----------------------------------------------------------------------===//
> +
> +void WebAssemblyPassConfig::addIRPasses() {
> +  // Expand some atomic operations. WebAssemblyTargetLowering has hooks which
> +  // control specifically what gets lowered.
> +  addPass(createAtomicExpandPass(&getTM<WebAssemblyTargetMachine>()));
> +
> +  TargetPassConfig::addIRPasses();
> +}
> +
> +bool WebAssemblyPassConfig::addPreISel() { return false; }
> +
> +bool WebAssemblyPassConfig::addInstSelector() {
> +  addPass(
> +      createWebAssemblyISelDag(getWebAssemblyTargetMachine(), getOptLevel()));
> +  return false;
> +}
> +
> +bool WebAssemblyPassConfig::addILPOpts() { return true; }
> +
> +void WebAssemblyPassConfig::addPreRegAlloc() {}
> +
> +void WebAssemblyPassConfig::addRegAllocPasses(bool Optimized) {}
> +
> +void WebAssemblyPassConfig::addPostRegAlloc() {}
> +
> +void WebAssemblyPassConfig::addPreSched2() {}
> +
> +void WebAssemblyPassConfig::addPreEmitPass() {}
> 
> Added: llvm/trunk/lib/Target/WebAssembly/WebAssemblyTargetMachine.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/WebAssembly/WebAssemblyTargetMachine.h?rev=241022&view=auto
> ==============================================================================
> --- llvm/trunk/lib/Target/WebAssembly/WebAssemblyTargetMachine.h (added)
> +++ llvm/trunk/lib/Target/WebAssembly/WebAssemblyTargetMachine.h Mon Jun 29 18:51:55 2015
> @@ -0,0 +1,51 @@
> +// WebAssemblyTargetMachine.h - Define TargetMachine for WebAssembly -*- C++ -*-
> +//
> +//                     The LLVM Compiler Infrastructure
> +//
> +// This file is distributed under the University of Illinois Open Source
> +// License. See LICENSE.TXT for details.
> +//
> +//===----------------------------------------------------------------------===//
> +///
> +/// \file
> +/// \brief This file declares the WebAssembly-specific subclass of
> +/// TargetMachine.
> +///
> +//===----------------------------------------------------------------------===//
> +
> +#ifndef LLVM_LIB_TARGET_WEBASSEMBLY_WEBASSEMBLYTARGETMACHINE_H
> +#define LLVM_LIB_TARGET_WEBASSEMBLY_WEBASSEMBLYTARGETMACHINE_H
> +
> +#include "WebAssemblySubtarget.h"
> +#include "llvm/Target/TargetMachine.h"
> +
> +namespace llvm {
> +
> +class WebAssemblyTargetMachine final : public LLVMTargetMachine {
> +  std::unique_ptr<TargetLoweringObjectFile> TLOF;
> +  mutable StringMap<std::unique_ptr<WebAssemblySubtarget>> SubtargetMap;
> +
> +public:
> +  WebAssemblyTargetMachine(const Target &T, const Triple &TT, StringRef CPU,
> +                           StringRef FS, const TargetOptions &Options,
> +                           Reloc::Model RM, CodeModel::Model CM,
> +                           CodeGenOpt::Level OL);
> +
> +  ~WebAssemblyTargetMachine() override;
> +  const WebAssemblySubtarget *
> +  getSubtargetImpl(const Function &F) const override;
> +
> +  // Pass Pipeline Configuration
> +  TargetPassConfig *createPassConfig(PassManagerBase &PM) override;
> +
> +  TargetLoweringObjectFile *getObjFileLowering() const override {
> +    return TLOF.get();
> +  }
> +
> +  /// \brief Get the TargetIRAnalysis for this target.
> +  TargetIRAnalysis getTargetIRAnalysis() override;
> +};
> +
> +} // end namespace llvm
> +
> +#endif
> 
> Added: llvm/trunk/lib/Target/WebAssembly/WebAssemblyTargetObjectFile.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/WebAssembly/WebAssemblyTargetObjectFile.h?rev=241022&view=auto
> ==============================================================================
> --- llvm/trunk/lib/Target/WebAssembly/WebAssemblyTargetObjectFile.h (added)
> +++ llvm/trunk/lib/Target/WebAssembly/WebAssemblyTargetObjectFile.h Mon Jun 29 18:51:55 2015
> @@ -0,0 +1,67 @@
> +//===-- WebAssemblyTargetObjectFile.h - WebAssembly Object Info -*- C++ -*-===//
> +//
> +//                     The LLVM Compiler Infrastructure
> +//
> +// This file is distributed under the University of Illinois Open Source
> +// License. See LICENSE.TXT for details.
> +//
> +//===----------------------------------------------------------------------===//
> +///
> +/// \file
> +/// \brief This file declares the WebAssembly-specific subclass of
> +/// TargetLoweringObjectFile.
> +///
> +//===----------------------------------------------------------------------===//
> +
> +#ifndef LLVM_LIB_TARGET_WEBASSEMBLY_WEBASSEMBLYTARGETOBJECTFILE_H
> +#define LLVM_LIB_TARGET_WEBASSEMBLY_WEBASSEMBLYTARGETOBJECTFILE_H
> +
> +#include "llvm/Target/TargetLoweringObjectFile.h"
> +
> +namespace llvm {
> +
> +class GlobalVariable;
> +
> +class WebAssemblyTargetObjectFile final : public TargetLoweringObjectFile {
> +public:
> +  WebAssemblyTargetObjectFile() {
> +    TextSection = nullptr;
> +    DataSection = nullptr;
> +    BSSSection = nullptr;
> +    ReadOnlySection = nullptr;
> +
> +    StaticCtorSection = nullptr;
> +    StaticDtorSection = nullptr;
> +    LSDASection = nullptr;
> +    EHFrameSection = nullptr;
> +    DwarfAbbrevSection = nullptr;
> +    DwarfInfoSection = nullptr;
> +    DwarfLineSection = nullptr;
> +    DwarfFrameSection = nullptr;
> +    DwarfPubTypesSection = nullptr;
> +    DwarfDebugInlineSection = nullptr;
> +    DwarfStrSection = nullptr;
> +    DwarfLocSection = nullptr;
> +    DwarfARangesSection = nullptr;
> +    DwarfRangesSection = nullptr;
> +  }
> +
> +  MCSection *getSectionForConstant(SectionKind Kind,
> +                                   const Constant *C) const override {
> +    return ReadOnlySection;
> +  }
> +
> +  MCSection *getExplicitSectionGlobal(const GlobalValue *GV, SectionKind Kind,
> +                                      Mangler &Mang,
> +                                      const TargetMachine &TM) const override {
> +    return DataSection;
> +  }
> +
> +  MCSection *SelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind,
> +                                    Mangler &Mang,
> +                                    const TargetMachine &TM) const override;
> +};
> +
> +} // end namespace llvm
> +
> +#endif
> 
> Added: llvm/trunk/lib/Target/WebAssembly/WebAssemblyTargetTransformInfo.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/WebAssembly/WebAssemblyTargetTransformInfo.cpp?rev=241022&view=auto
> ==============================================================================
> --- llvm/trunk/lib/Target/WebAssembly/WebAssemblyTargetTransformInfo.cpp (added)
> +++ llvm/trunk/lib/Target/WebAssembly/WebAssemblyTargetTransformInfo.cpp Mon Jun 29 18:51:55 2015
> @@ -0,0 +1,28 @@
> +//===-- WebAssemblyTargetTransformInfo.cpp - WebAssembly-specific TTI -----===//
> +//
> +//                     The LLVM Compiler Infrastructure
> +//
> +// This file is distributed under the University of Illinois Open Source
> +// License. See LICENSE.TXT for details.
> +//
> +//===----------------------------------------------------------------------===//
> +///
> +/// \file
> +/// \brief This file defines the WebAssembly-specific TargetTransformInfo
> +/// implementation.
> +///
> +//===----------------------------------------------------------------------===//
> +
> +#include "WebAssemblyTargetTransformInfo.h"
> +#include "llvm/Support/Debug.h"
> +#include "llvm/Target/CostTable.h"
> +using namespace llvm;
> +
> +#define DEBUG_TYPE "wasmtti"
> +
> +TargetTransformInfo::PopcntSupportKind
> +WebAssemblyTTIImpl::getPopcntSupport(unsigned TyWidth) {
> +  assert(isPowerOf2_32(TyWidth) && "Ty width must be power of 2");
> +  // TODO: Make Math.popcount32 happen in WebAssembly.
> +  return TTI::PSK_Software;
> +}
> 
> Added: llvm/trunk/lib/Target/WebAssembly/WebAssemblyTargetTransformInfo.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/WebAssembly/WebAssemblyTargetTransformInfo.h?rev=241022&view=auto
> ==============================================================================
> --- llvm/trunk/lib/Target/WebAssembly/WebAssemblyTargetTransformInfo.h (added)
> +++ llvm/trunk/lib/Target/WebAssembly/WebAssemblyTargetTransformInfo.h Mon Jun 29 18:51:55 2015
> @@ -0,0 +1,87 @@
> +//==- WebAssemblyTargetTransformInfo.h - WebAssembly-specific TTI -*- C++ -*-=//
> +//
> +//                     The LLVM Compiler Infrastructure
> +//
> +// This file is distributed under the University of Illinois Open Source
> +// License. See LICENSE.TXT for details.
> +//
> +//===----------------------------------------------------------------------===//
> +///
> +/// \file
> +/// \brief This file a TargetTransformInfo::Concept conforming object specific
> +/// to the WebAssembly target machine.
> +///
> +/// It uses the target's detailed information to provide more precise answers to
> +/// certain TTI queries, while letting the target independent and default TTI
> +/// implementations handle the rest.
> +///
> +//===----------------------------------------------------------------------===//
> +
> +#ifndef LLVM_LIB_TARGET_WEBASSEMBLY_WEBASSEMBLYTARGETTRANSFORMINFO_H
> +#define LLVM_LIB_TARGET_WEBASSEMBLY_WEBASSEMBLYTARGETTRANSFORMINFO_H
> +
> +#include "WebAssemblyTargetMachine.h"
> +#include "llvm/CodeGen/BasicTTIImpl.h"
> +#include <algorithm>
> +
> +namespace llvm {
> +
> +class WebAssemblyTTIImpl final : public BasicTTIImplBase<WebAssemblyTTIImpl> {
> +  typedef BasicTTIImplBase<WebAssemblyTTIImpl> BaseT;
> +  typedef TargetTransformInfo TTI;
> +  friend BaseT;
> +
> +  const WebAssemblyTargetMachine *TM;
> +  const WebAssemblySubtarget *ST;
> +  const WebAssemblyTargetLowering *TLI;
> +
> +  const WebAssemblySubtarget *getST() const { return ST; }
> +  const WebAssemblyTargetLowering *getTLI() const { return TLI; }
> +
> +public:
> +  WebAssemblyTTIImpl(const WebAssemblyTargetMachine *TM, Function &F)
> +      : BaseT(TM), TM(TM), ST(TM->getSubtargetImpl(F)),
> +        TLI(ST->getTargetLowering()) {}
> +
> +  // Provide value semantics. MSVC requires that we spell all of these out.
> +  WebAssemblyTTIImpl(const WebAssemblyTTIImpl &Arg)
> +      : BaseT(static_cast<const BaseT &>(Arg)), TM(Arg.TM), ST(Arg.ST),
> +        TLI(Arg.TLI) {}
> +  WebAssemblyTTIImpl(WebAssemblyTTIImpl &&Arg)
> +      : BaseT(std::move(static_cast<BaseT &>(Arg))), TM(std::move(Arg.TM)),
> +        ST(std::move(Arg.ST)), TLI(std::move(Arg.TLI)) {}
> +  WebAssemblyTTIImpl &operator=(const WebAssemblyTTIImpl &RHS) {
> +    BaseT::operator=(static_cast<const BaseT &>(RHS));
> +    TM = RHS.TM;
> +    ST = RHS.ST;
> +    TLI = RHS.TLI;
> +    return *this;
> +  }
> +  WebAssemblyTTIImpl &operator=(WebAssemblyTTIImpl &&RHS) {
> +    BaseT::operator=(std::move(static_cast<BaseT &>(RHS)));
> +    TM = std::move(RHS.TM);
> +    ST = std::move(RHS.ST);
> +    TLI = std::move(RHS.TLI);
> +    return *this;
> +  }
> +
> +  /// \name Scalar TTI Implementations
> +  /// @{
> +
> +  // TODO: Implement more Scalar TTI for WebAssembly
> +
> +  TTI::PopcntSupportKind getPopcntSupport(unsigned TyWidth);
> +
> +  /// @}
> +
> +  /// \name Vector TTI Implementations
> +  /// @{
> +
> +  // TODO: Implement Vector TTI for WebAssembly
> +
> +  /// @}
> +};
> +
> +} // end namespace llvm
> +
> +#endif
> 
> Modified: llvm/trunk/unittests/ADT/TripleTest.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/ADT/TripleTest.cpp?rev=241022&r1=241021&r2=241022&view=diff
> ==============================================================================
> --- llvm/trunk/unittests/ADT/TripleTest.cpp (original)
> +++ llvm/trunk/unittests/ADT/TripleTest.cpp Mon Jun 29 18:51:55 2015
> @@ -182,6 +182,18 @@ TEST(TripleTest, ParsedIDs) {
>   EXPECT_EQ(Triple::CloudABI, T.getOS());
>   EXPECT_EQ(Triple::UnknownEnvironment, T.getEnvironment());
> 
> +  T = Triple("wasm32-unknown-wasm");
> +  EXPECT_EQ(Triple::wasm32, T.getArch());
> +  EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
> +  EXPECT_EQ(Triple::WebAssembly, T.getOS());
> +  EXPECT_EQ(Triple::UnknownEnvironment, T.getEnvironment());
> +
> +  T = Triple("wasm64-unknown-wasm");
> +  EXPECT_EQ(Triple::wasm64, T.getArch());
> +  EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
> +  EXPECT_EQ(Triple::WebAssembly, T.getOS());
> +  EXPECT_EQ(Triple::UnknownEnvironment, T.getEnvironment());
> +
>   T = Triple("huh");
>   EXPECT_EQ(Triple::UnknownArch, T.getArch());
> }
> @@ -439,6 +451,16 @@ TEST(TripleTest, BitWidthPredicates) {
>   EXPECT_FALSE(T.isArch16Bit());
>   EXPECT_FALSE(T.isArch32Bit());
>   EXPECT_TRUE(T.isArch64Bit());
> +
> +  T.setArch(Triple::wasm32);
> +  EXPECT_FALSE(T.isArch16Bit());
> +  EXPECT_TRUE(T.isArch32Bit());
> +  EXPECT_FALSE(T.isArch64Bit());
> +
> +  T.setArch(Triple::wasm64);
> +  EXPECT_FALSE(T.isArch16Bit());
> +  EXPECT_FALSE(T.isArch32Bit());
> +  EXPECT_TRUE(T.isArch64Bit());
> }
> 
> TEST(TripleTest, BitWidthArchVariants) {
> @@ -521,6 +543,14 @@ TEST(TripleTest, BitWidthArchVariants) {
>   T.setArch(Triple::spir64);
>   EXPECT_EQ(Triple::spir, T.get32BitArchVariant().getArch());
>   EXPECT_EQ(Triple::spir64, T.get64BitArchVariant().getArch());
> +
> +  T.setArch(Triple::wasm32);
> +  EXPECT_EQ(Triple::wasm32, T.get32BitArchVariant().getArch());
> +  EXPECT_EQ(Triple::wasm64, T.get64BitArchVariant().getArch());
> +
> +  T.setArch(Triple::wasm64);
> +  EXPECT_EQ(Triple::wasm32, T.get32BitArchVariant().getArch());
> +  EXPECT_EQ(Triple::wasm64, T.get64BitArchVariant().getArch());
> }
> 
> TEST(TripleTest, getOSVersion) {
> 
> 
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits





More information about the llvm-commits mailing list