LLJit, Windows, exported symbols and COFFObjectFile


So after seeing the great tutorial on the new LLJit by Lang Hames, I went ahead and converted my llvm jitter. I much prefer this new API, btw.

It’s starting to work well, except on Windows. Any extern “C” exported symbol leads to assertions about mismatching symbol flags. Tracing through the inconsistency, it seems JITSymbolFlags::fromObjectSymbol returns a different result than what the frontend (?) expects.

Namely, exported symbols in COFFObjectFiles are flagged with SF_Global, not SF_Exported. fromObjectSymbol ignores that flag. Previously I had this working with varying levels of success by flagging jit symbols as exported if SF_Global exists (or alternatively have COFFObjectFile::getSymbolFlags flag both SF_Global and SF_Exported).

But this breaks in other ways…

Looking at git blame, I can see I’m not the first one to try this hack (?), so I wanted to ask whether there are any workarounds or planned work to get the LLJit working on Windows?

I’ve attached an example llvm module that breaks.
Additionally, it seems lljit doesn’t record constructors properly? Attached a diff for a fix.

Regards, Janus

patch.txt (619 Bytes)

output_global_symbol_textual.ll (525 Bytes)

+Lang in case he’s got some thoughts here. I know he’s working predominantly in MachO, so some non-MachO object file issues might linger a little.