| Index: ports/pnacl-llvm-src/nacl.patch
|
| diff --git a/ports/pnacl-llvm-src/nacl.patch b/ports/pnacl-llvm-src/nacl.patch
|
| index d06f6f056aae4fb08e142815a1f47df08065be95..a121418459cae40c4cbacb22392e42850fa3c8d1 100644
|
| --- a/ports/pnacl-llvm-src/nacl.patch
|
| +++ b/ports/pnacl-llvm-src/nacl.patch
|
| @@ -1,12 +1,410 @@
|
| +diff --git a/Makefile.rules b/Makefile.rules
|
| +--- a/Makefile.rules
|
| ++++ b/Makefile.rules
|
| +@@ -1200,6 +1200,7 @@ ifdef EXPORTED_SYMBOL_FILE
|
| + $(LibName.SO): $(NativeExportsFile)
|
| + endif
|
| +
|
| ++ifeq ($(ENABLE_SHARED),1)
|
| + ifdef LINK_LIBS_IN_SHARED
|
| + ifdef LOADABLE_MODULE
|
| + SharedLibKindMessage := "Loadable Module"
|
| +@@ -1217,6 +1218,7 @@ $(LibName.SO): $(ObjectsO) $(SharedLibDir)/.dir
|
| + $(Echo) Linking $(BuildMode) Shared Library $(notdir $@)
|
| + $(Verb) $(Link) $(SharedLinkOptions) -o $@ $(ObjectsO)
|
| + endif
|
| ++endif
|
| +
|
| + clean-local::
|
| + ifneq ($(strip $(LibName.SO)),)
|
| +@@ -1239,6 +1241,7 @@ endif
|
| + DestSharedLib := $(DestSharedLibDir)/$(BaseLibName.SO)
|
| + DestSharedAlias := $(DestSharedLibDir)/$(BaseAliasName.SO)
|
| +
|
| ++ifeq ($(ENABLE_SHARED),1)
|
| + install-local:: $(DestSharedLib)
|
| +
|
| + $(DestSharedLib): $(LibName.SO) $(DestSharedLibDir)
|
| +@@ -1257,6 +1260,7 @@ ifdef SHARED_ALIAS
|
| + endif
|
| + endif
|
| + endif
|
| ++endif
|
| +
|
| + #---------------------------------------------------------
|
| + # Library Targets:
|
| +@@ -1265,9 +1269,13 @@ endif
|
| + #---------------------------------------------------------
|
| + ifndef NO_BUILD_ARCHIVE
|
| + ifndef BUILD_ARCHIVE
|
| ++ifeq ($(ENABLE_SHARED),1)
|
| + ifndef LOADABLE_MODULE
|
| + BUILD_ARCHIVE = 1
|
| + endif
|
| ++else
|
| ++BUILD_ARCHIVE = 1
|
| ++endif
|
| + endif
|
| + endif
|
| +
|
| +diff --git a/include/llvm/Support/TargetRegistry.h b/include/llvm/Support/TargetRegistry.h
|
| +--- a/include/llvm/Support/TargetRegistry.h
|
| ++++ b/include/llvm/Support/TargetRegistry.h
|
| +@@ -814,7 +814,7 @@ namespace llvm {
|
| + // @LOCALMOD-BEGIN
|
| + // Prune out the .s printer for the sandboxed translator,
|
| + // by preventing an InstPrinter from being used at all.
|
| +- #if !defined(__native_client__)
|
| ++ #if !defined(PNACL_BROWSER_TRANSLATOR)
|
| + T.MCInstPrinterCtorFn = Fn;
|
| + #endif
|
| + // @LOCALMOD-END
|
| +diff --git a/lib/ExecutionEngine/RuntimeDyld/RTDyldMemoryManager.cpp b/lib/ExecutionEngine/RuntimeDyld/RTDyldMemoryManager.cpp
|
| +--- a/lib/ExecutionEngine/RuntimeDyld/RTDyldMemoryManager.cpp
|
| ++++ b/lib/ExecutionEngine/RuntimeDyld/RTDyldMemoryManager.cpp
|
| +@@ -34,7 +34,8 @@ RTDyldMemoryManager::~RTDyldMemoryManager() {}
|
| +
|
| + // Determine whether we can register EH tables.
|
| + #if (defined(__GNUC__) && !defined(__ARM_EABI__) && !defined(__ia64__) && \
|
| +- !defined(__SEH__) && !defined(__USING_SJLJ_EXCEPTIONS__))
|
| ++ !defined(__SEH__) && !defined(__USING_SJLJ_EXCEPTIONS__) && \
|
| ++ !defined(__pnacl__))
|
| + #define HAVE_EHTABLE_SUPPORT 1
|
| + #else
|
| + #define HAVE_EHTABLE_SUPPORT 0
|
| diff --git a/lib/Support/Host.cpp b/lib/Support/Host.cpp
|
| --- a/lib/Support/Host.cpp
|
| +++ b/lib/Support/Host.cpp
|
| -@@ -168,7 +168,7 @@ static bool GetX86CpuIDAndInfoEx(unsigned value, unsigned subleaf,
|
| +@@ -183,7 +183,7 @@ static bool GetX86CpuIDAndInfoEx(unsigned value, unsigned subleaf,
|
| }
|
|
|
| - static bool OSHasAVXSupport() {
|
| + static bool GetX86XCR0(unsigned *rEAX, unsigned *rEDX) {
|
| -#if defined(__GNUC__)
|
| +#if defined(__GNUC__) && !defined(__native_client__)
|
| // Check xgetbv; this uses a .byte sequence instead of the instruction
|
| // directly because older assemblers do not include support for xgetbv and
|
| // there is no easy way to conditionally compile based on the assembler used.
|
| +diff --git a/lib/Support/Unix/Path.inc b/lib/Support/Unix/Path.inc
|
| +--- a/lib/Support/Unix/Path.inc
|
| ++++ b/lib/Support/Unix/Path.inc
|
| +@@ -67,7 +67,8 @@ namespace sys {
|
| + namespace fs {
|
| + #if defined(__FreeBSD__) || defined (__NetBSD__) || defined(__Bitrig__) || \
|
| + defined(__OpenBSD__) || defined(__minix) || defined(__FreeBSD_kernel__) || \
|
| +- defined(__linux__) || defined(__CYGWIN__) || defined(__DragonFly__)
|
| ++ defined(__linux__) || defined(__CYGWIN__) || defined(__DragonFly__) || \
|
| ++ defined(__native_client__)
|
| + static int
|
| + test_dir(char ret[PATH_MAX], const char *dir, const char *bin)
|
| + {
|
| +@@ -171,6 +172,11 @@ std::string getMainExecutable(const char *argv0, void *MainAddr) {
|
| + // @LOCALMOD-BEGIN
|
| + #elif defined(__native_client__)
|
| + // Nothing.
|
| ++#if !defined(PNACL_BROWSER_TRANSLATOR)
|
| ++ char exe_path[MAXPATHLEN];
|
| ++ if (getprogpath(exe_path, argv0) != NULL)
|
| ++ return exe_path;
|
| ++#endif
|
| + // @LOCALMOD-END
|
| + #else
|
| + #error GetMainExecutable is not implemented on this host yet.
|
| +@@ -192,13 +198,13 @@ std::error_code current_path(SmallVectorImpl<char> &result) {
|
| + result.clear();
|
| + // @LOCALMOD-START NaCl doesn't have paths, and the translator returns an
|
| + // error for getcwd below. Return a dummy path instead.
|
| +-#if defined(__native_client__)
|
| ++#if defined(PNACL_BROWSER_TRANSLATOR)
|
| + result.reserve(2);
|
| + result.set_size(2);
|
| + result[0] = '/';
|
| + result[1] = '\0';
|
| + return std::error_code();
|
| +-#else // !defined(__native_client__)
|
| ++#else // !defined(PNACL_BROWSER_TRANSLATOR)
|
| + // @LOCALMOD-END
|
| + const char *pwd = ::getenv("PWD");
|
| + llvm::sys::fs::file_status PWDStatus, DotStatus;
|
| +diff --git a/lib/Support/Unix/Process.inc b/lib/Support/Unix/Process.inc
|
| +--- a/lib/Support/Unix/Process.inc
|
| ++++ b/lib/Support/Unix/Process.inc
|
| +@@ -61,7 +61,9 @@ using namespace llvm;
|
| + using namespace sys;
|
| +
|
| + static std::pair<TimeValue, TimeValue> getRUsageTimes() {
|
| +-#if defined(HAVE_GETRUSAGE)
|
| ++// @LOCALMOD-BEGIN
|
| ++#if defined(HAVE_GETRUSAGE) && !defined(__native_client__)
|
| ++// @LOCALMOD-END
|
| + struct rusage RU;
|
| + ::getrusage(RUSAGE_SELF, &RU);
|
| + return std::make_pair(
|
| +diff --git a/lib/Support/Unix/Program.inc b/lib/Support/Unix/Program.inc
|
| +--- a/lib/Support/Unix/Program.inc
|
| ++++ b/lib/Support/Unix/Program.inc
|
| +@@ -16,6 +16,11 @@
|
| + //=== is guaranteed to work on *all* UNIX variants.
|
| + //===----------------------------------------------------------------------===//
|
| +
|
| ++// @LOCALMOD-BEGIN
|
| ++#if defined(__native_client__) && !defined(PNACL_BROWSER_TRANSLATOR)
|
| ++#include <spawn.h>
|
| ++#endif
|
| ++// @LOCALMOD-END
|
| + #include "Unix.h"
|
| + #include "llvm/ADT/StringExtras.h"
|
| + #include "llvm/Config/config.h"
|
| +@@ -187,6 +192,15 @@ static bool Execute(ProcessInfo &PI, StringRef Program, const char **args,
|
| + return false;
|
| + }
|
| +
|
| ++// @LOCALMOD-BEGIN
|
| ++#if defined(__native_client__) && !defined(PNACL_BROWSER_TRANSLATOR)
|
| ++ int child = spawnve(P_NOWAIT, Program.begin(), (char**) args, (char**) envp);
|
| ++ if (child < 0) {
|
| ++ MakeErrMsg(ErrMsg, "Couldn't spawn");
|
| ++ return false;
|
| ++ }
|
| ++#else
|
| ++// @LOCALMOD-END
|
| + // If this OS has posix_spawn and there is no memory limit being implied, use
|
| + // posix_spawn. It is more efficient than fork/exec.
|
| + #ifdef HAVE_POSIX_SPAWN
|
| +@@ -312,6 +326,7 @@ static bool Execute(ProcessInfo &PI, StringRef Program, const char **args,
|
| + default:
|
| + break;
|
| + }
|
| ++#endif
|
| +
|
| + PI.Pid = child;
|
| +
|
| +@@ -324,8 +339,10 @@ ProcessInfo sys::Wait(const ProcessInfo &PI, unsigned SecondsToWait,
|
| + bool WaitUntilTerminates, std::string *ErrMsg) {
|
| + // @LOCALMOD-BEGIN
|
| + #if defined(HAVE_SYS_WAIT_H) && !defined(PNACL_BROWSER_TRANSLATOR)
|
| +- // @LOCALMOD-END
|
| ++#if !defined(__native_client__)
|
| + struct sigaction Act, Old;
|
| ++#endif
|
| ++ // @LOCALMOD-END
|
| + assert(PI.Pid && "invalid pid to wait on, process not started?");
|
| +
|
| + int WaitPidOptions = 0;
|
| +@@ -333,6 +350,9 @@ ProcessInfo sys::Wait(const ProcessInfo &PI, unsigned SecondsToWait,
|
| + if (WaitUntilTerminates) {
|
| + SecondsToWait = 0;
|
| + } else if (SecondsToWait) {
|
| ++// @LOCALMOD-BEGIN
|
| ++#if !defined(__native_client__)
|
| ++// @LOCALMOD-END
|
| + // Install a timeout handler. The handler itself does nothing, but the
|
| + // simple fact of having a handler at all causes the wait below to return
|
| + // with EINTR, unlike if we used SIG_IGN.
|
| +@@ -341,6 +361,9 @@ ProcessInfo sys::Wait(const ProcessInfo &PI, unsigned SecondsToWait,
|
| + sigemptyset(&Act.sa_mask);
|
| + sigaction(SIGALRM, &Act, &Old);
|
| + alarm(SecondsToWait);
|
| ++// @LOCALMOD-BEGIN
|
| ++#endif
|
| ++// @LOCALMOD-END
|
| + } else if (SecondsToWait == 0)
|
| + WaitPidOptions = WNOHANG;
|
| +
|
| +@@ -358,12 +381,18 @@ ProcessInfo sys::Wait(const ProcessInfo &PI, unsigned SecondsToWait,
|
| + return WaitResult;
|
| + } else {
|
| + if (SecondsToWait && errno == EINTR) {
|
| ++// @LOCALMOD-BEGIN
|
| ++#if !defined(__native_client__)
|
| ++// @LOCALMOD-END
|
| + // Kill the child.
|
| + kill(PI.Pid, SIGKILL);
|
| +
|
| + // Turn off the alarm and restore the signal handler
|
| + alarm(0);
|
| + sigaction(SIGALRM, &Old, nullptr);
|
| ++// @LOCALMOD-BEGIN
|
| ++#endif
|
| ++// @LOCALMOD-END
|
| +
|
| + // Wait for child to die
|
| + if (wait(&status) != ChildPid)
|
| +@@ -381,11 +410,17 @@ ProcessInfo sys::Wait(const ProcessInfo &PI, unsigned SecondsToWait,
|
| + }
|
| + }
|
| +
|
| ++// @LOCALMOD-BEGIN
|
| ++#if !defined(__native_client__)
|
| ++// @LOCALMOD-END
|
| + // We exited normally without timeout, so turn off the timer.
|
| + if (SecondsToWait && !WaitUntilTerminates) {
|
| + alarm(0);
|
| + sigaction(SIGALRM, &Old, nullptr);
|
| + }
|
| ++// @LOCALMOD-BEGIN
|
| ++#endif
|
| ++// @LOCALMOD-END
|
| +
|
| + // Return the proper exit status. Detect error conditions
|
| + // so we can return -1 for them and set ErrMsg informatively.
|
| +@@ -455,11 +490,13 @@ llvm::sys::writeFileWithEncoding(StringRef FileName, StringRef Contents,
|
| + }
|
| +
|
| + bool llvm::sys::argumentsFitWithinSystemLimits(ArrayRef<const char*> Args) {
|
| ++// @LOCALMOD-BEGIN
|
| + #if defined(__native_client__)
|
| + static long ArgMax = -1;
|
| + #else // !__native_client__
|
| + static long ArgMax = sysconf(_SC_ARG_MAX);
|
| + #endif // __native_client__
|
| ++// @LOCALMOD-END
|
| +
|
| + // System says no practical limit.
|
| + if (ArgMax == -1)
|
| +diff --git a/lib/Support/Unix/Signals.inc b/lib/Support/Unix/Signals.inc
|
| +--- a/lib/Support/Unix/Signals.inc
|
| ++++ b/lib/Support/Unix/Signals.inc
|
| +@@ -50,7 +50,9 @@
|
| +
|
| + using namespace llvm;
|
| +
|
| ++#if !defined(__native_client__)
|
| + static RETSIGTYPE SignalHandler(int Sig); // defined below.
|
| ++#endif
|
| +
|
| + static ManagedStatic<SmartMutex<true> > SignalsMutex;
|
| +
|
| +@@ -121,15 +123,15 @@ static void RegisterHandlers() {
|
| + for (auto S : KillSigs) RegisterHandler(S);
|
| + }
|
| +
|
| +-static void UnregisterHandlers() {
|
| + #if !defined(__native_client__)
|
| ++static void UnregisterHandlers() {
|
| + // Restore all of the signal handlers to how they were before we showed up.
|
| + for (unsigned i = 0, e = NumRegisteredSignals; i != e; ++i)
|
| + sigaction(RegisteredSignalInfo[i].SigNo,
|
| + &RegisteredSignalInfo[i].SA, nullptr);
|
| + NumRegisteredSignals = 0;
|
| +-#endif // (__native_client__)
|
| + }
|
| ++#endif // (__native_client__)
|
| +
|
| +
|
| + /// RemoveFilesToRemove - Process the FilesToRemove list. This function
|
| +@@ -164,6 +166,7 @@ static void RemoveFilesToRemove() {
|
| + }
|
| + }
|
| +
|
| ++#if !defined(__native_client__)
|
| + // SignalHandler - The signal handler that runs.
|
| + static RETSIGTYPE SignalHandler(int Sig) {
|
| + // Restore the signal behavior to default, so that the program actually
|
| +@@ -172,12 +175,10 @@ static RETSIGTYPE SignalHandler(int Sig) {
|
| + // instead of recursing in the signal handler.
|
| + UnregisterHandlers();
|
| +
|
| +-#if !defined(__native_client__)
|
| + // Unmask all potentially blocked kill signals.
|
| + sigset_t SigMask;
|
| + sigfillset(&SigMask);
|
| + sigprocmask(SIG_UNBLOCK, &SigMask, nullptr);
|
| +-#endif
|
| +
|
| + {
|
| + unique_lock<SmartMutex<true>> Guard(*SignalsMutex);
|
| +@@ -214,6 +215,7 @@ static RETSIGTYPE SignalHandler(int Sig) {
|
| + raise(Sig);
|
| + #endif
|
| + }
|
| ++#endif
|
| +
|
| + void llvm::sys::RunInterruptHandlers() {
|
| + sys::SmartScopedLock<true> Guard(*SignalsMutex);
|
| +diff --git a/tools/gold/gold-plugin.cpp b/tools/gold/gold-plugin.cpp
|
| +--- a/tools/gold/gold-plugin.cpp
|
| ++++ b/tools/gold/gold-plugin.cpp
|
| +@@ -154,14 +154,20 @@ static ld_plugin_status claim_file_hook(const ld_plugin_input_file *file,
|
| + static ld_plugin_status all_symbols_read_hook(void);
|
| + static ld_plugin_status cleanup_hook(void);
|
| +
|
| ++// @LOCALMOD-BEGIN
|
| ++#if defined(__native_client__)
|
| ++extern "C" ld_plugin_status LLVMgold_onload(ld_plugin_tv *tv);
|
| ++ld_plugin_status LLVMgold_onload(ld_plugin_tv *tv) {
|
| ++#else
|
| + extern "C" ld_plugin_status onload(ld_plugin_tv *tv);
|
| + ld_plugin_status onload(ld_plugin_tv *tv) {
|
| ++#endif
|
| ++// @LOCALMOD-END
|
| + InitializeAllTargetInfos();
|
| + InitializeAllTargets();
|
| + InitializeAllTargetMCs();
|
| + InitializeAllAsmParsers();
|
| + InitializeAllAsmPrinters();
|
| +-
|
| + // We're given a pointer to the first transfer vector. We read through them
|
| + // until we find one where tv_tag == LDPT_NULL. The REGISTER_* tagged values
|
| + // contain pointers to functions that we need to call to register our own
|
| +diff --git a/tools/lli/lli.cpp b/tools/lli/lli.cpp
|
| +--- a/tools/lli/lli.cpp
|
| ++++ b/tools/lli/lli.cpp
|
| +@@ -386,7 +386,15 @@ static void addCygMingExtraModule(ExecutionEngine *EE,
|
| + //===----------------------------------------------------------------------===//
|
| + // main Driver function
|
| + //
|
| ++// @LOCALMOD-BEGIN
|
| ++#if defined(__native_client__)
|
| ++extern char **environ;
|
| ++int main(int argc, char **argv) {
|
| ++ char * const *envp = environ;
|
| ++#else
|
| + int main(int argc, char **argv, char * const *envp) {
|
| ++#endif
|
| ++// @LOCALMOD-END
|
| + sys::PrintStackTraceOnErrorSignal();
|
| + PrettyStackTraceProgram X(argc, argv);
|
| +
|
| +diff --git a/unittests/Bitcode/NaClMungeWriteErrorTests.cpp b/unittests/Bitcode/NaClMungeWriteErrorTests.cpp
|
| +--- a/unittests/Bitcode/NaClMungeWriteErrorTests.cpp
|
| ++++ b/unittests/Bitcode/NaClMungeWriteErrorTests.cpp
|
| +@@ -180,6 +180,7 @@ TEST(NaClMungeWriteErrorTests, CantWriteBadAbbrevIndex) {
|
| + ExpectedDumpedBitcode);
|
| + }
|
| +
|
| ++#ifdef GTEST_HAS_DEATH_TEST
|
| + // Show that writing out an illegal abbreviation index, causes the
|
| + // parser to fail.
|
| + TEST(MyNaClMungerWriteErrorTests, DieOnWriteBadAbbreviationIndex) {
|
| +@@ -199,6 +200,7 @@ TEST(MyNaClMungerWriteErrorTests, DieOnWriteBadAbbreviationIndex) {
|
| + "LLVM ERROR\\: Unable to continue"
|
| + ".*");
|
| + }
|
| ++#endif
|
| +
|
| + // Show what happens when we use more local abbreviations than specified in the
|
| + // corresponding enclosing block.
|
| +diff --git a/unittests/Makefile b/unittests/Makefile
|
| +--- a/unittests/Makefile
|
| ++++ b/unittests/Makefile
|
| +@@ -7,6 +7,14 @@
|
| + #
|
| + ##===----------------------------------------------------------------------===##
|
| +
|
| ++ifeq ($(HOST_OS),NativeClient)
|
| ++all:
|
| ++ echo skipping
|
| ++
|
| ++install:
|
| ++ echo skipping
|
| ++else
|
| ++
|
| + LEVEL = ..
|
| +
|
| + PARALLEL_DIRS = ADT Analysis Bitcode CodeGen DebugInfo ExecutionEngine IR \
|
| +@@ -17,3 +25,5 @@ include $(LLVM_SRC_ROOT)/unittests/Makefile.unittest
|
| +
|
| + clean::
|
| + $(Verb) $(RM) -f *Tests
|
| ++
|
| ++endif
|
|
|