Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Is it possible to compile cxxjit in Windows ? #22

Open
tapika opened this issue Oct 3, 2020 · 7 comments
Open

Is it possible to compile cxxjit in Windows ? #22

tapika opened this issue Oct 3, 2020 · 7 comments

Comments

@tapika
Copy link

tapika commented Oct 3, 2020

Started Visual Studio's Developer Command Prompt for VS 2019:

First I've tried to compile cxxjit using command like this:

cmake -G Ninja -DCMAKE_BUILD_TYPE=RelWithDebInfo -DBUILD_SHARED_LIBS=ON -DLLVM_USE_SPLIT_DWARF=ON -DCMAKE_INSTALL_PREFIX=C:\PrototypingQuick\cxxjit\llvm-project-cxxjit\install -DLLVM_ENABLE_PROJECTS="llvm;clang;openmp" C:\PrototypingQuick\cxxjit\llvm-project-cxxjit\llvm

But when building it (ninja -j 7), it gives some odd error about DWARF symbols.

Suspect that I'm compiling on windows, and DWARF has something to do with ELF file format, which is linux.

Ok, so I thought - do I need that define ?
Well, I've disabled it, and built using following command line again:

cmake -G Ninja -DCMAKE_BUILD_TYPE=RelWithDebInfo -DBUILD_SHARED_LIBS=ON -DCMAKE_INSTALL_PREFIX=C:\PrototypingQuick\cxxjit\llvm-project-cxxjit\install -DLLVM_ENABLE_PROJECTS="llvm;clang;openmp" C:\PrototypingQuick\cxxjit\llvm-project-cxxjit\llvm

Then I'm getting compilation errors like this:

[3/3782] Building CXX object lib\Demangle\CMakeFiles\LLVMDemangle.dir\MicrosoftDemangle.cpp.obj FAILED: lib/Demangle/CMakeFiles/LLVMDemangle.dir/MicrosoftDemangle.cpp.obj C:\PROGRA~2\MIB055~1\2019\ENTERP~2\VC\Tools\MSVC\1427~1.291\bin\Hostx86\x86\cl.exe /nologo /TP -DGTEST_HAS_RTTI=0 -DUNICODE -D_CRT_NONSTDC_NO_DEPRECATE -D_CRT_NONSTDC_NO_WARNINGS -D_CRT_SECURE_NO_DEPRECATE -D_CRT_SECURE_NO_WARNINGS -D_FILE_OFFSET_BITS=64 -D_HAS_EXCEPTIONS=0 -D_LARGEFILE_SOURCE -D_SCL_SECURE_NO_DEPRECATE -D_SCL_SECURE_NO_WARNINGS -D_UNICODE -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS -Ilib\Demangle -IC:\PrototypingQuick\cxxjit\llvm-project-cxxjit\llvm\lib\Demangle -Iinclude -IC:\PrototypingQuick\cxxjit\llvm-project-cxxjit\llvm\include /DWIN32 /D_WINDOWS /Zc:inline /Zc:strictStrings /Oi /Zc:rvalueCast /W4 -wd4141 -wd4146 -wd4180 -wd4244 -wd4258 -wd4267 -wd4291 -wd4345 -wd4351 -wd4355 -wd4456 -wd4457 -wd4458 -wd4459 -wd4503 -wd4624 -wd4722 -wd4800 -wd4100 -wd4127 -wd4512 -wd4505 -wd4610 -wd4510 -wd4702 -wd4245 -wd4706 -wd4310 -wd4701 -wd4703 -wd4389 -wd4611 -wd4805 -wd4204 -wd4577 -wd4091 -wd4592 -wd4319 -wd4709 -wd4324 -w14062 -we4238 /MD /Zi /O2 /Ob1 /DNDEBUG /EHs-c- /GR- /showIncludes /Folib\Demangle\CMakeFiles\LLVMDemangle.dir\MicrosoftDemangle.cpp.obj /Fdlib\Demangle\CMakeFiles\LLVMDemangle.dir\ /FS -c C:\PrototypingQuick\cxxjit\llvm-project-cxxjit\llvm\lib\Demangle\MicrosoftDemangle.cpp C:\PrototypingQuick\cxxjit\llvm-project-cxxjit\llvm\include\llvm/Demangle/MicrosoftDemangleNodes.h(258): error C2039: 'string': is not a member of 'std' C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\VC\Tools\MSVC\14.27.29110\include\array(20): note: see declaration of 'std' C:\PrototypingQuick\cxxjit\llvm-project-cxxjit\llvm\include\llvm/Demangle/MicrosoftDemangleNodes.h(258): error C3646: 'toString': unknown override specifier C:\PrototypingQuick\cxxjit\llvm-project-cxxjit\llvm\include\llvm/Demangle/MicrosoftDemangleNodes.h(258): error C2059: syntax error: '(' C:\PrototypingQuick\cxxjit\llvm-project-cxxjit\llvm\include\llvm/Demangle/MicrosoftDemangleNodes.h(258): error C2238: unexpected token(s) preceding ';' [8/3782] Building CXX object lib\Support\CMakeFiles\LLVMSupport.dir\AMDGPUMetadata.cpp.obj ninja: build stopped: subcommand failed.

