Skip to content
This repository has been archived by the owner. It is now read-only.
Permalink
Browse files

RUST: Merge fastcomp @ 1.37.10

  • Loading branch information...
TimNN committed Apr 23, 2017
2 parents d0090cc + 2db29c7 commit c9bf6e3f98557937df93b24c48b2564c6963e788
Showing with 36,314 additions and 12 deletions.
  1. +1 −0 CMakeLists.txt
  2. +1 −0 emscripten-version.txt
  3. +9 −0 include/llvm/ADT/Triple.h
  4. +74 −0 include/llvm/Analysis/NaCl.h
  5. +45 −0 include/llvm/IR/Intrinsics.td
  6. +110 −0 include/llvm/IR/NaClAtomicIntrinsics.h
  7. +63 −0 include/llvm/InitializePasses.h
  8. +109 −0 include/llvm/Transforms/NaCl.h
  9. +1 −0 lib/IR/CMakeLists.txt
  10. +76 −0 lib/IR/NaClAtomicIntrinsics.cpp
  11. +2 −2 lib/IR/Verifier.cpp
  12. +13 −0 lib/Support/Triple.cpp
  13. +594 −0 lib/Target/JSBackend/AllocaManager.cpp
  14. +182 −0 lib/Target/JSBackend/AllocaManager.h
  15. +16 −0 lib/Target/JSBackend/CMakeLists.txt
  16. +2,212 −0 lib/Target/JSBackend/CallHandlers.h
  17. +157 −0 lib/Target/JSBackend/ExpandBigSwitches.cpp
  18. +29 −0 lib/Target/JSBackend/JS.h
  19. +4,475 −0 lib/Target/JSBackend/JSBackend.cpp
  20. +48 −0 lib/Target/JSBackend/JSTargetMachine.cpp
  21. +72 −0 lib/Target/JSBackend/JSTargetMachine.h
  22. +121 −0 lib/Target/JSBackend/JSTargetTransformInfo.cpp
  23. +97 −0 lib/Target/JSBackend/JSTargetTransformInfo.h
  24. +31 −0 lib/Target/JSBackend/LLVMBuild.txt
  25. +6 −0 lib/Target/JSBackend/MCTargetDesc/CMakeLists.txt
  26. +22 −0 lib/Target/JSBackend/MCTargetDesc/JSBackendMCTargetDesc.cpp
  27. +25 −0 lib/Target/JSBackend/MCTargetDesc/JSBackendMCTargetDesc.h
  28. +24 −0 lib/Target/JSBackend/MCTargetDesc/LLVMBuild.txt
  29. +85 −0 lib/Target/JSBackend/NaCl/AddPNaClExternalDecls.cpp
  30. +360 −0 lib/Target/JSBackend/NaCl/BackendCanonicalize.cpp
  31. +55 −0 lib/Target/JSBackend/NaCl/CMakeLists.txt
  32. +100 −0 lib/Target/JSBackend/NaCl/CanonicalizeMemIntrinsics.cpp
  33. +48 −0 lib/Target/JSBackend/NaCl/CleanupUsedGlobalsMetadata.cpp
  34. +180 −0 lib/Target/JSBackend/NaCl/ConstantInsertExtractElementIndex.cpp
  35. +291 −0 lib/Target/JSBackend/NaCl/ExceptionInfoWriter.cpp
  36. +71 −0 lib/Target/JSBackend/NaCl/ExceptionInfoWriter.h
  37. +234 −0 lib/Target/JSBackend/NaCl/ExpandArithWithOverflow.cpp
  38. +206 −0 lib/Target/JSBackend/NaCl/ExpandByVal.cpp
  39. +121 −0 lib/Target/JSBackend/NaCl/ExpandConstantExpr.cpp
  40. +154 −0 lib/Target/JSBackend/NaCl/ExpandCtors.cpp
  41. +151 −0 lib/Target/JSBackend/NaCl/ExpandGetElementPtr.cpp
  42. +1,235 −0 lib/Target/JSBackend/NaCl/ExpandI64.cpp
  43. +152 −0 lib/Target/JSBackend/NaCl/ExpandIndirectBr.cpp
  44. +100 −0 lib/Target/JSBackend/NaCl/ExpandInsertExtractElement.cpp
  45. +674 −0 lib/Target/JSBackend/NaCl/ExpandLargeIntegers.cpp
  46. +110 −0 lib/Target/JSBackend/NaCl/ExpandShuffleVector.cpp
  47. +250 −0 lib/Target/JSBackend/NaCl/ExpandSmallArguments.cpp
  48. +655 −0 lib/Target/JSBackend/NaCl/ExpandStructRegs.cpp
  49. +336 −0 lib/Target/JSBackend/NaCl/ExpandTls.cpp
  50. +107 −0 lib/Target/JSBackend/NaCl/ExpandTlsConstantExpr.cpp
  51. +58 −0 lib/Target/JSBackend/NaCl/ExpandUtils.cpp
  52. +324 −0 lib/Target/JSBackend/NaCl/ExpandVarArgs.cpp
  53. +264 −0 lib/Target/JSBackend/NaCl/FixVectorLoadStoreAlignment.cpp
  54. +546 −0 lib/Target/JSBackend/NaCl/FlattenGlobals.cpp
  55. +116 −0 lib/Target/JSBackend/NaCl/GlobalCleanup.cpp
  56. +176 −0 lib/Target/JSBackend/NaCl/GlobalizeConstantVectors.cpp
  57. +112 −0 lib/Target/JSBackend/NaCl/InsertDivideCheck.cpp
  58. +67 −0 lib/Target/JSBackend/NaCl/InternalizeUsedGlobals.cpp
  59. +23 −0 lib/Target/JSBackend/NaCl/LLVMBuild.txt
  60. +720 −0 lib/Target/JSBackend/NaCl/LowerEmAsyncify.cpp
  61. +275 −0 lib/Target/JSBackend/NaCl/LowerEmExceptionsPass.cpp
  62. +349 −0 lib/Target/JSBackend/NaCl/LowerEmSetjmp.cpp
  63. +91 −0 lib/Target/JSBackend/NaCl/NoExitRuntime.cpp
  64. +86 −0 lib/Target/JSBackend/NaCl/NormalizeAlignment.cpp
  65. +465 −0 lib/Target/JSBackend/NaCl/PNaClSjLjEH.cpp
  66. +170 −0 lib/Target/JSBackend/NaCl/PromoteI1Ops.cpp
  67. +737 −0 lib/Target/JSBackend/NaCl/PromoteIntegers.cpp
  68. +70 −0 lib/Target/JSBackend/NaCl/RemoveAsmMemory.cpp
  69. +593 −0 lib/Target/JSBackend/NaCl/ReplacePtrsWithInts.cpp
  70. +489 −0 lib/Target/JSBackend/NaCl/ResolvePNaClIntrinsics.cpp
  71. +411 −0 lib/Target/JSBackend/NaCl/RewriteAtomics.cpp
  72. +149 −0 lib/Target/JSBackend/NaCl/RewriteLLVMIntrinsics.cpp
  73. +545 −0 lib/Target/JSBackend/NaCl/RewritePNaClLibraryCalls.cpp
  74. +140 −0 lib/Target/JSBackend/NaCl/SimplifiedFuncTypeMap.cpp
  75. +61 −0 lib/Target/JSBackend/NaCl/SimplifiedFuncTypeMap.h
  76. +147 −0 lib/Target/JSBackend/NaCl/SimplifyAllocas.cpp
  77. +597 −0 lib/Target/JSBackend/NaCl/SimplifyStructRegSignatures.cpp
  78. +246 −0 lib/Target/JSBackend/NaCl/StripAttributes.cpp
  79. +163 −0 lib/Target/JSBackend/NaCl/StripMetadata.cpp
  80. +24 −0 lib/Target/JSBackend/OptPasses.h
  81. +1,432 −0 lib/Target/JSBackend/Relooper.cpp
  82. +376 −0 lib/Target/JSBackend/Relooper.h
  83. +64 −0 lib/Target/JSBackend/RemoveLLVMAssume.cpp
  84. +107 −0 lib/Target/JSBackend/SimplifyAllocas.cpp
  85. +5 −0 lib/Target/JSBackend/TargetInfo/CMakeLists.txt
  86. +20 −0 lib/Target/JSBackend/TargetInfo/JSBackendTargetInfo.cpp
  87. +23 −0 lib/Target/JSBackend/TargetInfo/LLVMBuild.txt
  88. +1 −0 lib/Target/LLVMBuild.txt
  89. +7 −0 lib/Transforms/IPO/ConstantMerge.cpp
  90. +57 −1 lib/Transforms/IPO/GlobalOpt.cpp
  91. +18 −0 readme-emscripten-fastcomp.txt
  92. +52 −0 test/CodeGen/JS/aliases.ll
  93. +35 −0 test/CodeGen/JS/alloca-contradiction.ll
  94. +142 −0 test/CodeGen/JS/allocamanager-phis.ll
  95. +165 −0 test/CodeGen/JS/allocamanager.ll
  96. +16 −0 test/CodeGen/JS/asm.ll
  97. +38 −0 test/CodeGen/JS/basics.ll
  98. +400 −0 test/CodeGen/JS/blockchanges.ll
  99. +12 −0 test/CodeGen/JS/dead-prototypes.ll
  100. +271 −0 test/CodeGen/JS/expand-i64.ll
  101. +31 −0 test/CodeGen/JS/expand-insertextract.ll
  102. +30 −0 test/CodeGen/JS/expect-intrinsics.ll
  103. +90 −0 test/CodeGen/JS/ffis-f32.ll
  104. +90 −0 test/CodeGen/JS/ffis.ll
  105. +47 −0 test/CodeGen/JS/getelementptr.ll
  106. +59 −0 test/CodeGen/JS/global-alias.ll
  107. +45 −0 test/CodeGen/JS/globals.ll
  108. +99 −0 test/CodeGen/JS/insertelement-chains.ll
  109. +20 −0 test/CodeGen/JS/invariant-intrinsics.ll
  110. +20 −0 test/CodeGen/JS/lifetime-intrinsics.ll
  111. +6 −0 test/CodeGen/JS/lit.local.cfg
  112. +56 −0 test/CodeGen/JS/mem-intrinsics.ll
  113. +25 −0 test/CodeGen/JS/phi.ll
  114. +37 −0 test/CodeGen/JS/simd-fcmp.ll
  115. +68 −0 test/CodeGen/JS/simd-loadstore.ll
  116. +41 −0 test/CodeGen/JS/simd-misc.ll
  117. +56 −0 test/CodeGen/JS/simd-select.ll
  118. +142 −0 test/CodeGen/JS/simd-shift.ll
  119. +524 −0 test/CodeGen/JS/simd-shuffle.ll
  120. +46 −0 test/CodeGen/JS/splat-precise-f32.ll
  121. +28 −0 test/CodeGen/JS/unrolled-simd.ll
  122. +1 −1 test/CodeGen/X86/avx-intrinsics-x86-upgrade.ll
  123. +50 −0 test/Transforms/GVN/hoist-pr28606.ll
  124. +42 −0 test/Transforms/GVN/pr28626.ll
  125. +3 −3 test/Transforms/GlobalOpt/integer-bool.ll
  126. +6 −0 test/Transforms/NaCl/add-pnacl-external-decls.ll
  127. +51 −0 test/Transforms/NaCl/atomic/atomic-seq-cst-only.ll
  128. +130 −0 test/Transforms/NaCl/atomic/atomic_others.ll
  129. +99 −0 test/Transforms/NaCl/atomic/atomic_seq_cst.ll
  130. +154 −0 test/Transforms/NaCl/atomic/fetch_and_.ll
  131. +68 −0 test/Transforms/NaCl/atomic/lock_.ll
  132. +51 −0 test/Transforms/NaCl/atomic/sync_synchronize.ll
  133. +112 −0 test/Transforms/NaCl/atomic/val_compare_and_swap.ll
  134. +171 −0 test/Transforms/NaCl/atomic/volatile.ll
  135. +45 −0 test/Transforms/NaCl/canonicalize-mem-intrinsics.ll
  136. +15 −0 test/Transforms/NaCl/cleanup-used-globals-metadata.ll
  137. +69 −0 test/Transforms/NaCl/combine-shuffle-vector.ll
  138. +425 −0 test/Transforms/NaCl/constant-insert-extract-element-index.ll
  139. +44 −0 test/Transforms/NaCl/constant-vector-rematerialization.ll
  140. +299 −0 test/Transforms/NaCl/expand-arith-with-overflow.ll
  141. +122 −0 test/Transforms/NaCl/expand-byval.ll
  142. +109 −0 test/Transforms/NaCl/expand-constantexpr.ll
  143. +12 −0 test/Transforms/NaCl/expand-ctors-empty.ll
  144. +13 −0 test/Transforms/NaCl/expand-ctors-emptylist.ll
  145. +17 −0 test/Transforms/NaCl/expand-ctors-zeroinit.ll
  146. +37 −0 test/Transforms/NaCl/expand-ctors.ll
  147. +123 −0 test/Transforms/NaCl/expand-getelementptr.ll
  148. +62 −0 test/Transforms/NaCl/expand-indirectbr.ll
  149. +618 −0 test/Transforms/NaCl/expand-integers.ll
  150. +138 −0 test/Transforms/NaCl/expand-shuffle-vector.ll
  151. +216 −0 test/Transforms/NaCl/expand-small-arguments.ll
  152. +228 −0 test/Transforms/NaCl/expand-struct-regs.ll
  153. +42 −0 test/Transforms/NaCl/expand-tls-aligned.ll
  154. +17 −0 test/Transforms/NaCl/expand-tls-bss.ll
  155. +28 −0 test/Transforms/NaCl/expand-tls-constexpr-alias.ll
  156. +152 −0 test/Transforms/NaCl/expand-tls-constexpr.ll
  157. +12 −0 test/Transforms/NaCl/expand-tls-constexpr2.ll
  158. +60 −0 test/Transforms/NaCl/expand-tls-phi.ll
  159. +86 −0 test/Transforms/NaCl/expand-tls.ll
  160. +72 −0 test/Transforms/NaCl/expand-varargs-attrs.ll
  161. +28 −0 test/Transforms/NaCl/expand-varargs-emscripten.ll
  162. +17 −0 test/Transforms/NaCl/expand-varargs-struct.ll
  163. +250 −0 test/Transforms/NaCl/expand-varargs.ll
  164. +435 −0 test/Transforms/NaCl/fix-vector-load-store-alignment.ll
  165. +209 −0 test/Transforms/NaCl/flatten-globals.ll
  166. +59 −0 test/Transforms/NaCl/globalcleanup.ll
  167. +204 −0 test/Transforms/NaCl/globalize-constant-vectors.ll
  168. +34 −0 test/Transforms/NaCl/internalize-used-globals.ll
  169. +66 −0 test/Transforms/NaCl/life.ll
  170. +3 −0 test/Transforms/NaCl/lit.local.cfg
  171. +73 −0 test/Transforms/NaCl/normalize-alignment.ll
  172. +22 −0 test/Transforms/NaCl/pnacl-abi-internalize-symbols-pso.ll
  173. +25 −0 test/Transforms/NaCl/pnacl-abi-internalize-symbols.ll
  174. +23 −0 test/Transforms/NaCl/pnacl-abi-simplify-postopt.ll
  175. +50 −0 test/Transforms/NaCl/pnacl-abi-simplify-preopt.ll
  176. +54 −0 test/Transforms/NaCl/pnacl-abi-simplify.ll
  177. +127 −0 test/Transforms/NaCl/pnacl-eh-exception-info.ll
  178. +81 −0 test/Transforms/NaCl/pnacl-sjlj-eh-bug.ll
  179. +173 −0 test/Transforms/NaCl/pnacl-sjlj-eh.ll
  180. +143 −0 test/Transforms/NaCl/promote-i1-ops.ll
  181. +63 −0 test/Transforms/NaCl/promote-integer-signatures.ll
  182. +568 −0 test/Transforms/NaCl/promote-integers.ll
  183. +88 −0 test/Transforms/NaCl/remove-asm-memory.ll
  184. +656 −0 test/Transforms/NaCl/replace-ptrs-with-ints.ll
  185. +36 −0 test/Transforms/NaCl/resolve-aliases.ll
  186. +99 −0 test/Transforms/NaCl/resolve-pnacl-intrinsics-lock-free.ll
  187. +293 −0 test/Transforms/NaCl/resolve-pnacl-intrinsics.ll
  188. +35 −0 test/Transforms/NaCl/rewrite-assume.ll
  189. +18 −0 test/Transforms/NaCl/rewrite-call-with-libfunc-argument.ll
  190. +38 −0 test/Transforms/NaCl/rewrite-flt-rounds.ll
  191. +38 −0 test/Transforms/NaCl/rewrite-libcalls-wrong-signature.ll
  192. +16 −0 test/Transforms/NaCl/rewrite-longjmp-no-store.ll
  193. +21 −0 test/Transforms/NaCl/rewrite-longjmp-noncall-uses.ll
  194. +34 −0 test/Transforms/NaCl/rewrite-memfuncs-no-store.ll
  195. +30 −0 test/Transforms/NaCl/rewrite-memfuncs-noncall-uses.ll
  196. +35 −0 test/Transforms/NaCl/rewrite-prefetch.ll
  197. +13 −0 test/Transforms/NaCl/rewrite-setjmp-store-error.ll
  198. +76 −0 test/Transforms/NaCl/rewrite-setlongjmp-calls.ll
  199. +207 −0 test/Transforms/NaCl/simplify-allocas.ll
  200. +21 −0 test/Transforms/NaCl/simplify-struct-reg-pad-crash.ll
  201. +20 −0 test/Transforms/NaCl/simplify-struct-reg-resume-crash.ll
  202. +276 −0 test/Transforms/NaCl/simplify-struct-reg-signatures.ll
  203. +10 −0 test/Transforms/NaCl/simplify-struct-reg-vararg-crash.ll
  204. +66 −0 test/Transforms/NaCl/strip-attributes.ll
  205. +29 −0 test/Transforms/NaCl/strip-branchweight-metadata.ll
  206. +69 −0 test/Transforms/NaCl/strip-meta-leaves-debug.ll
  207. +36 −0 test/Transforms/NaCl/strip-tbaa-metadata.ll
  208. +4 −0 tools/opt/CMakeLists.txt
  209. +39 −5 tools/opt/opt.cpp
