llvm.patch 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367
  1. From aa970bcfa33cf9e88647e8268c4a18f7670c8d75 Mon Sep 17 00:00:00 2001
  2. From: =?UTF-8?q?Ludger=20Kr=C3=A4mer?= <dbluelle@onlinehome.de>
  3. Date: Mon, 17 Sep 2018 18:57:48 +0200
  4. Subject: [PATCH] make llvm dependency optional (disabled by default)
  5. ---
  6. CMakeLists.txt | 82 ++++++++++++++++-------------
  7. README | 5 +-
  8. src/main.cpp | 5 +-
  9. src/scripting/abc.cpp | 6 +++
  10. src/scripting/abc.h | 21 ++++++--
  11. src/scripting/abc_codesynt.cpp | 3 ++
  12. src/scripting/toplevel/toplevel.cpp | 2 +
  13. 7 files changed, 82 insertions(+), 42 deletions(-)
  14. diff --git a/CMakeLists.txt b/CMakeLists.txt
  15. index b76e228fe..6fc6d174e 100644
  16. --- a/CMakeLists.txt
  17. +++ b/CMakeLists.txt
  18. @@ -194,6 +194,7 @@ SET(ENABLE_CURL TRUE CACHE BOOL "Enable CURL? (Required for Downloader functiona
  19. SET(ENABLE_GLES2 FALSE CACHE BOOL "Build with OpenGLES 2.0 support instead of OpenGL")
  20. SET(ENABLE_LIBAVCODEC TRUE CACHE BOOL "Enable libavcodec and dependent functionality?")
  21. SET(ENABLE_RTMP TRUE CACHE BOOL "Enable librtmp and dependent functionality?")
  22. +SET(ENABLE_LLVM FALSE CACHE BOOL "Enable support for llvm based jit execution (currently broken)")
  23. SET(ENABLE_PROFILING FALSE CACHE BOOL "Enable profiling support? (Causes performance issues)")
  24. SET(ENABLE_MEMORY_USAGE_PROFILING FALSE CACHE BOOL "Enable profiling of memory usage? (Causes performance issues)")
  25. SET(PLUGIN_DIRECTORY "${LIBDIR}/mozilla/plugins" CACHE STRING "Directory to install Firefox plugin to")
  26. @@ -217,40 +218,45 @@ SET(CMAKE_INSTALL_RPATH "${PRIVATELIBDIR}")
  27. # Libraries we need
  28. INCLUDE(FindPkgConfig REQUIRED)
  29. INCLUDE(FindGettext REQUIRED)
  30. -INCLUDE(FindLLVM REQUIRED)
  31. -IF(${LLVM_STRING_VERSION} VERSION_LESS 2.8)
  32. - MESSAGE(FATAL_ERROR "LLVM >=2.8 is required!")
  33. -ENDIF(${LLVM_STRING_VERSION} VERSION_LESS 2.8)
  34. -IF(${LLVM_STRING_VERSION} VERSION_EQUAL 2.9)
  35. - MESSAGE(FATAL_ERROR "LLVM !=2.9 is required!")
  36. -ENDIF(${LLVM_STRING_VERSION} VERSION_EQUAL 2.9)
  37. -IF(${LLVM_STRING_VERSION} VERSION_EQUAL 2.8)
  38. - ADD_DEFINITIONS(-DLLVM_28)
  39. -ENDIF(${LLVM_STRING_VERSION} VERSION_EQUAL 2.8)
  40. -IF(${LLVM_STRING_VERSION} VERSION_EQUAL 3.0)
  41. - ADD_DEFINITIONS(-DLLVM_30)
  42. -ENDIF(${LLVM_STRING_VERSION} VERSION_EQUAL 3.0)
  43. -IF(${LLVM_STRING_VERSION} VERSION_GREATER 3.0)
  44. - ADD_DEFINITIONS(-DLLVM_31)
  45. -ENDIF(${LLVM_STRING_VERSION} VERSION_GREATER 3.0)
  46. -IF(${LLVM_STRING_VERSION} VERSION_GREATER 3.3)
  47. - ADD_DEFINITIONS(-DLLVM_34)
  48. -ENDIF(${LLVM_STRING_VERSION} VERSION_GREATER 3.3)
  49. -IF(${LLVM_STRING_VERSION} VERSION_GREATER 3.4)
  50. - ADD_DEFINITIONS(-DLLVM_35)
  51. -ENDIF(${LLVM_STRING_VERSION} VERSION_GREATER 3.4)
  52. -IF(NOT (${LLVM_STRING_VERSION} VERSION_LESS 3.6))
  53. - ADD_DEFINITIONS(-DLLVM_36)
  54. -ENDIF(NOT (${LLVM_STRING_VERSION} VERSION_LESS 3.6))
  55. -IF(NOT ${LLVM_STRING_VERSION} VERSION_LESS 3.7)
  56. - ADD_DEFINITIONS(-DLLVM_37)
  57. -ENDIF(NOT ${LLVM_STRING_VERSION} VERSION_LESS 3.7)
  58. -IF(NOT ${LLVM_STRING_VERSION} VERSION_LESS 3.8)
  59. - ADD_DEFINITIONS(-DLLVM_38)
  60. -ENDIF(NOT ${LLVM_STRING_VERSION} VERSION_LESS 3.8)
  61. -IF(NOT ${LLVM_STRING_VERSION} VERSION_LESS 5.0)
  62. - ADD_DEFINITIONS(-DLLVM_50)
  63. -ENDIF(NOT ${LLVM_STRING_VERSION} VERSION_LESS 5.0)
  64. +
  65. +IF (ENABLE_LLVM)
  66. + ADD_DEFINITIONS(-DLLVM_ENABLED)
  67. + INCLUDE(FindLLVM REQUIRED)
  68. + IF(${LLVM_STRING_VERSION} VERSION_LESS 2.8)
  69. + MESSAGE(FATAL_ERROR "LLVM >=2.8 is required!")
  70. + ENDIF(${LLVM_STRING_VERSION} VERSION_LESS 2.8)
  71. + IF(${LLVM_STRING_VERSION} VERSION_EQUAL 2.9)
  72. + MESSAGE(FATAL_ERROR "LLVM !=2.9 is required!")
  73. + ENDIF(${LLVM_STRING_VERSION} VERSION_EQUAL 2.9)
  74. + IF(${LLVM_STRING_VERSION} VERSION_EQUAL 2.8)
  75. + ADD_DEFINITIONS(-DLLVM_28)
  76. + ENDIF(${LLVM_STRING_VERSION} VERSION_EQUAL 2.8)
  77. + IF(${LLVM_STRING_VERSION} VERSION_EQUAL 3.0)
  78. + ADD_DEFINITIONS(-DLLVM_30)
  79. + ENDIF(${LLVM_STRING_VERSION} VERSION_EQUAL 3.0)
  80. + IF(${LLVM_STRING_VERSION} VERSION_GREATER 3.0)
  81. + ADD_DEFINITIONS(-DLLVM_31)
  82. + ENDIF(${LLVM_STRING_VERSION} VERSION_GREATER 3.0)
  83. + IF(${LLVM_STRING_VERSION} VERSION_GREATER 3.3)
  84. + ADD_DEFINITIONS(-DLLVM_34)
  85. + ENDIF(${LLVM_STRING_VERSION} VERSION_GREATER 3.3)
  86. + IF(${LLVM_STRING_VERSION} VERSION_GREATER 3.4)
  87. + ADD_DEFINITIONS(-DLLVM_35)
  88. + ENDIF(${LLVM_STRING_VERSION} VERSION_GREATER 3.4)
  89. + IF(NOT (${LLVM_STRING_VERSION} VERSION_LESS 3.6))
  90. + ADD_DEFINITIONS(-DLLVM_36)
  91. + ENDIF(NOT (${LLVM_STRING_VERSION} VERSION_LESS 3.6))
  92. + IF(NOT ${LLVM_STRING_VERSION} VERSION_LESS 3.7)
  93. + ADD_DEFINITIONS(-DLLVM_37)
  94. + ENDIF(NOT ${LLVM_STRING_VERSION} VERSION_LESS 3.7)
  95. + IF(NOT ${LLVM_STRING_VERSION} VERSION_LESS 3.8)
  96. + ADD_DEFINITIONS(-DLLVM_38)
  97. + ENDIF(NOT ${LLVM_STRING_VERSION} VERSION_LESS 3.8)
  98. + IF(NOT ${LLVM_STRING_VERSION} VERSION_LESS 5.0)
  99. + ADD_DEFINITIONS(-DLLVM_50)
  100. + ENDIF(NOT ${LLVM_STRING_VERSION} VERSION_LESS 5.0)
  101. +ENDIF(ENABLE_LLVM)
  102. +
  103. INCLUDE(FindZLIB REQUIRED)
  104. INCLUDE(FindFreetype REQUIRED)
  105. IF(NOT(ENABLE_GLES2))
  106. @@ -405,7 +411,9 @@ IF(GTHREAD_FOUND AND (GTHREAD_VERSION VERSION_LESS 2.32.0))
  107. ADD_DEFINITIONS(-DHAVE_G_THREAD_INIT)
  108. ENDIF(GTHREAD_FOUND AND (GTHREAD_VERSION VERSION_LESS 2.32.0))
  109. -INCLUDE_DIRECTORIES(${LLVM_INCLUDE_DIR})
  110. +IF (ENABLE_LLVM)
  111. + INCLUDE_DIRECTORIES(${LLVM_INCLUDE_DIR})
  112. +ENDIF(ENABLE_LLVM)
  113. INCLUDE_DIRECTORIES(${ZLIB_INCLUDE_DIR})
  114. INCLUDE_DIRECTORIES(${FREETYPE_INCLUDE_DIRS})
  115. IF(ENABLE_GLES2)
  116. @@ -445,7 +453,9 @@ IF(CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
  117. SET(CMAKE_SHARED_LINKER_FLAGS_RELEASE "-s")
  118. ENDIF(CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
  119. -LINK_DIRECTORIES(${LLVM_LIB_DIR})
  120. +IF(ENABLE_LLVM)
  121. + LINK_DIRECTORIES(${LLVM_LIB_DIR})
  122. +ENDIF(ENABLE_LLVM)
  123. IF(ENABLE_CURL)
  124. pkg_check_modules(CURL REQUIRED libcurl)
  125. diff --git a/README b/README
  126. index 231d54b7b..0d693e98d 100644
  127. --- a/README
  128. +++ b/README
  129. @@ -10,10 +10,13 @@ INSTALLATION
  130. ============
  131. To compile this software you need to install development packages for
  132. -llvm (version 2.8 or >= 3.0), opengl, curl, zlib, libavcodec, libavresample
  133. +opengl, curl, zlib, libavcodec, libavresample
  134. libglew, pcre, librtmp, cairo, libboost-filesystem,
  135. sdl2, sdl2_mixer, libjpeg, libavformat, pango, liblzma
  136. +If jit compilation using llvm is enabled(disabled by default),
  137. +you also need the development packages for llvm (version 2.8 or >= 3.0)
  138. +
  139. If compiling the PPAPI (Chromium) plugin is enabled (on by default), keep in mind that
  140. it will replace the adobe flash plugin, as only one flash plugin is allowed in chromium.
  141. diff --git a/src/main.cpp b/src/main.cpp
  142. index cb3c7573b..4de0e748e 100644
  143. --- a/src/main.cpp
  144. +++ b/src/main.cpp
  145. @@ -342,7 +342,10 @@ int main(int argc, char* argv[])
  146. if(fileName==NULL)
  147. {
  148. LOG(LOG_ERROR, "Usage: " << argv[0] << " [--url|-u http://loader.url/file.swf]" <<
  149. - " [--disable-interpreter|-ni] [--enable-fast-interpreter|-fi] [--enable-jit|-j]" <<
  150. + " [--disable-interpreter|-ni] [--enable-fast-interpreter|-fi]" <<
  151. +#ifdef LLVM_ENABLED
  152. + " [--enable-jit|-j]" <<
  153. +#endif
  154. " [--log-level|-l 0-4] [--parameters-file|-p params-file] [--security-sandbox|-s sandbox]" <<
  155. " [--exit-on-error] [--HTTP-cookies cookie] [--air] [--avmplus] [--disable-rendering]" <<
  156. #ifdef PROFILING_SUPPORT
  157. diff --git a/src/scripting/abc.cpp b/src/scripting/abc.cpp
  158. index c99f89d6e..9e8d36fdc 100644
  159. --- a/src/scripting/abc.cpp
  160. +++ b/src/scripting/abc.cpp
  161. @@ -23,6 +23,7 @@
  162. #include "compat.h"
  163. +#ifdef LLVM_ENABLED
  164. #include <llvm/ExecutionEngine/ExecutionEngine.h>
  165. #ifndef LLVM_36
  166. #include <llvm/ExecutionEngine/JIT.h>
  167. @@ -60,6 +61,7 @@
  168. #ifdef HAVE_TRANSFORMS_SCALAR_GVN_H
  169. # include <llvm/Transforms/Scalar/GVN.h>
  170. #endif
  171. +#endif
  172. #include "logger.h"
  173. #include "swftypes.h"
  174. #include <sstream>
  175. @@ -1940,6 +1942,7 @@ void ABCVm::Run(ABCVm* th)
  176. #endif
  177. if(th->m_sys->useJit)
  178. {
  179. +#ifdef LLVM_ENABLED
  180. #ifdef LLVM_31
  181. llvm::TargetOptions Opts;
  182. #ifndef LLVM_34
  183. @@ -2006,6 +2009,7 @@ void ABCVm::Run(ABCVm* th)
  184. th->FPM->add(llvm::createDeadStoreEliminationPass());
  185. th->registerFunctions();
  186. +#endif
  187. }
  188. th->registerClasses();
  189. @@ -2052,11 +2056,13 @@ void ABCVm::Run(ABCVm* th)
  190. snapshotCount++;
  191. #endif
  192. }
  193. +#ifdef LLVM_ENABLED
  194. if(th->m_sys->useJit)
  195. {
  196. th->ex->clearAllGlobalMappings();
  197. delete th->module;
  198. }
  199. +#endif
  200. #ifndef NDEBUG
  201. inStartupOrClose= true;
  202. #endif
  203. diff --git a/src/scripting/abc.h b/src/scripting/abc.h
  204. index 63bf51b05..467eccb5f 100644
  205. --- a/src/scripting/abc.h
  206. +++ b/src/scripting/abc.h
  207. @@ -34,6 +34,7 @@
  208. #include "scripting/flash/system/flashsystem.h"
  209. #include "scripting/toplevel/toplevel.h"
  210. +#ifdef LLVM_ENABLED
  211. namespace llvm {
  212. class ExecutionEngine;
  213. #ifdef LLVM_36
  214. @@ -50,9 +51,12 @@ namespace legacy {
  215. class Value;
  216. class LLVMContext;
  217. }
  218. +#endif // LLVM_ENABLED
  219. namespace lightspark
  220. {
  221. +
  222. +#ifdef LLVM_ENABLED
  223. struct block_info;
  224. #ifdef LLVM_28
  225. typedef const llvm::Type* LLVMTYPE;
  226. @@ -60,8 +64,6 @@ typedef const llvm::Type* LLVMTYPE;
  227. typedef llvm::Type* LLVMTYPE;
  228. #endif
  229. -bool isVmThread();
  230. -
  231. std::ostream& operator<<(std::ostream& o, const block_info& b);
  232. typedef std::pair<llvm::Value*, STACK_TYPE> stack_entry;
  233. @@ -69,6 +71,9 @@ inline stack_entry make_stack_entry(llvm::Value* v, STACK_TYPE t)
  234. {
  235. return std::make_pair(v, t);
  236. }
  237. +#endif
  238. +
  239. +bool isVmThread();
  240. class method_info
  241. {
  242. @@ -78,6 +83,7 @@ friend class SyntheticFunction;
  243. private:
  244. struct method_info_simple info;
  245. +#ifdef LLVM_ENABLED
  246. typedef std::vector<std::pair<int, STACK_TYPE> > static_stack_types_vector;
  247. //Helper function to sync only part of the static stack to the memory
  248. void consumeStackForRTMultiname(static_stack_types_vector& stack, int multinameIndex) const;
  249. @@ -92,7 +98,7 @@ friend class SyntheticFunction;
  250. struct BuilderWrapper;
  251. //Does analysis on function code to find optimization chances
  252. void doAnalysis(std::map<unsigned int,block_info>& blocks, BuilderWrapper& builderWrapper);
  253. -
  254. +#endif
  255. public:
  256. #ifdef PROFILING_SUPPORT
  257. std::map<method_info*,uint64_t> profCalls;
  258. @@ -104,7 +110,9 @@ friend class SyntheticFunction;
  259. SyntheticFunction::synt_function f;
  260. ABCContext* context;
  261. method_body_info* body;
  262. +#ifdef LLVM_ENABLED
  263. SyntheticFunction::synt_function synt_method(SystemState* sys);
  264. +#endif
  265. bool needsArgs() { return info.needsArgs(); }
  266. bool needsActivation() { return info.needsActivation(); }
  267. bool needsRest() { return info.needsRest(); }
  268. @@ -121,7 +129,9 @@ friend class SyntheticFunction;
  269. const Type* returnType;
  270. bool hasExplicitTypes;
  271. method_info():
  272. +#ifdef LLVM_ENABLED
  273. llvmf(NULL),
  274. +#endif
  275. #ifdef PROFILING_SUPPORT
  276. profTime(0),
  277. validProfName(false),
  278. @@ -469,6 +479,7 @@ friend class asAtom;
  279. static void constructFunction(asAtom & ret, call_context* th, asAtom& f, asAtom* args, int argslen);
  280. void parseRPCMessage(_R<ByteArray> message, _NR<ASObject> client, _NR<Responder> responder);
  281. +#ifdef LLVM_ENABLED
  282. //Opcode tables
  283. void register_table(LLVMTYPE ret_type,typed_opcode_handler* table, int table_len);
  284. static opcode_handler opcode_table_args_pointer_2int[];
  285. @@ -479,7 +490,7 @@ friend class asAtom;
  286. static typed_opcode_handler opcode_table_void[];
  287. static typed_opcode_handler opcode_table_voidptr[];
  288. static typed_opcode_handler opcode_table_bool_t[];
  289. -
  290. +#endif
  291. //Synchronization
  292. Mutex event_queue_mutex;
  293. @@ -873,6 +884,7 @@ friend class asAtom;
  294. MemoryAccount* vmDataMemory;
  295. +#ifdef LLVM_ENABLED
  296. llvm::ExecutionEngine* ex;
  297. llvm::Module* module;
  298. @@ -882,6 +894,7 @@ friend class asAtom;
  299. llvm::FunctionPassManager* FPM;
  300. #endif
  301. llvm::LLVMContext& llvm_context();
  302. +#endif
  303. ABCVm(SystemState* s, MemoryAccount* m) DLL_PUBLIC;
  304. /**
  305. diff --git a/src/scripting/abc_codesynt.cpp b/src/scripting/abc_codesynt.cpp
  306. index 5b71b289e..6ee977b3e 100644
  307. --- a/src/scripting/abc_codesynt.cpp
  308. +++ b/src/scripting/abc_codesynt.cpp
  309. @@ -17,6 +17,8 @@
  310. along with this program. If not, see <http://www.gnu.org/licenses/>.
  311. **************************************************************************/
  312. +#ifdef LLVM_ENABLED
  313. +
  314. #ifdef LLVM_28
  315. #define alignof alignOf
  316. #define LLVMMAKEARRAYREF(T) T
  317. @@ -4783,3 +4785,4 @@ void ABCVm::wrong_exec_pos()
  318. {
  319. assert_and_throw(false && "wrong_exec_pos");
  320. }
  321. +#endif //LLVM_ENABLED
  322. diff --git a/src/scripting/toplevel/toplevel.cpp b/src/scripting/toplevel/toplevel.cpp
  323. index 55ee6028f..c2c5bce10 100644
  324. --- a/src/scripting/toplevel/toplevel.cpp
  325. +++ b/src/scripting/toplevel/toplevel.cpp
  326. @@ -345,6 +345,7 @@ void SyntheticFunction::call(asAtom& ret, asAtom& obj, asAtom *args, uint32_t nu
  327. ABCVm::optimizeFunction(this);
  328. }
  329. +#ifdef LLVM_ENABLED
  330. //Temporarily disable JITting
  331. if(getSystemState()->useJit && mi->body->exceptions.size()==0 && ((hit_count>=jit_hit_threshold && codeStatus==method_body_info::OPTIMIZED) || getSystemState()->useInterpreter==false))
  332. {
  333. @@ -352,6 +353,7 @@ void SyntheticFunction::call(asAtom& ret, asAtom& obj, asAtom *args, uint32_t nu
  334. val=mi->synt_method(getSystemState());
  335. assert(val);
  336. }
  337. +#endif
  338. ++mi->body->hit_count;
  339. //Prepare arguments