Skip to content
This repository was archived by the owner on Feb 5, 2019. It is now read-only.

Commit 5fbe4e6

Browse files
committed
Squash of fastcomp commit 4105790
1 parent 7801978 commit 5fbe4e6

File tree

217 files changed

+35705
-13
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

217 files changed

+35705
-13
lines changed

CMakeLists.txt

+1
Original file line numberDiff line numberDiff line change
@@ -224,6 +224,7 @@ set(LLVM_ALL_TARGETS
224224
ARM
225225
BPF
226226
Hexagon
227+
JSBackend # @LOCALMOD
227228
Mips
228229
MSP430
229230
NVPTX

emscripten-version.txt

+2
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
"1.36.9"
2+

include/llvm/ADT/Triple.h

+9
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,7 @@ class Triple {
7878
nvptx64, // NVPTX: 64-bit
7979
le32, // le32: generic little-endian 32-bit CPU (PNaCl)
8080
le64, // le64: generic little-endian 64-bit CPU (PNaCl)
81+
asmjs, // asm.js JavaScript subset @LOCALMOD Emscripten
8182
amdil, // AMDIL
8283
amdil64, // AMDIL with 64-bit pointers
8384
hsail, // AMD HSAIL
@@ -156,6 +157,7 @@ class Triple {
156157
Haiku,
157158
Minix,
158159
RTEMS,
160+
Emscripten, // Emscripten JavaScript runtime @LOCALMOD Emscripten
159161
NaCl, // Native Client
160162
CNK, // BG/P Compute-Node Kernel
161163
Bitrig,
@@ -531,6 +533,13 @@ class Triple {
531533
return getOS() == Triple::NaCl;
532534
}
533535

536+
// @LOCALMOD-START Emscripten
537+
/// Tests whether the OS is Emscripten.
538+
bool isOSEmscripten() const {
539+
return getOS() == Triple::Emscripten;
540+
}
541+
// @LOCALMOD-END Emscripten
542+
534543
/// Tests whether the OS is Linux.
535544
bool isOSLinux() const {
536545
return getOS() == Triple::Linux;

include/llvm/Analysis/NaCl.h

+74
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
//===-- NaCl.h - NaCl Analysis ---------------------------*- C++ -*-===//
2+
//
3+
// The LLVM Compiler Infrastructure
4+
//
5+
// This file is distributed under the University of Illinois Open Source
6+
// License. See LICENSE.TXT for details.
7+
//
8+
//===----------------------------------------------------------------------===//
9+
10+
#ifndef LLVM_ANALYSIS_NACL_H
11+
#define LLVM_ANALYSIS_NACL_H
12+
13+
#include "llvm/Support/CommandLine.h"
14+
#include "llvm/Support/ErrorHandling.h"
15+
#include "llvm/Support/raw_ostream.h"
16+
#include <string>
17+
18+
namespace llvm {
19+
20+
class FunctionPass;
21+
class ModulePass;
22+
extern cl::opt<bool> PNaClABIAllowDebugMetadata;
23+
24+
class PNaClABIErrorReporter {
25+
PNaClABIErrorReporter(const PNaClABIErrorReporter&) = delete;
26+
void operator=(const PNaClABIErrorReporter&) = delete;
27+
public:
28+
PNaClABIErrorReporter() : ErrorCount(0), Errors(ErrorString),
29+
UseFatalErrors(true) {}
30+
~PNaClABIErrorReporter() {}
31+
// Return the number of verification errors from the last run.
32+
int getErrorCount() const { return ErrorCount; }
33+
// Print the error messages to O
34+
void printErrors(llvm::raw_ostream &O) {
35+
Errors.flush();
36+
O << ErrorString;
37+
}
38+
// Increments the error count and returns an ostream to which the error
39+
// message can be streamed.
40+
raw_ostream &addError() {
41+
ErrorCount++;
42+
return Errors;
43+
}
44+
// Reset the error count and error messages.
45+
void reset() {
46+
ErrorCount = 0;
47+
Errors.flush();
48+
ErrorString.clear();
49+
}
50+
void setNonFatal() {
51+
UseFatalErrors = false;
52+
}
53+
void checkForFatalErrors() {
54+
if (UseFatalErrors && ErrorCount != 0) {
55+
printErrors(errs());
56+
report_fatal_error("PNaCl ABI verification failed");
57+
}
58+
}
59+
private:
60+
int ErrorCount;
61+
std::string ErrorString;
62+
raw_string_ostream Errors;
63+
bool UseFatalErrors;
64+
};
65+
66+
FunctionPass *createPNaClABIVerifyFunctionsPass(
67+
PNaClABIErrorReporter *Reporter);
68+
ModulePass *createPNaClABIVerifyModulePass(PNaClABIErrorReporter *Reporter,
69+
bool StreamingMode = false);
70+
71+
}
72+
73+
74+
#endif

include/llvm/IR/Intrinsics.td

+50
Original file line numberDiff line numberDiff line change
@@ -651,6 +651,56 @@ def int_convertuu : Intrinsic<[llvm_anyint_ty],
651651
def int_clear_cache : Intrinsic<[], [llvm_ptr_ty, llvm_ptr_ty],
652652
[], "llvm.clear_cache">;
653653

654+
// @LOCALMOD-BEGIN
655+
//===----------------------- Native Client Intrinsics ---------------------===//
656+
// NaCl-specific setjmp/longjmp intrinsics.
657+
// See https://code.google.com/p/nativeclient/issues/detail?id=3429
658+
def int_nacl_setjmp : Intrinsic<[llvm_i32_ty], [llvm_ptr_ty]>;
659+
def int_nacl_longjmp : Intrinsic<[], [llvm_ptr_ty, llvm_i32_ty],
660+
[IntrNoReturn]>;
661+
662+
// Fast built-in version of NaCl's tls_get() IRT interface.
663+
def int_nacl_read_tp : Intrinsic<[llvm_ptr_ty], [], [IntrNoMem]>;
664+
665+
// Atomic intrinsics.
666+
//
667+
// Volatiles and atomics are encoded through these intrinsics to make
668+
// them platform-independent, remove some of LLVM's legacy, and isolate
669+
// PNaCl from future changes to IR. The intrinsics allow user code to
670+
// use `__sync_*` builtins as well as C11/C++11 atomics.
671+
//
672+
// These are further documented in docs/PNaClLangRef.rst.
673+
//
674+
// Note that IntrReadWriteArgMem is used in all cases to prevent
675+
// reordering.
676+
def int_nacl_atomic_load : Intrinsic<[llvm_anyint_ty],
677+
[LLVMPointerType<LLVMMatchType<0>>, llvm_i32_ty],
678+
[IntrArgMemOnly]>;
679+
def int_nacl_atomic_store : Intrinsic<[],
680+
[llvm_anyint_ty, LLVMPointerType<LLVMMatchType<0>>, llvm_i32_ty],
681+
[IntrArgMemOnly]>;
682+
def int_nacl_atomic_rmw : Intrinsic<[llvm_anyint_ty],
683+
[llvm_i32_ty, LLVMPointerType<LLVMMatchType<0>>, LLVMMatchType<0>,
684+
llvm_i32_ty],
685+
[IntrArgMemOnly]>;
686+
def int_nacl_atomic_cmpxchg : Intrinsic<[llvm_anyint_ty],
687+
[LLVMPointerType<LLVMMatchType<0>>, LLVMMatchType<0>, LLVMMatchType<0>,
688+
llvm_i32_ty, llvm_i32_ty],
689+
[IntrArgMemOnly]>;
690+
def int_nacl_atomic_fence : Intrinsic<[], [llvm_i32_ty],
691+
[IntrArgMemOnly]>;
692+
def int_nacl_atomic_fence_all : Intrinsic<[], [],
693+
[IntrArgMemOnly]>;
694+
def int_nacl_atomic_is_lock_free : Intrinsic<[llvm_i1_ty],
695+
[llvm_i32_ty, llvm_ptr_ty], [IntrNoMem]>,
696+
GCCBuiltin<"__nacl_atomic_is_lock_free">;
697+
// @LOCALMOD-END
698+
// Calculate the Absolute Differences of the two input vectors.
699+
def int_sabsdiff : Intrinsic<[llvm_anyvector_ty],
700+
[ LLVMMatchType<0>, LLVMMatchType<0> ], [IntrNoMem]>;
701+
def int_uabsdiff : Intrinsic<[llvm_anyvector_ty],
702+
[ LLVMMatchType<0>, LLVMMatchType<0> ], [IntrNoMem]>;
703+
654704
//===-------------------------- Masked Intrinsics -------------------------===//
655705
//
656706
def int_masked_store : Intrinsic<[], [llvm_anyvector_ty,
+110
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,110 @@
1+
//===-- llvm/IR/NaClAtomicIntrinsics.h - NaCl Atomic Intrinsics -*- C++ -*-===//
2+
//
3+
// The LLVM Compiler Infrastructure
4+
//
5+
// This file is distributed under the University of Illinois Open Source
6+
// License. See LICENSE.TXT for details.
7+
//
8+
//===----------------------------------------------------------------------===//
9+
//
10+
// This file describes atomic intrinsic functions that are specific to NaCl.
11+
//
12+
//===----------------------------------------------------------------------===//
13+
14+
#ifndef LLVM_IR_NACL_ATOMIC_INTRINSICS_H
15+
#define LLVM_IR_NACL_ATOMIC_INTRINSICS_H
16+
17+
#include "llvm/IR/Intrinsics.h"
18+
#include "llvm/Support/Compiler.h"
19+
#include <cstddef>
20+
21+
namespace llvm {
22+
23+
namespace NaCl {
24+
25+
static const size_t NumAtomicIntrinsics = 6;
26+
static const size_t NumAtomicIntrinsicOverloadTypes = 4;
27+
static const size_t MaxAtomicIntrinsicsParameters = 5;
28+
29+
/// Describe all the atomic intrinsics and their type signature. Most
30+
/// can be overloaded on a type.
31+
class AtomicIntrinsics {
32+
public:
33+
enum ParamType {
34+
NoP, /// No parameter.
35+
Int, /// Overloaded.
36+
Ptr, /// Overloaded.
37+
RMW, /// Atomic RMW operation type.
38+
Mem /// Memory order.
39+
};
40+
41+
struct AtomicIntrinsic {
42+
Type *OverloadedType;
43+
Intrinsic::ID ID;
44+
uint8_t Overloaded : 1;
45+
uint8_t NumParams : 7;
46+
uint8_t ParamType[MaxAtomicIntrinsicsParameters];
47+
48+
Function *getDeclaration(Module *M) const {
49+
// The atomic intrinsic can be overloaded on zero or one type,
50+
// which is needed to create the function's declaration.
51+
return Intrinsic::getDeclaration(
52+
M, ID, ArrayRef<Type *>(&OverloadedType, Overloaded ? 1 : 0));
53+
}
54+
};
55+
56+
AtomicIntrinsics(LLVMContext &C);
57+
~AtomicIntrinsics() {}
58+
59+
typedef ArrayRef<AtomicIntrinsic> View;
60+
61+
/// Access all atomic intrinsics, which can then be iterated over.
62+
View allIntrinsicsAndOverloads() const;
63+
/// Access a particular atomic intrinsic.
64+
/// \returns 0 if no intrinsic was found.
65+
const AtomicIntrinsic *find(Intrinsic::ID ID, Type *OverloadedType) const;
66+
67+
private:
68+
AtomicIntrinsic I[NumAtomicIntrinsics][NumAtomicIntrinsicOverloadTypes];
69+
70+
AtomicIntrinsics() = delete;
71+
AtomicIntrinsics(const AtomicIntrinsics &) = delete;
72+
AtomicIntrinsics &operator=(const AtomicIntrinsics &) = delete;
73+
};
74+
75+
/// Operations that can be represented by the @llvm.nacl.atomic.rmw
76+
/// intrinsic.
77+
///
78+
/// Do not reorder these values: their order offers forward
79+
/// compatibility of bitcode targeted to NaCl.
80+
enum AtomicRMWOperation {
81+
AtomicInvalid = 0, // Invalid, keep first.
82+
AtomicAdd,
83+
AtomicSub,
84+
AtomicOr,
85+
AtomicAnd,
86+
AtomicXor,
87+
AtomicExchange,
88+
AtomicNum // Invalid, keep last.
89+
};
90+
91+
/// Memory orderings supported by C11/C++11.
92+
///
93+
/// Do not reorder these values: their order offers forward
94+
/// compatibility of bitcode targeted to NaCl.
95+
enum MemoryOrder {
96+
MemoryOrderInvalid = 0, // Invalid, keep first.
97+
MemoryOrderRelaxed,
98+
MemoryOrderConsume,
99+
MemoryOrderAcquire,
100+
MemoryOrderRelease,
101+
MemoryOrderAcquireRelease,
102+
MemoryOrderSequentiallyConsistent,
103+
MemoryOrderNum // Invalid, keep last.
104+
};
105+
106+
} // End NaCl namespace
107+
108+
} // End llvm namespace
109+
110+
#endif

include/llvm/InitializePasses.h

+63
Original file line numberDiff line numberDiff line change
@@ -336,6 +336,69 @@ void initializeVirtRegMapPass(PassRegistry&);
336336
void initializeVirtRegRewriterPass(PassRegistry&);
337337
void initializeWholeProgramDevirtPass(PassRegistry &);
338338
void initializeWinEHPreparePass(PassRegistry&);
339+
340+
// @LOCALMOD-BEGIN
341+
void initializeAddPNaClExternalDeclsPass(PassRegistry&);
342+
void initializeAllocateDataSegmentPass(PassRegistry&);
343+
void initializeBackendCanonicalizePass(PassRegistry&);
344+
void initializeCanonicalizeMemIntrinsicsPass(PassRegistry&);
345+
void initializeCleanupUsedGlobalsMetadataPass(PassRegistry&);
346+
void initializeConstantInsertExtractElementIndexPass(PassRegistry&);
347+
void initializeExpandAllocasPass(PassRegistry&);
348+
void initializeExpandArithWithOverflowPass(PassRegistry&);
349+
void initializeExpandByValPass(PassRegistry&);
350+
void initializeExpandConstantExprPass(PassRegistry&);
351+
void initializeExpandCtorsPass(PassRegistry&);
352+
void initializeExpandGetElementPtrPass(PassRegistry&);
353+
void initializeExpandIndirectBrPass(PassRegistry&);
354+
void initializeExpandLargeIntegersPass(PassRegistry&);
355+
void initializeExpandShuffleVectorPass(PassRegistry&);
356+
void initializeExpandSmallArgumentsPass(PassRegistry&);
357+
void initializeExpandStructRegsPass(PassRegistry&);
358+
void initializeExpandTlsConstantExprPass(PassRegistry&);
359+
void initializeExpandTlsPass(PassRegistry&);
360+
void initializeExpandVarArgsPass(PassRegistry&);
361+
void initializeFixVectorLoadStoreAlignmentPass(PassRegistry&);
362+
void initializeFlattenGlobalsPass(PassRegistry&);
363+
void initializeGlobalCleanupPass(PassRegistry&);
364+
void initializeGlobalizeConstantVectorsPass(PassRegistry&);
365+
void initializeInsertDivideCheckPass(PassRegistry&);
366+
void initializeInternalizeUsedGlobalsPass(PassRegistry&);
367+
void initializeNaClCcRewritePass(PassRegistry&);
368+
void initializeNormalizeAlignmentPass(PassRegistry&);
369+
void initializePNaClABIVerifyFunctionsPass(PassRegistry&);
370+
void initializePNaClABIVerifyModulePass(PassRegistry&);
371+
void initializePNaClSjLjEHPass(PassRegistry&);
372+
void initializePromoteI1OpsPass(PassRegistry&);
373+
void initializePromoteIntegersPass(PassRegistry&);
374+
void initializeRemoveAsmMemoryPass(PassRegistry&);
375+
void initializeRenameEntryPointPass(PassRegistry&);
376+
void initializeReplacePtrsWithIntsPass(PassRegistry&);
377+
void initializeResolveAliasesPass(PassRegistry&);
378+
void initializeResolvePNaClIntrinsicsPass(PassRegistry&);
379+
void initializeRewriteAtomicsPass(PassRegistry&);
380+
void initializeRewriteLLVMIntrinsicsPass(PassRegistry&);
381+
void initializeRewritePNaClLibraryCallsPass(PassRegistry&);
382+
void initializeSandboxIndirectCallsPass(PassRegistry&);
383+
void initializeSandboxMemoryAccessesPass(PassRegistry&);
384+
void initializeSimplifyAllocasPass(PassRegistry&);
385+
void initializeSimplifyStructRegSignaturesPass(PassRegistry&);
386+
void initializeStripAttributesPass(PassRegistry&);
387+
void initializeStripMetadataPass(PassRegistry&);
388+
void initializeStripModuleFlagsPass(PassRegistry&);
389+
void initializeStripDanglingDISubprogramsPass(PassRegistry&);
390+
void initializeStripTlsPass(PassRegistry&);
391+
void initializeSubstituteUndefsPass(PassRegistry&);
392+
// Emscripten passes:
393+
void initializeExpandI64Pass(PassRegistry&);
394+
void initializeExpandInsertExtractElementPass(PassRegistry&);
395+
void initializeLowerEmAsyncifyPass(PassRegistry&);
396+
void initializeLowerEmExceptionsPass(PassRegistry&);
397+
void initializeLowerEmSetjmpPass(PassRegistry&);
398+
void initializeNoExitRuntimePass(PassRegistry&);
399+
// Emscripten passes end.
400+
// @LOCALMOD-END
401+
339402
void initializeWriteBitcodePassPass(PassRegistry &);
340403
void initializeXRayInstrumentationPass(PassRegistry &);
341404
}

0 commit comments

Comments
 (0)