Build Linux altjit for x86 and amd64 (#10120)
authorBruce Forstall <brucefo@microsoft.com>
Mon, 13 Mar 2017 23:32:15 +0000 (16:32 -0700)
committerGitHub <noreply@github.com>
Mon, 13 Mar 2017 23:32:15 +0000 (16:32 -0700)
commitad8afe4f8c9537e8652ae35b301366d737bc1e04
tree44fd7501fd93f2618b1ef0e4f8da38820b4715e6
parent814a105864c35ca992ed1b332d72d9e6869519df
Build Linux altjit for x86 and amd64 (#10120)

Enable Windows hosted, Linux target amd64 altjit

With this change, we build a JIT that runs on Windows amd64
and targets Linux amd64, as an altjit named linuxnonjit.dll.
This is useful for debugging, or generating asm code or diffs.
You can even easily create Windows/non-Windows asm diffs
(either to compare the asm, or compare the generated code size).

For this to work, the JIT-EE interface method
getSystemVAmd64PassStructInRegisterDescriptor() was changed
to always be built in, by defining `FEATURE_UNIX_AMD64_STRUCT_PASSING_ITF`
in all AMD64 builds. The `_ITF` suffix indicates that this is
functionality specific to implementing the JIT-EE interface
contract. There were many places in the VM that used this
interchangeably with `FEATURE_UNIX_AMD64_STRUCT_PASSING`. Now,
`FEATURE_UNIX_AMD64_STRUCT_PASSING` means code in the VM needed
to implement this feature, but not required to implement the
JIT-EE interface contract. In particular, MethodTables compute
and cache the "eightbyte" info of structs when loading a type.
This is not done when only `FEATURE_UNIX_AMD64_STRUCT_PASSING_ITF`
is set, to avoid altering MethodTable behavior on non-Unix
AMD64 builds. Instead, if `getSystemVAmd64PassStructInRegisterDescriptor()`
is called on a non-Unix build (by the altjit), the `ClassifyEightBytes()`
function is called, and nothing is cached. Hopefully (though it was
hard for me to guarantee by observation), calling `ClassifyEightBytes()`
does not have any side effects on MethodTables. It doesn't really matter,
since if called for altjit, we don't care too much about running.

The previously used `PLATFORM_UNIX` define is now insufficient.
I introduced the `#define` macros `_HOST_UNIX_` to indicate the
JIT being built will run on Unix, and `_TARGET_UNIX_` to indicate
the JIT is generating code targeting Unix. Some things were
converted to use the `UNIX_AMD64_ABI` define, which makes more
sense.
25 files changed:
CMakeLists.txt
clrdefinitions.cmake
src/debug/daccess/nidump.cpp
src/jit/CMakeLists.txt
src/jit/codegencommon.cpp
src/jit/codegenlinear.h
src/jit/codegenxarch.cpp
src/jit/compiler.cpp
src/jit/dll/CMakeLists.txt
src/jit/ee_il_dll.cpp
src/jit/emitxarch.cpp
src/jit/jit.h
src/jit/jitstd/type_traits.h
src/jit/linuxnonjit/CMakeLists.txt [new file with mode: 0644]
src/jit/target.h
src/jit/unwindamd64.cpp
src/jit/utils.cpp
src/jit/valuenum.h
src/vm/callhelpers.cpp
src/vm/class.h
src/vm/jitinterface.cpp
src/vm/methodtable.cpp
src/vm/methodtable.h
src/vm/methodtablebuilder.cpp
src/vm/methodtablebuilder.h