LLVMAddTargetData(gallivm->target, gallivm->passmgr);
#endif
- /* Setting the module's DataLayout to an empty string will cause the
- * ExecutionEngine to copy to the DataLayout string from its target
- * machine to the module. As of LLVM 3.8 the module and the execution
- * engine are required to have the same DataLayout.
- *
- * TODO: This is just a temporary work-around. The correct solution is
- * for gallivm_init_state() to create a TargetMachine and pull the
- * DataLayout from there. Currently, the TargetMachine used by llvmpipe
- * is being implicitly created by the EngineBuilder in
- * lp_build_create_jit_compiler_for_module()
- */
-
-#if HAVE_LLVM < 0x0308
{
char *td_str;
// New ones from the Module.
LLVMSetDataLayout(gallivm->module, td_str);
free(td_str);
}
-#else
- LLVMSetDataLayout(gallivm->module, "");
-#endif
if ((gallivm_debug & GALLIVM_DEBUG_NO_OPT) == 0) {
/* These are the passes currently listed in llvm-c/Transforms/Scalar.h,
}
if (use_mcjit) {
+ /* Setting the module's DataLayout to an empty string will cause the
+ * ExecutionEngine to copy to the DataLayout string from its target
+ * machine to the module. As of LLVM 3.8 the module and the execution
+ * engine are required to have the same DataLayout.
+ *
+ * We must make sure we do this after running the optimization passes,
+ * because those passes need a correct datalayout string. For example,
+ * if those optimization passes see an empty datalayout, they will assume
+ * this is a little endian target and will do optimizations that break big
+ * endian machines.
+ *
+ * TODO: This is just a temporary work-around. The correct solution is
+ * for gallivm_init_state() to create a TargetMachine and pull the
+ * DataLayout from there. Currently, the TargetMachine used by llvmpipe
+ * is being implicitly created by the EngineBuilder in
+ * lp_build_create_jit_compiler_for_module()
+ */
+ LLVMSetDataLayout(gallivm->module, "");
assert(!gallivm->engine);
if (!init_gallivm_engine(gallivm)) {
assert(0);