<div dir="ltr">Hi Björn,<div><br></div><div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;border-left-color:rgb(204,204,204);padding-left:1ex"><font size="2" face="sans-serif">It's correct - I tried casting the virtual function to a regular function. But I also tried using the virtual function in the normal way.</font><span style="font-size:12.800000190734863px"> </span><br></blockquote></div><div><br></div><div>Yes. If I understand your setup correctly you have a base class, Interface, which is currently compiled into your application, and you are creating a derived class in JIT'd code, and returning an Interface pointer to an instance of the derived class. In this case you are probably running into ABI incompatibility issues in the class layout between the ahead-of-time and JIT'd code. Your ahead-of-time code will always have to call virtual functions via trampolines. I would remove all references to the Interface class from your main application (so that the compiler catches anyone who tries to use it directly) and make it an opaque pointer type that you pass into JIT'd code.</div><div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;border-left-color:rgb(204,204,204);padding-left:1ex"><font size="2" face="sans-serif">I don't understand why the generated assemblies are different. Are they effected by the ELF and PE/COFF ABI? But I thought this problem would be solved thanks to the target-triple containing "windows".</font> </blockquote><div><br></div><div class="gmail_extra">I believe the code generator sometimes uses the format (ELF / COFF / MachO) in making ABI decisions.</div><div class="gmail_extra"><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;border-left-color:rgb(204,204,204);padding-left:1ex"><font size="2" face="sans-serif">When I create the trampoline functions on the IR level - would there be a way to inline them when used?</font><span style="font-size:12.800000190734863px"> </span></blockquote><div class="gmail_extra"><br></div><div class="gmail_extra">They can be inlined when called from other JIT'd code, but not when called from ahead-of-time code.</div><div class="gmail_extra"><br></div><div class="gmail_extra"><br></div><div class="gmail_extra">The ideal solution to your situation would be to generate JIT'd code in the same format as the ahead-of-time code. Then you can just use virtual functions as normal. From memory there is some reason that you can't do that though. Was it exception handling support?</div><div class="gmail_extra"><br></div><div class="gmail_extra">Cheers,</div><div class="gmail_extra">Lang.</div><div class="gmail_extra"><br><div class="gmail_quote">On Thu, Feb 22, 2018 at 12:00 AM,  <span dir="ltr"><<a href="mailto:bjoern.gaier@horiba.com" target="_blank">bjoern.gaier@horiba.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;border-left-color:rgb(204,204,204);padding-left:1ex"><font size="2" face="sans-serif">Hello Lang,</font>
<br>
<br><font size="2" face="sans-serif">It's correct - I tried casting the virtual
function to a regular function. But I also tried using the virtual function
in the normal way.</font>
<br>
<br><font size="2" face="sans-serif">I don't understand why the generated
assemblies are different. Are they effected by the ELF and PE/COFF ABI?
But I thought this problem would be solved thanks to the target-triple
containing "windows".</font>
<br>
<br><font size="2" face="sans-serif">When I create the trampoline functions
on the IR level - would there be a way to inline them when used?</font>
<br>
<br><font size="2" face="sans-serif">Kind regards</font>
<br><font size="2" face="sans-serif">Björn</font>
<br>
<br>
<br>
<br><font size="1" color="#5f5f5f" face="sans-serif">From:      
 </font><font size="1" face="sans-serif">Lang Hames <<a href="mailto:lhames@gmail.com" target="_blank">lhames@gmail.com</a>></font>
<br><font size="1" color="#5f5f5f" face="sans-serif">To:      
 </font><font size="1" face="sans-serif"><a href="mailto:bjoern.gaier@horiba.com" target="_blank">bjoern.gaier@horiba.com</a></font>
<br><font size="1" color="#5f5f5f" face="sans-serif">Cc:      
 </font><font size="1" face="sans-serif">LLVM Developers Mailing
List <<a href="mailto:llvm-dev@lists.llvm.org" target="_blank">llvm-dev@lists.llvm.org</a>>, Clang Dev <<a href="mailto:cfe-dev@lists.llvm.org" target="_blank">cfe-dev@lists.llvm.org</a>></font>
<br><font size="1" color="#5f5f5f" face="sans-serif">Date:      
 </font><font size="1" face="sans-serif">21.02.2018 22:36</font>
<br><font size="1" color="#5f5f5f" face="sans-serif">Subject:    
   </font><font size="1" face="sans-serif">Re: [cfe-dev]
