<font size=2 face="sans-serif">Hello everyone reading this,</font>
<br>
<br><font size=2 face="sans-serif">I'm totally confused and need an explanation.
I'm also not sure if it's a clang or a LLVM subject. </font>
<br>
<br><font size=2 face="sans-serif">I'm working with Visual Studio 2015,
LLVM 5.0.1 and Windows 7 64bit.</font>
<br>
<br><font size=2 face="sans-serif">I have a simple project. With 2 Header
files and 1 cpp file.</font>
<br><font size=2 face="sans-serif">"Interface.h"<br>
This file defines a simple class with two pure virtual member functions.</font>
<br>
<br><font size=2 face="sans-serif">"SimpleResult.h"</font>
<br><font size=2 face="sans-serif">This file defines a struct holding an
integer</font>
<br>
<br><font size=2 face="sans-serif">"CM_Elf.cpp"</font>
<br><font size=2 face="sans-serif">This file defines a class (CM_Elf) implementing
the interface from Interface.h</font>
<br><font size=2 face="sans-serif">Also there is an instance of the class
(named "elf").</font>
<br>
<br><font size=2 face="sans-serif">I compile the CM_Elf.cpp to a CM_Elf.bc
file via clang-cl but with target "x86_64-pc-windows-elf"</font>
<br>
<br>
<br><font size=2 face="sans-serif">In another application I use LLVM to
parse the BC file and use the ExecutionEngine to get some addresses.<br>
What I want to archive is:</font>
<br><font size=2 face="sans-serif">I want to call the implemented member
functions of "elf".</font>
<br>
<br><font size=2 face="sans-serif">1.) I execute all the global constructors
collected by the ExecutionEngine</font>
<br><font size=2 face="sans-serif">-> The constructor of elf gets called</font>
<br><font size=2 face="sans-serif">2.) I use ExecutionEngine to get the
address of "elf"</font>
<br><font size=2 face="sans-serif">3.) I use the interface to execute Interface::init</font>
<br><font size=2 face="sans-serif">-> Init gets called</font>
<br><font size=2 face="sans-serif">4.) I use the interface to execute Interface::shutdown</font>
<br><font size=2 face="sans-serif">-> CRASH!</font>
<br>
<br><font size=2 face="sans-serif">When I swap the calls to init and shutdown,
then everything works. So the virtual call to init seems to corrupt my
stack - maybe it's the return value. Could it be a calling convention problem?
But my target is still "windows" only msvc changed to elf...</font>
<br><font size=2 face="sans-serif">When I compile CM_Elf for target "x86_64-pc-windows-msvc19.0.24215"
then it works.</font>
<br>
<br><font size=2 face="sans-serif">When I get the address of CM_Elf::init
and CM_Elf::shutdown via the ExecutionEngine and call them without using
the virtual table, then again everything works.</font>
<br>
<br><font size=2 face="sans-serif">SO! Is it not possible to call virtual
elf functions via there interface? But why does normal functions work?
Also I reach the functions which are stored in the vTable of CM_Elf so
the vTable is correct.</font>
<br>
<br><font size=2 face="sans-serif">I append some pictures of the code...
I hope someone could help me with this.</font>
<br>
<br><font size=2 face="sans-serif">Kind regards</font>
<br><font size=2 face="sans-serif">Björn</font>
<br><font size=2 face="sans-serif"><br>
<br>
Als GmbH eingetragen im Handelsregister Bad Homburg v.d.H. HRB 9816, USt.ID-Nr.
DE 114 165 789<br>
Geschäftsführer: Dr. Hiroshi Nakamura, Dr. Robert Plank, Markus Bode, Heiko
Lampert, Hiroshi Kawamura, Takashi Nagano, Takeshi Fukushima.<br>
<br>
</font>