Are llvm or clang some forks from official repositories, maybe because of that does not compile ?

Is it possible to get windows / visual studio support up-to-date ?

@tapika
Copy link
Author

tapika commented Oct 4, 2020

Short summary of what I have discovered by myself:

BUILD_SHARED_LIBS=ON cannot be used, as it turns every library into shared object library. From windows perspective this is no-no, as not every dll can expose small grained functions, and because of this no .lib's are generated.

This issue is being discussed in here:
http://lists.llvm.org/pipermail/llvm-dev/2018-September/thread.html#126160

And I guess one approach is to compile clang normally (BUILD_SHARED_LIBS=OFF) - and that approach will work out of box, or dynamically - then it's possible to use LLVM_LINK_LLVM_DYLIB=ON - but it does not work because of cmake block in this file:

https://github.com/llvm/llvm-project/blob/master/llvm/tools/llvm-shlib/CMakeLists.txt#L14

(Also mentioned on forum)

@tapika
Copy link
Author

tapika commented Oct 4, 2020

This git repo seems to have bit older llvm & clang, and when compiling it with Visual studio - manifest as an error, similar to this one:

https://developercommunity.visualstudio.com/content/problem/1162322/inconsistent-behavior-between-llvm-and-std-impleme.html

Can be walkarounded by using -DHAVE_STD_IS_TRIVIALLY_COPYABLE=0 option.

@tapika
Copy link
Author

tapika commented Oct 4, 2020

In some cases test building fails (not sure because of which flags), but generally it's bit faster if you just disable a lot of tests builds, e.g. using parameters like:

-DLLVM_INCLUDE_EXAMPLES=OFF 
-DCLANG_INCLUDE_TESTS=0
-DLLVM_BUILD_TESTS=0
-DLLVM_BUILD_TOOLS=0
-DCLANG_BUILD_TOOLS=0
-DLLVM_BUILD_UTILS=0
-DCLANG_INCLUDE_DOCS=0 

@tapika
Copy link
Author

tapika commented Oct 4, 2020

Concerning:
-DLLVM_USE_SPLIT_DWARF=ON

option - for windows it's not possible to use it - either because of compilation or linking errors. But I'm not sure whether some code dwarf::* in llvm/lib/IR/AsmWriter.cpp is needed or can be just disabled using #ifdef _WIN32 - haven't reached point of trying this out.

@tapika
Copy link
Author

tapika commented Oct 4, 2020

@davidbolvansky I've checked your commit, made 7.8.2018, in file: https://github.com/llvm/llvm-project/blob/master/llvm/tools/llvm-shlib/CMakeLists.txt#L14 - by commenting out those lines - build works also for Visual studio, but there is no __declspec(dllexport) used in any of class, as well there is no .def file for LLVM.dll. Dll does gets produces, but like you guess - it's not producing any .lib file, because not exported entries in .dll.

Is there any way it's possible to enable compilation to LLVM.dll also for windows - would be interested to try out newest [[clang::jit]] compilation on windows.

On even in theory this missing __declspec(dllexport) / .def file could be handled ?

@tapika
Copy link
Author

tapika commented Oct 5, 2020

Apparently there exists a python script, which is able to extract all symbol function names located in .lib file, which in a turn can be used as input file to dynamic library building:

python C:\PrototypingQuick\cxxjit\llvm-project-cxxjit\llvm\utils\extract_symbols.py --mangling microsoft C:\PrototypingQuick\cxxjit\llvm-project-cxxjit\llvm_build\lib\LLVMDemangle.lib C:\PrototypingQuick\cxxjit\llvm-project-cxxjit\llvm_build\lib\LLVMDlltoolDriver.lib --tools dumpbin >lib.exports

llvm\tools\llvm-shlib\CMakeLists.txt:

  target_link_libraries(LLVM PRIVATE ${LIB_NAMES})
-->
  add_llvm_symbol_exports(LLVM ${CMAKE_CURRENT_SOURCE_DIR}/llvm.exports)

and by adding this line it's possible to generate .def file from .exports file and then dll compiles with exported static library.

Maybe I need to recombine everything in cmake to make it fully functional.

@tapika
Copy link
Author

tapika commented Oct 22, 2020

dutiona pushed a commit to dutiona/llvm-project-cxxjit that referenced this issue Dec 21, 2023
When `Target::GetEntryPointAddress()` calls `exe_module->GetObjectFile()->GetEntryPointAddress()`, and the returned
`entry_addr` is valid, it can immediately be returned.

However, just before that, an `llvm::Error` value has been setup, but in this case it is not consumed before returning, like is done further below in the function.

In https://bugs.freebsd.org/248745 we got a bug report for this, where a very simple test case aborts and dumps core:

