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

Commit 3e03f73

Browse files
committed
Import of fastcomp commit 4105790
This is a minimal import of the emscripten "fastcomp" LLVM patchset. All it contains is the target definitions necessary to create a TargetMachine with the correct data layout. With this rustc can emit LLVM IR that emcc will run through the PNaCl lagalizer and the JS backend to generate asm.js.
1 parent 7801978 commit 3e03f73

21 files changed

+599
-0
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

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;

lib/Support/Triple.cpp

+13
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ const char *Triple::getArchTypeName(ArchType Kind) {
5353
case nvptx64: return "nvptx64";
5454
case le32: return "le32";
5555
case le64: return "le64";
56+
case asmjs: return "asmjs"; // @LOCALMOD Emscripten
5657
case amdil: return "amdil";
5758
case amdil64: return "amdil64";
5859
case hsail: return "hsail";
@@ -121,6 +122,8 @@ const char *Triple::getArchTypePrefix(ArchType Kind) {
121122
case le32: return "le32";
122123
case le64: return "le64";
123124

125+
case asmjs: return "asmjs"; // @LOCALMOD Emscripten
126+
124127
case amdil:
125128
case amdil64: return "amdil";
126129

@@ -180,6 +183,7 @@ const char *Triple::getOSTypeName(OSType Kind) {
180183
case Haiku: return "haiku";
181184
case Minix: return "minix";
182185
case RTEMS: return "rtems";
186+
case Emscripten: return "emscripten"; // @LOCALMOD Emscripten
183187
case NaCl: return "nacl";
184188
case CNK: return "cnk";
185189
case Bitrig: return "bitrig";
@@ -273,6 +277,7 @@ Triple::ArchType Triple::getArchTypeForLLVMName(StringRef Name) {
273277
.Case("nvptx64", nvptx64)
274278
.Case("le32", le32)
275279
.Case("le64", le64)
280+
.Case("asmjs", asmjs) // @LOCALMOD Emscripten
276281
.Case("amdil", amdil)
277282
.Case("amdil64", amdil64)
278283
.Case("hsail", hsail)
@@ -384,6 +389,7 @@ static Triple::ArchType parseArch(StringRef ArchName) {
384389
.Case("nvptx64", Triple::nvptx64)
385390
.Case("le32", Triple::le32)
386391
.Case("le64", Triple::le64)
392+
.Case("asmjs", Triple::asmjs) // @LOCALMOD Emscripten
387393
.Case("amdil", Triple::amdil)
388394
.Case("amdil64", Triple::amdil64)
389395
.Case("hsail", Triple::hsail)
@@ -450,6 +456,7 @@ static Triple::OSType parseOS(StringRef OSName) {
450456
.StartsWith("haiku", Triple::Haiku)
451457
.StartsWith("minix", Triple::Minix)
452458
.StartsWith("rtems", Triple::RTEMS)
459+
.StartsWith("emscripten", Triple::Emscripten) // @LOCALMOD Emscripten
453460
.StartsWith("nacl", Triple::NaCl)
454461
.StartsWith("cnk", Triple::CNK)
455462
.StartsWith("bitrig", Triple::Bitrig)
@@ -584,6 +591,7 @@ static Triple::ObjectFormatType getDefaultFormat(const Triple &T) {
584591
case Triple::amdil:
585592
case Triple::amdil64:
586593
case Triple::armeb:
594+
case Triple::asmjs: // @LOCALMOD Emscripten
587595
case Triple::avr:
588596
case Triple::bpfeb:
589597
case Triple::bpfel:
@@ -1127,6 +1135,7 @@ static unsigned getArchPointerBitWidth(llvm::Triple::ArchType Arch) {
11271135
case llvm::Triple::armeb:
11281136
case llvm::Triple::hexagon:
11291137
case llvm::Triple::le32:
1138+
case llvm::Triple::asmjs: // @LOCALMOD Emscripten
11301139
case llvm::Triple::mips:
11311140
case llvm::Triple::mipsel:
11321141
case llvm::Triple::nvptx:
@@ -1207,6 +1216,7 @@ Triple Triple::get32BitArchVariant() const {
12071216
case Triple::hexagon:
12081217
case Triple::kalimba:
12091218
case Triple::le32:
1219+
case Triple::asmjs: // @LOCALMOD Emscripten
12101220
case Triple::mips:
12111221
case Triple::mipsel:
12121222
case Triple::nvptx:
@@ -1256,6 +1266,7 @@ Triple Triple::get64BitArchVariant() const {
12561266
case Triple::r600:
12571267
case Triple::tce:
12581268
case Triple::xcore:
1269+
case Triple::asmjs: // @LOCALMOD Emscripten
12591270
case Triple::sparcel:
12601271
case Triple::shave:
12611272
T.setArch(UnknownArch);
@@ -1313,6 +1324,7 @@ Triple Triple::getBigEndianArchVariant() const {
13131324
case Triple::amdgcn:
13141325
case Triple::amdil64:
13151326
case Triple::amdil:
1327+
case Triple::asmjs:
13161328
case Triple::avr:
13171329
case Triple::hexagon:
13181330
case Triple::hsail64:
@@ -1393,6 +1405,7 @@ bool Triple::isLittleEndian() const {
13931405
case Triple::amdil64:
13941406
case Triple::amdil:
13951407
case Triple::arm:
1408+
case Triple::asmjs:
13961409
case Triple::avr:
13971410
case Triple::bpfel:
13981411
case Triple::hexagon:

lib/Target/JSBackend/CMakeLists.txt

+10
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
add_llvm_target(JSBackendCodeGen
2+
JSBackend.cpp
3+
JSTargetMachine.cpp
4+
JSTargetTransformInfo.cpp
5+
)
6+
7+
add_dependencies(LLVMJSBackendCodeGen intrinsics_gen)
8+
9+
add_subdirectory(TargetInfo)
10+
add_subdirectory(MCTargetDesc)

lib/Target/JSBackend/JS.h

+24
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
//===-- JS.h - Top-level interface for JS representation ------*- 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 contains the entry points for global functions defined in the JS
11+
// target library, as used by the LLVM JIT.
12+
//
13+
//===----------------------------------------------------------------------===//
14+
15+
#ifndef TARGET_JS_H
16+
#define TARGET_JS_H
17+
18+
namespace llvm {
19+
20+
class JSTargetMachine;
21+
22+
} // End llvm namespace
23+
24+
#endif

lib/Target/JSBackend/JSBackend.cpp

+40
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
//===-- JSBackend.cpp - Library for converting LLVM code to JS -----===//
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 implements compiling of LLVM IR, which is assumed to have been
11+
// simplified using the PNaCl passes, i64 legalization, and other necessary
12+
// transformations, into JavaScript in asm.js format, suitable for passing
13+
// to emscripten for final processing.
14+
//
15+
//===----------------------------------------------------------------------===//
16+
17+
#include "JSTargetMachine.h"
18+
#include "MCTargetDesc/JSBackendMCTargetDesc.h"
19+
#include "llvm/Target/TargetMachine.h"
20+
#include "llvm/Target/TargetSubtargetInfo.h"
21+
#include "llvm/Target/TargetLowering.h"
22+
23+
using namespace llvm;
24+
25+
extern "C" void LLVMInitializeJSBackendTarget() {
26+
// Register the target.
27+
RegisterTargetMachine<JSTargetMachine> X(TheJSBackendTarget);
28+
}
29+
30+
//===----------------------------------------------------------------------===//
31+
// External Interface declaration
32+
//===----------------------------------------------------------------------===//
33+
34+
bool JSTargetMachine::addPassesToEmitFile(
35+
PassManagerBase &PM, raw_pwrite_stream &Out, CodeGenFileType FileType,
36+
bool DisableVerify, AnalysisID StartBefore,
37+
AnalysisID StartAfter, AnalysisID StopAfter,
38+
MachineFunctionInitializer *MFInitializer) {
39+
return false;
40+
}
+48
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
//===-- JSTargetMachine.cpp - Define TargetMachine for the JS -------------===//
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 defines the JS specific subclass of TargetMachine.
11+
//
12+
//===----------------------------------------------------------------------===//
13+
14+
#include "JSTargetMachine.h"
15+
#include "JSTargetTransformInfo.h"
16+
#include "llvm/Analysis/TargetTransformInfo.h"
17+
#include "llvm/Support/TargetRegistry.h"
18+
using namespace llvm;
19+
20+
extern const llvm::SubtargetFeatureKV JSSubTypeKV[] = {
21+
{ "asmjs", "Select the asmjs processor", { }, { } }
22+
};
23+
24+
static const llvm::SubtargetInfoKV JSProcSchedModels[] = {
25+
{ "asmjs", &MCSchedModel::GetDefaultSchedModel() }
26+
};
27+
28+
JSSubtarget::JSSubtarget(const TargetMachine& TM, const Triple &TT) :
29+
TargetSubtargetInfo(TT, "asmjs", "asmjs", None, makeArrayRef(JSSubTypeKV, 1), JSProcSchedModels, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr),
30+
TL(TM)
31+
{}
32+
33+
34+
JSTargetMachine::JSTargetMachine(const Target &T, const Triple &TT,
35+
StringRef CPU, StringRef FS, const TargetOptions &Options,
36+
Optional<Reloc::Model>& RM, CodeModel::Model CM,
37+
CodeGenOpt::Level OL)
38+
: LLVMTargetMachine(T, "e-p:32:32-i64:64-v128:32:128-n32-S128", TT,
39+
CPU, FS, Options, Reloc::Static, CM, OL),
40+
ST(*this, TT) {
41+
}
42+
43+
TargetIRAnalysis JSTargetMachine::getTargetIRAnalysis() {
44+
return TargetIRAnalysis([this](const Function &F) {
45+
return TargetTransformInfo(JSTTIImpl(this, F));
46+
});
47+
}
48+
+71
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
//===-- JSTargetMachine.h - TargetMachine for the JS Backend ----*- 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 declares the TargetMachine that is used by the JS/asm.js/
11+
// emscripten backend.
12+
//
13+
//===---------------------------------------------------------------------===//
14+
15+
#ifndef JSTARGETMACHINE_H
16+
#define JSTARGETMACHINE_H
17+
18+
#include "JS.h"
19+
#include "llvm/Target/TargetMachine.h"
20+
#include "llvm/Target/TargetSubtargetInfo.h"
21+
#include "llvm/Target/TargetLowering.h"
22+
23+
namespace llvm {
24+
25+
class formatted_raw_ostream;
26+
27+
class JSTargetLowering : public TargetLowering {
28+
public:
29+
explicit JSTargetLowering(const TargetMachine& TM) : TargetLowering(TM) {}
30+
};
31+
32+
class JSSubtarget : public TargetSubtargetInfo {
33+
JSTargetLowering TL;
34+
35+
public:
36+
JSSubtarget(const TargetMachine& TM, const Triple &TT);
37+
38+
const TargetLowering *getTargetLowering() const override {
39+
return &TL;
40+
}
41+
};
42+
43+
class JSTargetMachine : public LLVMTargetMachine {
44+
const JSSubtarget ST;
45+
46+
public:
47+
JSTargetMachine(const Target &T, const Triple &TT,
48+
StringRef CPU, StringRef FS, const TargetOptions &Options,
49+
Optional<Reloc::Model>& RM, CodeModel::Model CM,
50+
CodeGenOpt::Level OL);
51+
52+
bool addPassesToEmitFile(
53+
PassManagerBase &PM, raw_pwrite_stream &Out, CodeGenFileType FileType,
54+
bool DisableVerify = true, AnalysisID StartBefore = nullptr,
55+
AnalysisID StartAfter = nullptr, AnalysisID StopAfter = nullptr,
56+
MachineFunctionInitializer *MFInitializer = nullptr) override;
57+
58+
TargetIRAnalysis getTargetIRAnalysis() override;
59+
60+
const TargetSubtargetInfo *getJSSubtargetImpl() const {
61+
return &ST;
62+
}
63+
64+
const JSSubtarget *getSubtargetImpl(const Function &F) const override {
65+
return &ST;
66+
}
67+
};
68+
69+
} // End llvm namespace
70+
71+
#endif

0 commit comments

Comments
 (0)