Calling virtual elf functions under windows -> Adding ASM code</font>
<br><div class="gmail-HOEnZb"><div class="gmail-h5">
<hr noshade>
<br>
<br>
<br><font size="3">Hi Bjoern,</font>
<br>
<br><font size="3">It looks like you are casting a regular function pointer
(returned from getFunctionAddress) to a virtual method pointer. This is
undefined behavior.</font>
<br>
<br><font size="3">The easiest way to achieve the effect you want would be
to add a trampoline to your source (or at the IR level):</font>
<br>
<br><tt><font size="3">extern "C" SimpleResult call_Interface_init(Interface
*Instance) { return Instance->init(); }</font></tt>
<br>
<br><font size="3">Then you can just use:</font>
<br>
<br><tt><font size="3">auto CallInit = (SimpleResult(*)(Interface*))<wbr>engine->getFunctionAddress("<wbr>call_Interface_init");</font></tt>
<br><tt><font size="3">CallInit(inter);</font></tt>
<br>
<br><font size="3">Cheers,</font>
<br><font size="3">Lang.</font>
<br>
<br>
<br><font size="3">On Tue, Feb 20, 2018 at 1:42 AM, via cfe-dev <</font><a href="mailto:cfe-dev@lists.llvm.org" target="_blank"><font size="3" color="blue"><u>cfe-dev@lists.llvm.org</u></font></a><font size="3">>
wrote:</font>
<br><font size="2" face="sans-serif">Still no progress with this problem.
Only that non-member functions seems to be working...</font><font size="3">
</font><font size="2" face="sans-serif"><br>
Also:</font><font size="3"> </font><font size="2" face="sans-serif"><br>
Even when I set the target triple of the Module (when the file was parsed
at runtime) to "COFF" nothing changes...</font><font size="3">
<br>
<br>
</font><font size="1" color="#5f5f5f" face="sans-serif"><br>
From:        </font><font size="1" face="sans-serif">Bjoern
Gaier/HE/HORIBA</font><font size="3"> </font><font size="1" color="#5f5f5f" face="sans-serif"><br>
To:        </font><a href="mailto:llvm-dev@lists.llvm.org" target="_blank"><font size="1" color="blue" face="sans-serif"><u>llvm-dev@lists.llvm.org</u></font></a><font size="3">
</font><font size="1" color="#5f5f5f" face="sans-serif"><br>
Cc:        </font><a href="mailto:cfe-dev@lists.llvm.org" target="_blank"><font size="1" color="blue" face="sans-serif"><u>cfe-dev@lists.llvm.org</u></font></a><font size="3">
</font><font size="1" color="#5f5f5f" face="sans-serif"><br>
Date:        </font><font size="1" face="sans-serif">08.02.2018
12:28</font><font size="3"> </font><font size="1" color="#5f5f5f" face="sans-serif"><br>
Subject:        </font><font size="1" face="sans-serif">Re:
Calling virtual elf functions under windows -> Adding ASM code</font><font size="3">
<br>
</font>
<hr noshade>
<br><font size="3"><br>
</font><font size="2" face="sans-serif"><br>
Hello everyone,</font><font size="3"> <br>
</font><font size="2" face="sans-serif"><br>
I'm sorry for "flooding" your inbox, but I wanted to extend my
message which is shown below. The problem is still not solved and I'm more
confused then before.</font><font size="3"> </font><font size="2" face="sans-serif"><br>
I compiled the code - the one seen in the pictures  to elf bc and
to msvc (pecoff) bc. Then I used llc to generate assembler output.</font><font size="3">
<br>
</font><font size="2" face="sans-serif"><br>
In my opinion the involved functions are acting exactly the same. There
are only some registers swapped. I should mention: when using the msvc
bc code, then the calls via the interface are working.</font><font size="3">
<br>
</font><font size="2" face="sans-serif"><br>
I attach the assembly code of the involved code to. Could please anyone
explain me the difference, which could cause the crash?</font><font size="3">
<br>
</font><font size="2" face="sans-serif"><br>
Kind regards</font><font size="3"> </font><font size="2" face="sans-serif"><br>
Björn</font><font size="3"> <br>
<br>
<br>
<br>
</font><font size="1" color="#5f5f5f" face="sans-serif"><br>
From:        </font><font size="1" face="sans-serif">Bjoern
Gaier/HE/HORIBA</font><font size="3"> </font><font size="1" color="#5f5f5f" face="sans-serif"><br>
To:        </font><a href="mailto:llvm-dev@lists.llvm.org" target="_blank"><font size="1" color="blue" face="sans-serif"><u>llvm-dev@lists.llvm.org</u></font></a><font size="1" face="sans-serif">,
</font><a href="mailto:cfe-dev@lists.llvm.org" target="_blank"><font size="1" color="blue" face="sans-serif"><u>cfe-dev@lists.llvm.org</u></font></a><font size="3">
</font><font size="1" color="#5f5f5f" face="sans-serif"><br>
Date:        </font><font size="1" face="sans-serif">07.02.2018
11:47</font><font size="3"> </font><font size="1" color="#5f5f5f" face="sans-serif"><br>
Subject:        </font><font size="1" face="sans-serif">Calling
virtual elf functions under windows</font><font size="3"> <br>
</font>
<hr noshade><font size="3"><br>
</font><font size="2" face="sans-serif"><br>
Hello everyone reading this,</font><font size="3"> <br>
</font><font size="2" face="sans-serif"><br>
I'm totally confused and need an explanation. I'm also not sure if it's
a clang or a LLVM subject. </font><font size="3"><br>
</font><font size="2" face="sans-serif"><br>
I'm working with Visual Studio 2015, LLVM 5.0.1 and Windows 7 64bit.</font><font size="3">
<br>
</font><font size="2" face="sans-serif"><br>
I have a simple project. With 2 Header files and 1 cpp file.</font><font size="3">
</font><font size="2" face="sans-serif"><br>
"Interface.h"<br>
This file defines a simple class with two pure virtual member functions.</font><font size="3">
<br>
</font><font size="2" face="sans-serif"><br>
"SimpleResult.h"</font><font size="3"> </font><font size="2" face="sans-serif"><br>
This file defines a struct holding an integer</font><font size="3"> <br>
</font><font size="2" face="sans-serif"><br>
"CM_Elf.cpp"</font><font size="3"> </font><font size="2" face="sans-serif"><br>
This file defines a class (CM_Elf) implementing the interface from Interface.h</font><font size="3">
</font><font size="2" face="sans-serif"><br>
Also there is an instance of the class (named "elf").</font><font size="3">
<br>
</font><font size="2" face="sans-serif"><br>
I compile the CM_Elf.cpp to a CM_Elf.bc file via clang-cl but with target
"x86_64-pc-windows-elf"</font><font size="3"> <br>
<br>
</font><font size="2" face="sans-serif"><br>
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><font size="3"> </font><font size="2" face="sans-serif"><br>
I want to call the implemented member functions of "elf".</font><font size="3">
<br>
</font><font size="2" face="sans-serif"><br>
1.) I execute all the global constructors collected by the ExecutionEngine</font><font size="3">
</font><font size="2" face="sans-serif"><br>
-> The constructor of elf gets called</font><font size="3"> </font><font size="2" face="sans-serif"><br>
2.) I use ExecutionEngine to get the address of "elf"</font><font size="3">
</font><font size="2" face="sans-serif"><br>
3.) I use the interface to execute Interface::init</font><font size="3">
</font><font size="2" face="sans-serif"><br>
-> Init gets called</font><font size="3"> </font><font size="2" face="sans-serif"><br>
4.) I use the interface to execute Interface::shutdown</font><font size="3">
</font><font size="2" face="sans-serif"><br>
-> CRASH!</font><font size="3"> <br>
</font><font size="2" face="sans-serif"><br>
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><font size="3"> </font><font size="2" face="sans-serif"><br>
When I compile CM_Elf for target "x86_64-pc-windows-msvc19.0.<wbr>24215"
then it works.</font><font size="3"> <br>
</font><font size="2" face="sans-serif"><br>
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><font size="3">
<br>
</font><font size="2" face="sans-serif"><br>
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><font size="3">
<br>
</font><font size="2" face="sans-serif"><br>
I append some pictures of the code... I hope someone could help me with
this.</font><font size="3"> <br>
</font><font size="2" face="sans-serif"><br>
Kind regards</font><font size="3"> </font><font size="2" face="sans-serif"><br>
Björn</font><font size="3"> </font><font size="2" face="sans-serif"><br>
<br>
</font><font size="3"><br>
<br>
</font><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>
</font><font size="3"><br>
</font><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>
</font>
<br><font size="3"><br>
______________________________<wbr>_________________<br>
cfe-dev mailing list</font><font size="3" color="blue"><u><br>
</u></font><a href="mailto:cfe-dev@lists.llvm.org" target="_blank"><font size="3" color="blue"><u>cfe-dev@lists.llvm.org</u></font></a><font size="3" color="blue"><u><br>
</u></font><a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev" target="_blank"><font size="3" color="blue"><u>http://lists.llvm.org/cgi-bin/<wbr>mailman/listinfo/cfe-dev</u></font></a><font size="3"><br>
</font>
<br>
<br>
<br><font size="2" face="sans-serif"><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></div></div></blockquote></div><br></div></div>