Skip to content

Commit 3a8eff2

Browse files
committed
Initial support for the Emscripten driver
1 parent 5c62ef5 commit 3a8eff2

File tree

5 files changed

+118
-1
lines changed

5 files changed

+118
-1
lines changed

lib/Basic/Targets.cpp

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2510,6 +2510,29 @@ class HaikuX86_32TargetInfo : public X86_32TargetInfo {
25102510
};
25112511
} // end anonymous namespace
25122512

2513+
namespace {
2514+
// Emscripten target
2515+
class EmscriptenTargetInfo : public LinuxTargetInfo<X86_32TargetInfo> {
2516+
protected:
2517+
virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
2518+
MacroBuilder &Builder) const {
2519+
LinuxTargetInfo<X86_32TargetInfo>::getOSDefines(Opts, Triple, Builder);
2520+
Builder.defineMacro("EMSCRIPTEN");
2521+
Builder.undefineMacro("linux");
2522+
Builder.undefineMacro("__linux");
2523+
Builder.undefineMacro("__linux__");
2524+
}
2525+
public:
2526+
EmscriptenTargetInfo(const std::string& triple)
2527+
: LinuxTargetInfo(triple) {
2528+
}
2529+
2530+
virtual const char *getStaticInitSectionSpecifier() const {
2531+
return 0;
2532+
}
2533+
};
2534+
} // end anonymous namespace
2535+
25132536
// RTEMS Target
25142537
template<typename Target>
25152538
class RTEMSTargetInfo : public OSTargetInfo<Target> {
@@ -4198,6 +4221,8 @@ static TargetInfo *AllocateTarget(const std::string &T) {
41984221
return new FreeBSDTargetInfo<X86_32TargetInfo>(T);
41994222
case llvm::Triple::Minix:
42004223
return new MinixTargetInfo<X86_32TargetInfo>(T);
4224+
case llvm::Triple::Emscripten:
4225+
return new EmscriptenTargetInfo(T);
42014226
case llvm::Triple::Solaris:
42024227
return new SolarisTargetInfo<X86_32TargetInfo>(T);
42034228
case llvm::Triple::Cygwin:

lib/Driver/Driver.cpp

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1687,7 +1687,8 @@ static llvm::Triple computeTargetTriple(StringRef DefaultTargetTriple,
16871687
// Skip further flag support on OSes which don't support '-m32' or '-m64'.
16881688
if (Target.getArchName() == "tce" ||
16891689
Target.getOS() == llvm::Triple::AuroraUX ||
1690-
Target.getOS() == llvm::Triple::Minix)
1690+
Target.getOS() == llvm::Triple::Minix ||
1691+
Target.getOS() == llvm::Triple::Emscripten)
16911692
return Target;
16921693

16931694
// Handle pseudo-target flags '-m32' and '-m64'.
@@ -1746,6 +1747,9 @@ const ToolChain &Driver::getToolChain(const ArgList &Args,
17461747
case llvm::Triple::Minix:
17471748
TC = new toolchains::Minix(*this, Target, Args);
17481749
break;
1750+
case llvm::Triple::Emscripten:
1751+
TC = new toolchains::Emscripten(*this, Target);
1752+
break;
17491753
case llvm::Triple::Linux:
17501754
if (Target.getArch() == llvm::Triple::hexagon)
17511755
TC = new toolchains::Hexagon_TC(*this, Target);

lib/Driver/ToolChains.cpp

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1681,6 +1681,72 @@ Tool &Minix::SelectTool(const Compilation &C, const JobAction &JA,
16811681
return *T;
16821682
}
16831683

1684+
Tool &Emscripten::SelectTool(const Compilation &C,
1685+
const JobAction &JA,
1686+
const ActionList &Inputs) const {
1687+
Action::ActionClass Key;
1688+
Key = Action::AnalyzeJobClass;
1689+
1690+
Tool *&T = Tools[Key];
1691+
if (!T) {
1692+
switch (Key) {
1693+
case Action::PreprocessJobClass:
1694+
case Action::CompileJobClass:
1695+
T = new tools::Clang(*this); break;
1696+
default:
1697+
llvm_unreachable("Unsupported action for TCE target.");
1698+
}
1699+
}
1700+
return *T;
1701+
}
1702+
1703+
bool Emscripten::HasNativeLLVMSupport() const {
1704+
return false;
1705+
}
1706+
1707+
bool Emscripten::IsUnwindTablesDefault() const {
1708+
return false;
1709+
}
1710+
1711+
const char *Emscripten::GetDefaultRelocationModel() const {
1712+
return "static";
1713+
}
1714+
1715+
const char *Emscripten::GetForcedPicModel() const {
1716+
return 0;
1717+
}
1718+
1719+
bool Emscripten::SupportsProfiling() const {
1720+
return false;
1721+
}
1722+
1723+
bool Emscripten::hasBlocksRuntime() const {
1724+
return false;
1725+
}
1726+
1727+
void Emscripten::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
1728+
ArgStringList &CC1Args) const {
1729+
std::string EmscriptenRoot;
1730+
// TODO: Get EmscriptenRoot somehow
1731+
1732+
const StringRef EmscriptenIncludeDirs[] = {
1733+
"/system/include",
1734+
"/system/include/emscripten",
1735+
"/system/include/bsd",
1736+
"/system/include/libc",
1737+
"/system/include/libcxx",
1738+
"/system/include/gfx",
1739+
"/system/include/net",
1740+
"/system/include/SDL"
1741+
};
1742+
ArrayRef<StringRef> IncludeDirs = EmscriptenIncludeDirs;
1743+
for (ArrayRef<StringRef>::iterator I = IncludeDirs.begin(),
1744+
E = IncludeDirs.end();
1745+
I != E; ++I) {
1746+
addSystemInclude(DriverArgs, CC1Args, EmscriptenRoot + *I);
1747+
}
1748+
}
1749+
16841750
/// AuroraUX - AuroraUX tool chain which can call as(1) and ld(1) directly.
16851751

16861752
AuroraUX::AuroraUX(const Driver &D, const llvm::Triple& Triple,

lib/Driver/ToolChains.h

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -538,6 +538,27 @@ class LLVM_LIBRARY_VISIBILITY Linux : public Generic_ELF {
538538
ArgStringList &CC1Args);
539539
};
540540

541+
class LLVM_LIBRARY_VISIBILITY Emscripten : public ToolChain {
542+
public:
543+
Emscripten(const Driver &D, const llvm::Triple &Triple)
544+
: ToolChain(D, Triple) {
545+
}
546+
547+
virtual Tool &SelectTool(const Compilation &C, const JobAction &JA,
548+
const ActionList &Inputs) const;
549+
virtual bool HasNativeLLVMSupport() const;
550+
virtual bool IsUnwindTablesDefault() const;
551+
virtual const char *GetDefaultRelocationModel() const;
552+
virtual const char *GetForcedPicModel() const;
553+
virtual bool SupportsProfiling() const;
554+
virtual bool hasBlocksRuntime() const;
555+
virtual void AddClangSystemIncludeArgs(const ArgList &DriverArgs,
556+
ArgStringList &CC1Args) const;
557+
558+
private:
559+
mutable llvm::DenseMap<unsigned, Tool*> Tools;
560+
};
561+
541562

542563
/// TCEToolChain - A tool chain using the llvm bitcode tools to perform
543564
/// all subcommands. See http://tce.cs.tut.fi for our peculiar target.

lib/Frontend/InitHeaderSearch.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -369,6 +369,7 @@ AddDefaultCPlusPlusIncludePaths(const llvm::Triple &triple, const HeaderSearchOp
369369
}
370370

371371
switch (os) {
372+
case llvm::Triple::Emscripten:
372373
case llvm::Triple::Linux:
373374
case llvm::Triple::Win32:
374375
llvm_unreachable("Include management is handled in the driver.");

0 commit comments

Comments
 (0)