[llvm-dev] invalid code generated on Windows x86_64 using skylake-specific features
Andrew Kelley via llvm-dev
llvm-dev at lists.llvm.org
Sat Sep 30 12:33:59 PDT 2017
I have this code, which works fine on MacOS and Linux hosts:
const char *target_specific_cpu_args;
const char *target_specific_features;
if (g->is_native_target) {
target_specific_cpu_args = ZigLLVMGetHostCPUName();
target_specific_features = ZigLLVMGetNativeFeatures();
} else {
target_specific_cpu_args = "";
target_specific_features = "";
}
g->target_machine = LLVMCreateTargetMachine(target_ref,
buf_ptr(&g->triple_str),
target_specific_cpu_args, target_specific_features, opt_level,
reloc_mode, LLVMCodeModelDefault);
char *ZigLLVMGetHostCPUName(void) {
std::string str = sys::getHostCPUName();
return strdup(str.c_str());
}
char *ZigLLVMGetNativeFeatures(void) {
SubtargetFeatures features;
StringMap<bool> host_features;
if (sys::getHostCPUFeatures(host_features)) {
for (auto &F : host_features)
features.AddFeature(F.first(), F.second);
}
return strdup(features.getString().c_str());
}
On this windows laptop that I am testing on, I get these values:
target_specific_cpu_args: skylake
target_specific_features:
+sse2,+cx16,-tbm,-avx512ifma,-avx512dq,-fma4,+prfchw,+bmi2,+xsavec,+fsgsbase,+popcnt,+aes,+xsaves,-avx512er,-avx512vpopcntdq,-clwb,-avx512f,-clzero,-pku,+mmx,-lwp,-xop,+rdseed,-sse4a,-avx512bw,+clflushopt,+xsave,-avx512vl,-avx512cd,+avx,-rtm,+fma,+bmi,+rdrnd,-mwaitx,+sse4.1,+sse4.2,+avx2,+sse,+lzcnt,+pclmul,-prefetchwt1,+f16c,+ssse3,+sgx,+cmov,-avx512vbmi,+movbe,+xsaveopt,-sha,+adx,-avx512pf,+sse3
It successfully creates a binary, but the binary when run crashes with:
Unhandled exception at 0x00007FF7C9913BA7 in test.exe: 0xC0000005: Access
violation reading location 0xFFFFFFFFFFFFFFFF.
The disassembly of the crashed instruction is:
00007FF7C9913BA7 vmovdqa xmmword ptr [rbp-20h],xmm0
There is no callstack or source in the MSVC debugger. The .pdb produced is
64KB exactly. The file was linked with:
lld -NOLOGO -DEBUG -MACHINE:X64 /SUBSYSTEM:console -OUT:.\test.exe
-NODEFAULTLIB -ENTRY:_start ./zig-cache/test.obj ./zig-cache/builtin.obj
./zig-cache/compiler_rt.obj ./zig-cache/kernel32.lib
When I change the call to LLVMCreateTargetMachine so that both
target_specific_cpu_args and target_specific_features are the empty
string, the produced binary is valid and runs successfully.
Is this an LLVM bug? Am I using the API incorrectly? Is there more
information I can provide to LLVM-dev mailing list that would make it
easier to help me?
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20170930/9b7b6ba8/attachment.html>
More information about the llvm-dev
mailing list