@@ -327,6 +327,7 @@ set(LLVM_ALL_TARGETS
ARM
BPF
Hexagon
JSBackend # @LOCALMOD
Lanai
Mips
MSP430
@@ -0,0 +1 @@
"1.37.10"
@@ -81,6 +81,7 @@ class Triple {
nvptx64, // NVPTX: 64-bit
le32, // le32: generic little-endian 32-bit CPU (PNaCl)
le64, // le64: generic little-endian 64-bit CPU (PNaCl)
asmjs, // asm.js JavaScript subset @LOCALMOD Emscripten
amdil, // AMDIL
amdil64, // AMDIL with 64-bit pointers
hsail, // AMD HSAIL
@@ -161,6 +162,7 @@ class Triple {
Haiku,
Minix,
RTEMS,
Emscripten, // Emscripten JavaScript runtime @LOCALMOD Emscripten
NaCl, // Native Client
CNK, // BG/P Compute-Node Kernel
Bitrig,
@@ -546,6 +548,13 @@ class Triple {
return getOS() == Triple::NaCl;
}

// @LOCALMOD-START Emscripten
/// Tests whether the OS is Emscripten.
bool isOSEmscripten() const {
return getOS() == Triple::Emscripten;
}
// @LOCALMOD-END Emscripten

/// Tests whether the OS is Linux.
bool isOSLinux() const {
return getOS() == Triple::Linux;
@@ -0,0 +1,74 @@
//===-- NaCl.h - NaCl Analysis ---------------------------*- C++ -*-===//
//
// The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//

#ifndef LLVM_ANALYSIS_NACL_H
#define LLVM_ANALYSIS_NACL_H

#include "llvm/Support/CommandLine.h"
#include "llvm/Support/ErrorHandling.h"
#include "llvm/Support/raw_ostream.h"
#include <string>

namespace llvm {

class FunctionPass;
class ModulePass;
extern cl::opt<bool> PNaClABIAllowDebugMetadata;

class PNaClABIErrorReporter {
PNaClABIErrorReporter(const PNaClABIErrorReporter&) = delete;
void operator=(const PNaClABIErrorReporter&) = delete;
public:
PNaClABIErrorReporter() : ErrorCount(0), Errors(ErrorString),
UseFatalErrors(true) {}
~PNaClABIErrorReporter() {}
// Return the number of verification errors from the last run.
int getErrorCount() const { return ErrorCount; }
// Print the error messages to O
void printErrors(llvm::raw_ostream &O) {
Errors.flush();
O << ErrorString;
}
// Increments the error count and returns an ostream to which the error
// message can be streamed.
raw_ostream &addError() {
ErrorCount++;
return Errors;
}
// Reset the error count and error messages.
void reset() {
ErrorCount = 0;
Errors.flush();
ErrorString.clear();
}
void setNonFatal() {
UseFatalErrors = false;
}
void checkForFatalErrors() {
if (UseFatalErrors && ErrorCount != 0) {
printErrors(errs());
report_fatal_error("PNaCl ABI verification failed");
}
}
private:
int ErrorCount;
std::string ErrorString;
raw_string_ostream Errors;
bool UseFatalErrors;
};

FunctionPass *createPNaClABIVerifyFunctionsPass(
PNaClABIErrorReporter *Reporter);
ModulePass *createPNaClABIVerifyModulePass(PNaClABIErrorReporter *Reporter,
bool StreamingMode = false);

}


#endif
@@ -688,6 +688,51 @@ def int_convert_from_fp16 : Intrinsic<[llvm_anyfloat_ty], [llvm_i16_ty]>;
def int_clear_cache : Intrinsic<[], [llvm_ptr_ty, llvm_ptr_ty],
[], "llvm.clear_cache">;

// @LOCALMOD-BEGIN
//===----------------------- Native Client Intrinsics ---------------------===//
// NaCl-specific setjmp/longjmp intrinsics.
// See https://code.google.com/p/nativeclient/issues/detail?id=3429
def int_nacl_setjmp : Intrinsic<[llvm_i32_ty], [llvm_ptr_ty]>;
def int_nacl_longjmp : Intrinsic<[], [llvm_ptr_ty, llvm_i32_ty],
[IntrNoReturn]>;

// Fast built-in version of NaCl's tls_get() IRT interface.
def int_nacl_read_tp : Intrinsic<[llvm_ptr_ty], [], [IntrNoMem]>;

// Atomic intrinsics.
//
// Volatiles and atomics are encoded through these intrinsics to make
// them platform-independent, remove some of LLVM's legacy, and isolate
// PNaCl from future changes to IR. The intrinsics allow user code to
// use `__sync_*` builtins as well as C11/C++11 atomics.
//
// These are further documented in docs/PNaClLangRef.rst.
//
// Note that IntrReadWriteArgMem is used in all cases to prevent
// reordering.
def int_nacl_atomic_load : Intrinsic<[llvm_anyint_ty],
[LLVMPointerType<LLVMMatchType<0>>, llvm_i32_ty],
[IntrArgMemOnly]>;
def int_nacl_atomic_store : Intrinsic<[],
[llvm_anyint_ty, LLVMPointerType<LLVMMatchType<0>>, llvm_i32_ty],
[IntrArgMemOnly]>;
def int_nacl_atomic_rmw : Intrinsic<[llvm_anyint_ty],
[llvm_i32_ty, LLVMPointerType<LLVMMatchType<0>>, LLVMMatchType<0>,
llvm_i32_ty],
[IntrArgMemOnly]>;
def int_nacl_atomic_cmpxchg : Intrinsic<[llvm_anyint_ty],
[LLVMPointerType<LLVMMatchType<0>>, LLVMMatchType<0>, LLVMMatchType<0>,
llvm_i32_ty, llvm_i32_ty],
[IntrArgMemOnly]>;
def int_nacl_atomic_fence : Intrinsic<[], [llvm_i32_ty],
[IntrArgMemOnly]>;
def int_nacl_atomic_fence_all : Intrinsic<[], [],
[IntrArgMemOnly]>;
def int_nacl_atomic_is_lock_free : Intrinsic<[llvm_i1_ty],
[llvm_i32_ty, llvm_ptr_ty], [IntrNoMem]>,
GCCBuiltin<"__nacl_atomic_is_lock_free">;
// @LOCALMOD-END

//===-------------------------- Masked Intrinsics -------------------------===//
//
def int_masked_store : Intrinsic<[], [llvm_anyvector_ty,
@@ -0,0 +1,110 @@
//===-- llvm/IR/NaClAtomicIntrinsics.h - NaCl Atomic Intrinsics -*- C++ -*-===//
//
// The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
//
// This file describes atomic intrinsic functions that are specific to NaCl.
//
//===----------------------------------------------------------------------===//

#ifndef LLVM_IR_NACL_ATOMIC_INTRINSICS_H
#define LLVM_IR_NACL_ATOMIC_INTRINSICS_H

#include "llvm/IR/Intrinsics.h"
#include "llvm/Support/Compiler.h"
#include <cstddef>

namespace llvm {

namespace NaCl {

static const size_t NumAtomicIntrinsics = 6;
static const size_t NumAtomicIntrinsicOverloadTypes = 4;
static const size_t MaxAtomicIntrinsicsParameters = 5;

/// Describe all the atomic intrinsics and their type signature. Most
/// can be overloaded on a type.
class AtomicIntrinsics {
public:
enum ParamType {
NoP, /// No parameter.
Int, /// Overloaded.
Ptr, /// Overloaded.
RMW, /// Atomic RMW operation type.
Mem /// Memory order.
};

struct AtomicIntrinsic {
Type *OverloadedType;
Intrinsic::ID ID;
uint8_t Overloaded : 1;
uint8_t NumParams : 7;
uint8_t ParamType[MaxAtomicIntrinsicsParameters];

Function *getDeclaration(Module *M) const {
// The atomic intrinsic can be overloaded on zero or one type,
// which is needed to create the function's declaration.
return Intrinsic::getDeclaration(
M, ID, ArrayRef<Type *>(&OverloadedType, Overloaded ? 1 : 0));
}
};

AtomicIntrinsics(LLVMContext &C);
~AtomicIntrinsics() {}

typedef ArrayRef<AtomicIntrinsic> View;

/// Access all atomic intrinsics, which can then be iterated over.
View allIntrinsicsAndOverloads() const;
/// Access a particular atomic intrinsic.
/// \returns 0 if no intrinsic was found.
const AtomicIntrinsic *find(Intrinsic::ID ID, Type *OverloadedType) const;

private:
AtomicIntrinsic I[NumAtomicIntrinsics][NumAtomicIntrinsicOverloadTypes];

AtomicIntrinsics() = delete;
AtomicIntrinsics(const AtomicIntrinsics &) = delete;
AtomicIntrinsics &operator=(const AtomicIntrinsics &) = delete;
};

/// Operations that can be represented by the @llvm.nacl.atomic.rmw
/// intrinsic.
///
/// Do not reorder these values: their order offers forward
/// compatibility of bitcode targeted to NaCl.
enum AtomicRMWOperation {
AtomicInvalid = 0, // Invalid, keep first.
AtomicAdd,
AtomicSub,
AtomicOr,
AtomicAnd,
AtomicXor,
AtomicExchange,
AtomicNum // Invalid, keep last.
};

/// Memory orderings supported by C11/C++11.
///
/// Do not reorder these values: their order offers forward
/// compatibility of bitcode targeted to NaCl.
enum MemoryOrder {
MemoryOrderInvalid = 0, // Invalid, keep first.
MemoryOrderRelaxed,
MemoryOrderConsume,
MemoryOrderAcquire,
MemoryOrderRelease,
MemoryOrderAcquireRelease,
MemoryOrderSequentiallyConsistent,
MemoryOrderNum // Invalid, keep last.
};

} // End NaCl namespace

} // End llvm namespace

#endif
@@ -354,6 +354,69 @@ void initializeVirtRegMapPass(PassRegistry&);
void initializeVirtRegRewriterPass(PassRegistry&);
void initializeWholeProgramDevirtPass(PassRegistry &);
void initializeWinEHPreparePass(PassRegistry&);

// @LOCALMOD-BEGIN
void initializeAddPNaClExternalDeclsPass(PassRegistry&);
void initializeAllocateDataSegmentPass(PassRegistry&);
void initializeBackendCanonicalizePass(PassRegistry&);
void initializeCanonicalizeMemIntrinsicsPass(PassRegistry&);
void initializeCleanupUsedGlobalsMetadataPass(PassRegistry&);
void initializeConstantInsertExtractElementIndexPass(PassRegistry&);
void initializeExpandAllocasPass(PassRegistry&);
void initializeExpandArithWithOverflowPass(PassRegistry&);
void initializeExpandByValPass(PassRegistry&);
void initializeExpandConstantExprPass(PassRegistry&);
void initializeExpandCtorsPass(PassRegistry&);
void initializeExpandGetElementPtrPass(PassRegistry&);
void initializeExpandIndirectBrPass(PassRegistry&);
void initializeExpandLargeIntegersPass(PassRegistry&);
void initializeExpandShuffleVectorPass(PassRegistry&);
void initializeExpandSmallArgumentsPass(PassRegistry&);
void initializeExpandStructRegsPass(PassRegistry&);
void initializeExpandTlsConstantExprPass(PassRegistry&);
void initializeExpandTlsPass(PassRegistry&);
void initializeExpandVarArgsPass(PassRegistry&);
void initializeFixVectorLoadStoreAlignmentPass(PassRegistry&);
void initializeFlattenGlobalsPass(PassRegistry&);
void initializeGlobalCleanupPass(PassRegistry&);
void initializeGlobalizeConstantVectorsPass(PassRegistry&);
void initializeInsertDivideCheckPass(PassRegistry&);
void initializeInternalizeUsedGlobalsPass(PassRegistry&);
void initializeNaClCcRewritePass(PassRegistry&);
void initializeNormalizeAlignmentPass(PassRegistry&);
void initializePNaClABIVerifyFunctionsPass(PassRegistry&);
void initializePNaClABIVerifyModulePass(PassRegistry&);
void initializePNaClSjLjEHPass(PassRegistry&);
void initializePromoteI1OpsPass(PassRegistry&);
void initializePromoteIntegersPass(PassRegistry&);
void initializeRemoveAsmMemoryPass(PassRegistry&);
void initializeRenameEntryPointPass(PassRegistry&);
void initializeReplacePtrsWithIntsPass(PassRegistry&);
void initializeResolveAliasesPass(PassRegistry&);
void initializeResolvePNaClIntrinsicsPass(PassRegistry&);
void initializeRewriteAtomicsPass(PassRegistry&);
void initializeRewriteLLVMIntrinsicsPass(PassRegistry&);
void initializeRewritePNaClLibraryCallsPass(PassRegistry&);
void initializeSandboxIndirectCallsPass(PassRegistry&);
void initializeSandboxMemoryAccessesPass(PassRegistry&);
void initializeSimplifyAllocasPass(PassRegistry&);
void initializeSimplifyStructRegSignaturesPass(PassRegistry&);
void initializeStripAttributesPass(PassRegistry&);
void initializeStripMetadataPass(PassRegistry&);
void initializeStripModuleFlagsPass(PassRegistry&);
void initializeStripDanglingDISubprogramsPass(PassRegistry&);
void initializeStripTlsPass(PassRegistry&);
void initializeSubstituteUndefsPass(PassRegistry&);
// Emscripten passes:
void initializeExpandI64Pass(PassRegistry&);
void initializeExpandInsertExtractElementPass(PassRegistry&);
void initializeLowerEmAsyncifyPass(PassRegistry&);
void initializeLowerEmExceptionsPass(PassRegistry&);
void initializeLowerEmSetjmpPass(PassRegistry&);
void initializeNoExitRuntimePass(PassRegistry&);
// Emscripten passes end.
// @LOCALMOD-END

void initializeWriteBitcodePassPass(PassRegistry &);
void initializeWriteThinLTOBitcodePass(PassRegistry &);
void initializeXRayInstrumentationPass(PassRegistry &);
Oops, something went wrong.

0 comments on commit c9bf6e3

Please sign in to comment.
You can’t perform that action at this time.