```
* thread hfinkel#1, name = 'testcase', stop reason = breakpoint 1.1
    frame #0: 0x00000000002018d4 testcase`main(argc=1, argv=0x00007fffffffea18) at testcase.c:3:5
   1	int main(int argc, char *argv[])
   2	{
-> 3	    return 0;
   4	}
(lldb) p argc
Program aborted due to an unhandled Error:
Error value was Success. (Note: Success values must still be checked prior to being destroyed).

Thread 1 received signal SIGABRT, Aborted.
thr_kill () at thr_kill.S:3
3	thr_kill.S: No such file or directory.
(gdb) bt
#0  thr_kill () at thr_kill.S:3
hfinkel#1  0x00000008049a0004 in __raise (s=6) at /usr/src/lib/libc/gen/raise.c:52
hfinkel#2  0x0000000804916229 in abort () at /usr/src/lib/libc/stdlib/abort.c:67
hfinkel#3  0x000000000451b5f5 in fatalUncheckedError () at /usr/src/contrib/llvm-project/llvm/lib/Support/Error.cpp:112
hfinkel#4  0x00000000019cf008 in GetEntryPointAddress () at /usr/src/contrib/llvm-project/llvm/include/llvm/Support/Error.h:267
hfinkel#5  0x0000000001bccbd8 in ConstructorSetup () at /usr/src/contrib/llvm-project/lldb/source/Target/ThreadPlanCallFunction.cpp:67
hfinkel#6  0x0000000001bcd2c0 in ThreadPlanCallFunction () at /usr/src/contrib/llvm-project/lldb/source/Target/ThreadPlanCallFunction.cpp:114
hfinkel#7  0x00000000020076d4 in InferiorCallMmap () at /usr/src/contrib/llvm-project/lldb/source/Plugins/Process/Utility/InferiorCallPOSIX.cpp:97
hfinkel#8  0x0000000001f4be33 in DoAllocateMemory () at /usr/src/contrib/llvm-project/lldb/source/Plugins/Process/FreeBSD/ProcessFreeBSD.cpp:604
hfinkel#9  0x0000000001fe51b9 in AllocatePage () at /usr/src/contrib/llvm-project/lldb/source/Target/Memory.cpp:347
hfinkel#10 0x0000000001fe5385 in AllocateMemory () at /usr/src/contrib/llvm-project/lldb/source/Target/Memory.cpp:383
hfinkel#11 0x0000000001974da2 in AllocateMemory () at /usr/src/contrib/llvm-project/lldb/source/Target/Process.cpp:2301
hfinkel#12 CanJIT () at /usr/src/contrib/llvm-project/lldb/source/Target/Process.cpp:2331
hfinkel#13 0x0000000001a1bf3d in Evaluate () at /usr/src/contrib/llvm-project/lldb/source/Expression/UserExpression.cpp:190
hfinkel#14 0x00000000019ce7a2 in EvaluateExpression () at /usr/src/contrib/llvm-project/lldb/source/Target/Target.cpp:2372
hfinkel#15 0x0000000001ad784c in EvaluateExpression () at /usr/src/contrib/llvm-project/lldb/source/Commands/CommandObjectExpression.cpp:414
hfinkel#16 0x0000000001ad86ae in DoExecute () at /usr/src/contrib/llvm-project/lldb/source/Commands/CommandObjectExpression.cpp:646
hfinkel#17 0x0000000001a5e3ed in Execute () at /usr/src/contrib/llvm-project/lldb/source/Interpreter/CommandObject.cpp:1003
hfinkel#18 0x0000000001a6c4a3 in HandleCommand () at /usr/src/contrib/llvm-project/lldb/source/Interpreter/CommandInterpreter.cpp:1762
hfinkel#19 0x0000000001a6f98c in IOHandlerInputComplete () at /usr/src/contrib/llvm-project/lldb/source/Interpreter/CommandInterpreter.cpp:2760
hfinkel#20 0x0000000001a90b08 in Run () at /usr/src/contrib/llvm-project/lldb/source/Core/IOHandler.cpp:548
hfinkel#21 0x00000000019a6c6a in ExecuteIOHandlers () at /usr/src/contrib/llvm-project/lldb/source/Core/Debugger.cpp:903
hfinkel#22 0x0000000001a70337 in RunCommandInterpreter () at /usr/src/contrib/llvm-project/lldb/source/Interpreter/CommandInterpreter.cpp:2946
hfinkel#23 0x0000000001d9d812 in RunCommandInterpreter () at /usr/src/contrib/llvm-project/lldb/source/API/SBDebugger.cpp:1169
hfinkel#24 0x0000000001918be8 in MainLoop () at /usr/src/contrib/llvm-project/lldb/tools/driver/Driver.cpp:675
hfinkel#25 0x000000000191a114 in main () at /usr/src/contrib/llvm-project/lldb/tools/driver/Driver.cpp:890```

Fix the incorrect error catch by only instantiating an `Error` object if it is necessary.

Reviewed By: JDevlieghere

Differential Revision: https://reviews.llvm.org/D86355

(cherry picked from commit 1ce07cd)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant