<font size=2 face="sans-serif">Hello Mr. Dietz,</font>
<br>
<br><font size=2 face="sans-serif">I tried using your code and now it works!
I'm happy and surprised! I will now compare the codes and try to spot the
main difference! Thanks for your help!</font>
<br><font size=2 face="sans-serif">Do you know if there is a way to directly
load .obj-Files and resolve the references with own addresses? Like when
somebody used printf in the generated obj-File, but I replace the address
with my own printf?</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">Will Dietz <willdtz@gmail.com></font>
<br><font size=1 color=#5f5f5f face="sans-serif">To:
</font><font size=1 face="sans-serif">bjoern.gaier@horiba.com</font>
<br><font size=1 color=#5f5f5f face="sans-serif">Cc:
</font><font size=1 face="sans-serif">Lang Hames <lhames@gmail.com>,
Clang Dev <cfe-dev@lists.llvm.org></font>
<br><font size=1 color=#5f5f5f face="sans-serif">Date:
</font><font size=1 face="sans-serif">21.04.2017 21:50</font>
<br><font size=1 color=#5f5f5f face="sans-serif">Subject:
</font><font size=1 face="sans-serif">Re: [cfe-dev]
JIT doens't resolve address</font>
<br><font size=1 color=#5f5f5f face="sans-serif">Sent by:
</font><font size=1 face="sans-serif">w@wdtz.org</font>
<br>
<hr noshade>
<br>
<br>
<br><font size=3>Hmm, I tried using your code (copy+pasted and then mass-dumped
headers to fix includes), and it seems to work fine for me:</font>
<br>
<br><a href="https://gist.github.com/dtzWill/df84b64a73001532e3fcfe73a2cffbb9#file-test-log"><font size=3 color=blue><u>https://gist.github.com/dtzWill/df84b64a73001532e3fcfe73a2cffbb9#file-test-log</u></font></a>
<br>
<br><font size=3>Do you get different results when using your LLVM? If
not, can you identify the differences between your code and what I constructed
from your snippets?</font>
<br>
<br><font size=3>I noticed "PAUSE", are you on Windows? I'm not
sure what the functionality/status of the JIT on Windows is, perhaps someone
else can comment on that.</font>
<br>
<br><font size=3>~Will</font>
<br>
<br><font size=3>On Fri, Apr 21, 2017 at 1:03 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">Hello Lang,</font><font size=3> <br>
</font><font size=2 face="sans-serif"><br>
the Code for my jit_main is a normal printf-HelloWorld program. I opended
the file with notepad and found the following:</font><font size=3> <br>
</font>
<table width=100% style="border-collapse:collapse;">
<tr valign=top height=8>
<td width=100% style="border-style:solid solid solid solid;border-color:#000000;border-width:1px 1px 1px 1px;padding:1px 1px;"><font size=2 face="sans-serif">;
Function Attrs: noinline norecurse uwtable</font><font size=3> </font><font size=2 face="sans-serif"><br>
define i32 @main() #0 {</font><font size=3> </font><font size=2 face="sans-serif"><br>
entry:</font><font size=3> </font><font size=2 face="sans-serif"><br>
%retval = alloca i32, align 4</font><font size=3> </font><font size=2 face="sans-serif"><br>
store i32 0, i32* %retval, align 4</font><font size=3> </font><font size=2 face="sans-serif"><br>
%call = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([35
x i8], [35 x i8]* @"\01??_C@_0CD@CMJEAMCD@Planschbeckilein?5sagt?5Halloilein@",
i32 0, i32 0))</font><font size=3> </font><font size=2 face="sans-serif"><br>
%call1 = call i32 @system(i8* getelementptr inbounds ([6 x i8],
[6 x i8]* @"\01??_C@_05DIAHPDGL@PAUSE?$AA@", i32 0, i32 0))</font><font size=3>
</font><font size=2 face="sans-serif"><br>
ret i32 0</font><font size=3> </font><font size=2 face="sans-serif"><br>
}</font></table>
<br><font size=3><br>
</font><font size=2 face="sans-serif"><br>
So... there is a main... Anyway! The code for the main is this one:</font><font size=3>
</font>
<table width=100% style="border-collapse:collapse;">
<tr valign=top height=8>
<td width=100% style="border-style:solid solid solid solid;border-color:#000000;border-width:1px 1px 1px 1px;padding:1px 1px;"><font size=1 color=#808080>#include</font><font size=1>
</font><font size=1 color=#a11f12><stdio.h></font><font size=3> </font><font size=1 color=#808080><br>
#include</font><font size=1> </font><font size=1 color=#a11f12><stdlib.h></font><font size=3>
<br>
</font><font size=1 color=blue><br>
int</font><font size=1> main()</font><font size=3> </font><font size=1><br>
{</font><font size=3> </font><font size=1><br>
printf(</font><font size=1 color=#a11f12>"Planschbeckilein
sagt Halloilein!\n"</font><font size=1>);</font><font size=3> </font><font size=1><br>
system(</font><font size=1 color=#a11f12>"PAUSE"</font><font size=1>);</font><font size=3>
<br>
</font><font size=1><br>
</font><font size=1 color=blue>return</font><font size=1>
0;</font><font size=3> </font><font size=1><br>
}</font></table>
<br><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>
</font><font size=1 color=#5f5f5f face="sans-serif"><br>
From: </font><font size=1 face="sans-serif">Lang
Hames <</font><a href=mailto:lhames@gmail.com target=_blank><font size=1 color=blue face="sans-serif"><u>lhames@gmail.com</u></font></a><font size=1 face="sans-serif">></font><font size=3>
</font><font size=1 color=#5f5f5f face="sans-serif"><br>
To: </font><a href=mailto:bjoern.gaier@horiba.com target=_blank><font size=1 color=blue face="sans-serif"><u>bjoern.gaier@horiba.com</u></font></a><font size=3>
</font><font size=1 color=#5f5f5f face="sans-serif"><br>
Cc: </font><font size=1 face="sans-serif">Clang
Dev <</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=1 face="sans-serif">></font><font size=3>
</font><font size=1 color=#5f5f5f face="sans-serif"><br>
Date: </font><font size=1 face="sans-serif">20.04.2017
22:54</font><font size=3> </font><font size=1 color=#5f5f5f face="sans-serif"><br>
Subject: </font><font size=1 face="sans-serif">Re:
[cfe-dev] JIT doens't resolve address</font><font size=3> <br>
</font>
<hr noshade>
<br><font size=3><br>
<br>
<br>
Hi Bjoern, <br>
<br>
Sorry - I just noticed that the address for your "main" function
has come back as '0'. In this case the answer is even simpler: The JIT
never found the function at all, and so definitely didn't have any external
symbols to resolve, so it never called the resolver. <br>
<br>
A failure to find main has three likely causes: <br>
<br>
(1) jit_main.ll does not define main, <br>
(2) jit_main.ll defines main with private/internal linkage (the JIT can't
see private/internal symbols in general) <br>
(3) jit_main.ll defines main with external linkage, but a system mangling
is applied (e.g. on MacOSX 'main' is mangled to '_main'). The mangler
code in your findSymbol function *should* correct for this, but this
may fail if the default data layout for your TargetMachine varies from
the Module's DataLayout. <br>
<br>
Can you share the contents of your jit_main.ll Module? <br>
<br>
Cheers, <br>
Lang. <br>
<br>
<br>
On Thu, Apr 20, 2017 at 1:35 PM, Lang Hames <</font><a href=mailto:lhames@gmail.com target=_blank><font size=3 color=blue><u>lhames@gmail.com</u></font></a><font size=3>>
wrote: <br>
HI Bjoern, <br>
<br>
There are two kinds of symbol lookup in the JIT: <br>
<br>
(1) You want to find a symbol defined JIT'd code. This is what "findSymbol"
on the JIT class does. <br>
<br>
(2) The JIT wants to fix up a module that contains references to symbols
defined elsewhere (either in your program, or in other JIT'd code). This
is the SymbolResolver's job. <br>
<br>
So assuming your main function in main.ll is trivial, e.g. <br>
</font><tt><font size=3><br>
int main() {</font></tt><font size=3> </font><tt><font size=3><br>
return 0;</font></tt><font size=3> </font><tt><font size=3><br>
}</font></tt><font size=3> <br>
<br>
then your findSymbol call will return the address of the JIT'd main without
ever needing to look anything up in the resolver. <br>
<br>
If, on the other hand, your main function contains an external reference,
e.g. <br>
</font><tt><font size=3><br>
int main() {</font></tt><font size=3> </font><tt><font size=3><br>
printf("Hello, World!"); // Reference to externally defined
function printf.</font></tt><font size=3> </font><tt><font size=3><br>
return 0;</font></tt><font size=3> </font><tt><font size=3><br>
}</font></tt><font size=3> <br>
<br>
Then you'll receive a call back on your resolver looking for the address
of printf. <br>
<br>
Hope this helps! <br>
<br>
Cheers, <br>
Lang. <br>
<br>
On Thu, Apr 20, 2017 at 6:43 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><font size=2 face="sans-serif"><br>
Hello LLVM-World,</font><font size=3> </font><font size=2 face="sans-serif"><br>
<br>
I was following the "Building a JIT in LLVM"-Tutorial and tried
to load a normal main. My code is the following:</font><font size=3> </font>
<table width=100% style="border-collapse:collapse;">
<tr valign=top height=8>
<td width=100% style="border-style:solid solid solid solid;border-color:#000000;border-width:1px 1px 1px 1px;padding:1px 1px;"><font size=1 color=blue>class</font><font size=1>
</font><font size=1 color=#4181c0>Jitter</font><font size=3> </font><font size=1><br>
{</font><font size=3> </font><font size=1 color=blue><br>
private</font><font size=1>:</font><font size=3> </font><font size=1><br>
std::</font><font size=1 color=#4181c0>unique_ptr</font><font size=1><</font><font size=1 color=#4181c0>TargetMachine</font><font size=1>>
TM;</font><font size=3> </font><font size=1><br>
</font><font size=1 color=blue>const</font><font size=1> </font><font size=1 color=#4181c0>DataLayout</font><font size=1>
DL;</font><font size=3> </font><font size=1><br>
</font><font size=1 color=#4181c0>ObjectLinkingLayer</font><font size=1><>
ObjectLayer;</font><font size=3> </font><font size=1><br>
</font><font size=1 color=#4181c0>IRCompileLayer</font><font size=1><</font><font size=1 color=blue>decltype</font><font size=1>(ObjectLayer)>
CompileLayer;</font><font size=3> </font><font size=1 color=blue><br>
<br>
public</font><font size=1>:</font><font size=3> </font><font size=1><br>
</font><font size=1 color=blue>typedef</font><font size=1> </font><font size=1 color=blue>decltype</font><font size=1>(CompileLayer)::</font><font size=1 color=#4181c0>ModuleSetHandleT</font><font size=1>
</font><font size=1 color=#4181c0>ModuleHandle</font><font size=1>;</font><font size=3>
</font><font size=1><br>
<br>
Jitter() : TM(</font><font size=1 color=#4181c0>EngineBuilder</font><font size=1>().selectTarget()),
DL(TM</font><font size=1 color=#008080>-></font><font size=1>createDataLayout()),</font><font size=3>
</font><font size=1><br>
CompileLayer(ObjectLayer, </font><font size=1 color=#4181c0>SimpleCompiler</font><font size=1>(</font><font size=1 color=#008080>*</font><font size=1>TM))
<br>
{printf(</font><font size=1 color=#a11f12>"!"</font><font size=1>);</font><font size=3>
</font><font size=1><br>
llvm::sys::</font><font size=1 color=#4181c0>DynamicLibrary</font><font size=1>::LoadLibraryPermanently(</font><font size=1 color=blue>nullptr</font><font size=1>);</font><font size=3>
</font><font size=1><br>
}</font><font size=3> </font><font size=1><br>
<br>
</font><font size=1 color=#4181c0>TargetMachine</font><font size=1>
&getTargetMachine() { </font><font size=1 color=blue>return</font><font size=1>
</font><font size=1 color=#008080>*</font><font size=1>TM; }</font><font size=3>
</font><font size=1><br>
<br>
</font><font size=1 color=#4181c0>ModuleHandle</font><font size=1>
addModule(std::</font><font size=1 color=#4181c0>unique_ptr</font><font size=1><</font><font size=1 color=#4181c0>Module</font><font size=1>>
&&</font><font size=1 color=#808080>M</font><font size=1>) {</font><font size=3>
</font><font size=1><br>
</font><font size=1 color=#008000>// Build our symbol resolver:</font><font size=3>
</font><font size=1><br>
</font><font size=1 color=#008000>// Lambda 1: Look back into the
JIT itself to find symbols that are part of</font><font size=3> </font><font size=1><br>
</font><font size=1 color=#008000>//
the same "logical dylib".</font><font size=3> </font><font size=1><br>
</font><font size=1 color=#008000>// Lambda 2: Search for external
symbols in the host process.</font><font size=3> </font><font size=1><br>
</font><font size=1 color=blue>auto</font><font size=1> Resolver
= createLambdaResolver(</font><font size=3> </font><font size=1><br>
[&](</font><font size=1 color=blue>const</font><font size=1>
std::</font><font size=1 color=#4181c0>string</font><font size=1> &</font><font size=1 color=#808080>Name</font><font size=1>)
<br>
{</font><font size=3> </font><font size=1><br>
printf(</font><font size=1 color=#a11f12>"FLUSH
:0\n"</font><font size=1>);</font><font size=3> </font><font size=1><br>
<br>
</font><font size=1 color=blue>if</font><font size=1>
(</font><font size=1 color=blue>auto</font><font size=1> Sym = CompileLayer.findSymbol(</font><font size=1 color=#808080>Name</font><font size=1>,
</font><font size=1 color=blue>false</font><font size=1>))</font><font size=3>
</font><font size=1><br>
</font><font size=1 color=blue>return</font><font size=1>
Sym;</font><font size=3> </font><font size=1><br>
</font><font size=1 color=blue>return</font><font size=1>
</font><font size=1 color=#4181c0>JITSymbol</font><font size=1>(</font><font size=1 color=blue>nullptr</font><font size=1>);</font><font size=3>
</font><font size=1><br>
},</font><font size=3> </font><font size=1><br>
[](</font><font size=1 color=blue>const</font><font size=1>
std::</font><font size=1 color=#4181c0>string</font><font size=1> &</font><font size=1 color=#808080>S</font><font size=1>)
<br>
{</font><font size=3> </font><font size=1><br>
printf(</font><font size=1 color=#a11f12>"PLUSH
:0\n"</font><font size=1>);</font><font size=3> </font><font size=1><br>
<br>
</font><font size=1 color=blue>if</font><font size=1>
(</font><font size=1 color=blue>auto</font><font size=1> SymAddr =</font><font size=3>
</font><font size=1><br>
</font><font size=1 color=#4181c0>RTDyldMemoryManager</font><font size=1>::getSymbolAddressInProcess(</font><font size=1 color=#808080>S</font><font size=1>))</font><font size=3>
</font><font size=1><br>
</font><font size=1 color=blue>return</font><font size=1>
</font><font size=1 color=#4181c0>JITSymbol</font><font size=1>(SymAddr,
</font><font size=1 color=#4181c0>JITSymbolFlags</font><font size=1>::</font><font size=1 color=#37605e>Exported</font><font size=1>);</font><font size=3>
</font><font size=1><br>
</font><font size=1 color=blue>return</font><font size=1>
</font><font size=1 color=#4181c0>JITSymbol</font><font size=1>(</font><font size=1 color=blue>nullptr</font><font size=1>);</font><font size=3>
</font><font size=1><br>
});</font><font size=3> </font><font size=1><br>
<br>
</font><font size=1 color=#008000>// Build a singleton module set
to hold our module.</font><font size=3> </font><font size=1><br>
std::</font><font size=1 color=#4181c0>vector</font><font size=1><std::</font><font size=1 color=#4181c0>unique_ptr</font><font size=1><</font><font size=1 color=#4181c0>Module</font><font size=1>>>
Ms;</font><font size=3> </font><font size=1><br>
Ms.push_back(std::move(</font><font size=1 color=#808080>M</font><font size=1>));</font><font size=3>
</font><font size=1><br>
<br>
</font><font size=1 color=#008000>// Add the set to the JIT with
the resolver we created above and a newly</font><font size=3> </font><font size=1><br>
</font><font size=1 color=#008000>// created SectionMemoryManager.</font><font size=3>
</font><font size=1><br>
</font><font size=1 color=blue>return</font><font size=1> CompileLayer.addModuleSet(std::move(Ms),</font><font size=3>
</font><font size=1><br>
make_unique<</font><font size=1 color=#4181c0>SectionMemoryManager</font><font size=1>>(),</font><font size=3>
</font><font size=1><br>
std::move(Resolver));</font><font size=3>
</font><font size=1><br>
}</font><font size=3> </font><font size=1 color=#4181c0><br>
<br>
JITSymbol</font><font size=1> findSymbol(</font><font size=1 color=blue>const</font><font size=1>
std::</font><font size=1 color=#4181c0>string</font><font size=1> </font><font size=1 color=#808080>Name</font><font size=1>)
{</font><font size=3> </font><font size=1><br>
std::</font><font size=1 color=#4181c0>string</font><font size=1>
MangledName;</font><font size=3> </font><font size=1><br>
</font><font size=1 color=#4181c0>raw_string_ostream</font><font size=1>
MangledNameStream(MangledName);</font><font size=3> </font><font size=1><br>
</font><font size=1 color=#4181c0>Mangler</font><font size=1>::getNameWithPrefix(MangledNameStream,
</font><font size=1 color=#808080>Name</font><font size=1>, DL);</font><font size=3>
</font><font size=1><br>
printf(</font><font size=1 color=#a11f12>"Tzearch for: %s\n\n"</font><font size=1>,
MangledNameStream.str());</font><font size=3> </font><font size=1><br>
</font><font size=1 color=blue>return</font><font size=1> CompileLayer.findSymbol(MangledNameStream.str(),
</font><font size=1 color=blue>false</font><font size=1>);</font><font size=3>
</font><font size=1><br>
}</font><font size=3> </font><font size=1 color=blue><br>
<br>
void</font><font size=1> removeModule(</font><font size=1 color=#4181c0>ModuleHandle</font><font size=1>
</font><font size=1 color=#808080>H</font><font size=1>) {</font><font size=3>
</font><font size=1><br>
CompileLayer.removeModuleSet(</font><font size=1 color=#808080>H</font><font size=1>);</font><font size=3>
</font><font size=1><br>
}</font><font size=3> </font><font size=1><br>
<br>
};</font></table>
<br><font size=2 face="sans-serif"><br>
<br>
<br>
And calling from main with:</font>
<table width=100% style="border-collapse:collapse;">
<tr valign=top height=8>
<td width=100% style="border-style:solid solid solid solid;border-color:#000000;border-width:1px 1px 1px 1px;padding:1px 1px;"><font size=1 color=blue>int</font><font size=1>
main()</font><font size=3> </font><font size=1><br>
{</font><font size=3> </font><font size=1><br>
llvm::InitializeNativeTarget();</font><font size=3>
</font><font size=1><br>
llvm::InitializeNativeTargetAsmPrinter();</font><font size=3>
</font><font size=1><br>
llvm::InitializeNativeTargetAsmParser();</font><font size=3>
</font><font size=1><br>
<br>
llvm::</font><font size=1 color=#4181c0>LLVMContext</font><font size=1>
context;</font><font size=3> </font><font size=1><br>
llvm::</font><font size=1 color=#4181c0>SMDiagnostic</font><font size=1>
dia;</font><font size=3> </font><font size=1><br>
<br>
std::</font><font size=1 color=#4181c0>unique_ptr</font><font size=1><llvm::</font><font size=1 color=#4181c0>Module</font><font size=1>>
M = llvm::parseIRFile(</font><font size=1 color=#a11f12>"./jit_main.ll"</font><font size=1>,
dia, context);</font><font size=3> </font><font size=1><br>
</font><font size=1 color=#4181c0>Jitter</font><font size=1>
jit;</font><font size=3> </font><font size=1><br>
printf(</font><font size=1 color=#a11f12>"Wuff?"</font><font size=1>);</font><font size=3>
</font><font size=1><br>
</font><font size=1 color=#4181c0>Jitter</font><font size=1>::</font><font size=1 color=#4181c0>ModuleHandle</font><font size=1>
h = jit.addModule(std::move(M));</font><font size=3> </font><font size=1><br>
printf(</font><font size=1 color=#a11f12>"KNUFF!\n"</font><font size=1>);</font><font size=3>
</font><font size=1><br>
<br>
printf(</font><font size=1 color=#a11f12>"Kuchen!
0x%p\n"</font><font size=1>, jit.findSymbol(</font><font size=1 color=#a11f12>"main"</font><font size=1>).getAddress());</font><font size=3>
</font><font size=1><br>
<br>
system(</font><font size=1 color=#a11f12>"PAUSE"</font><font size=1>);</font><font size=3>
</font><font size=1><br>
</font><font size=1 color=blue>return</font><font size=1>
0;</font><font size=3> </font><font size=1><br>
}</font></table>
<br><font size=2 face="sans-serif"><br>
<br>
The Code runs without a fail, but when the programm tries to resolve "main"
the address is 0. The strange thing: the printf "</font><font size=1 color=#a11f12>FLUSH
:0\n</font><font size=2 face="sans-serif">" and "</font><font size=1 color=#a11f12>PLUSH
:0\n</font><font size=2 face="sans-serif">" are never called, so did
the code never compiled? What I'm doing wrong?</font><font size=3> </font><font size=2 face="sans-serif"><br>
<br>
Kind regards</font><font size=3> </font><font size=2 face="sans-serif"><br>
Björn<br>
Als GmbH eingetragen im Handelsregister Bad Homburg v.d.H. HRB 9816, USt.ID-Nr.
DE 114 165 789<br>
Geschäftsführer: Hiroshi Kawamura, Dr Hiroshi Nakamura, Markus Bode, Heiko
Lampert, Takashi Nagano, Takeshi Fukushima.</font><font size=3> <br>
_______________________________________________<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/mailman/listinfo/cfe-dev</u></font></a><font size=3><br>
<br>
<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: Hiroshi Kawamura, Dr Hiroshi Nakamura, Markus Bode, Heiko
Lampert, Takashi Nagano, Takeshi Fukushima.</font>
<br><font size=3><br>
_______________________________________________<br>
cfe-dev mailing list</font><font size=3 color=blue><u><br>
</u></font><a href="mailto:cfe-dev@lists.llvm.org"><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/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: Hiroshi Kawamura, Dr Hiroshi Nakamura, Markus Bode, Heiko
Lampert, Takashi Nagano, Takeshi Fukushima.</font>