LLVM 7.0 dEQP fixes
dEQP using SwiftShader with LLVM 7.0 has a number of failures. Most
of them were cause either by using unsafe floating point math or by
a "__chkstk not found" error.
Change-Id: I16f14b3aee6f24717ec90ce2ea5bae8b4439620a
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 04c9ab8..d50c9ff 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -255,6 +255,7 @@
if(WIN32)
add_definitions(-DWINVER=0x501 -DNOMINMAX -DSTRICT)
+ set_cpp_flag("-DDEBUGGER_WAIT_DIALOG" DEBUG)
set(CMAKE_FIND_LIBRARY_PREFIXES ${CMAKE_FIND_LIBRARY_PREFIXES} "" "lib")
endif()
diff --git a/src/Reactor/LLVMReactor.cpp b/src/Reactor/LLVMReactor.cpp
index ba4aeb9..2164ec1 100644
--- a/src/Reactor/LLVMReactor.cpp
+++ b/src/Reactor/LLVMReactor.cpp
@@ -550,10 +550,7 @@
llvm::JITSymbol symbol = compileLayer.findSymbolIn(moduleKey, name, false);
llvm::Expected<llvm::JITTargetAddress> expectAddr = symbol.getAddress();
- if (!expectAddr)
- {
- return nullptr;
- }
+ assert(expectAddr);
void *addr = reinterpret_cast<void *>(static_cast<intptr_t>(expectAddr.get()));
return new LLVMRoutine(addr, releaseRoutineCallback, this, moduleKey);
@@ -767,7 +764,7 @@
// llvm::NoNaNsFPMath = true;
#else
llvm::TargetOptions targetOpts;
- targetOpts.UnsafeFPMath = true;
+ targetOpts.UnsafeFPMath = false;
// targetOpts.NoInfsFPMath = true;
// targetOpts.NoNaNsFPMath = true;
#endif
@@ -920,6 +917,11 @@
::function->setCallingConv(llvm::CallingConv::C);
::builder->SetInsertPoint(llvm::BasicBlock::Create(*::context, "", ::function));
+
+#if SWIFTSHADER_LLVM_VERSION >= 7
+ // This fixes the "__chkstk not found" error
+ ::function->addFnAttr("stack-probe-size", "1048576");
+#endif
}
Value *Nucleus::getArgument(unsigned int index)
diff --git a/src/Reactor/Routine.cpp b/src/Reactor/Routine.cpp
index df82ab8..0dbaab2 100644
--- a/src/Reactor/Routine.cpp
+++ b/src/Reactor/Routine.cpp
@@ -14,25 +14,22 @@
#include "Routine.hpp"
-#include "../Common/Thread.hpp"
-
#include <cassert>
namespace sw
{
- Routine::Routine()
+ Routine::Routine() : bindCount(0)
{
- bindCount = 0;
}
void Routine::bind()
{
- atomicIncrement(&bindCount);
+ ++bindCount;
}
void Routine::unbind()
{
- long count = atomicDecrement(&bindCount);
+ int count = bindCount--;
if(count == 0)
{
diff --git a/src/Reactor/Routine.hpp b/src/Reactor/Routine.hpp
index b3ad7f5..d8c745c 100644
--- a/src/Reactor/Routine.hpp
+++ b/src/Reactor/Routine.hpp
@@ -15,6 +15,8 @@
#ifndef sw_Routine_hpp
#define sw_Routine_hpp
+#include "../Common/Thread.hpp"
+
namespace sw
{
class Routine
@@ -31,7 +33,7 @@
void unbind();
private:
- volatile int bindCount;
+ AtomicInt bindCount;
};
}