<div dir="ltr"><div><div><div><div><div>Basic Object Oriented design uses a derived class to implement a functionality of the generic case. It's the same basic principle as:<br><br></div>class Animal<br>{<br></div>    void virtual Say() = 0;<br>};<br><br></div>class Cat: public Animal<br>{<br></div>    void Say() override { cout << "Meow!" << endl; }<br>}<br><br>class Dog: public Animal<br>{<br>    void Say() override { cout << "Woof!" << endl; }<br>}<br><br>class Fish: public Animal<br>{<br>    void Say() override { cout << "Blub!" << endl; }<br>}<br><br></div><div>In this case, different types of COFF-architectures use different relocation entries, and based on the architecture, a specific implementation of the RelocationDyldCOFF class is created to perform the relocation.<br><br></div><div>See <a href="http://llvm.org/docs/doxygen/html/classllvm_1_1RuntimeDyldCOFF.html">http://llvm.org/docs/doxygen/html/classllvm_1_1RuntimeDyldCOFF.html</a> for a class diagram of how this is done.<br><br></div><div>The generic code in RuntimeDyld*.cpp only knows that relocations exists, and that they need to be dealt with. Not HOW to actually perform the relocation - just like "Animal" doesn't know what a cat or a dog "says". The processRelocationRef() is called here:<br><a href="http://llvm.org/docs/doxygen/html/RuntimeDyld_8cpp_source.html#l00251">http://llvm.org/docs/doxygen/html/RuntimeDyld_8cpp_source.html#l00251</a><br><br></div><div>Again, it's not clear exactly what you are asking for, so I'm not sure whether my explanation is helpful or not...<br><br>--<br></div><div>Mats<br></div><div><br></div></div><div class="gmail_extra"><br><div class="gmail_quote">On 20 April 2017 at 12:05, Siddharth Shankar Swain <span dir="ltr"><<a href="mailto:h2015096@pilani.bits-pilani.ac.in" target="_blank">h2015096@pilani.bits-pilani.ac.in</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div><div>Thanks for the reply. I was just asking about in general whatever header files are there in Targets/ for different architectures are not including any function except this processRelocationRef() to be used in RuntimeDyldELF.cpp or RuntimeDyldCOFF.cpp or RuntimeDyldMachO.cpp and i think these files are the ones which are actually doing the relocation and linking work. So what purpose do these header files inside Targets/ actually serve. Also they include exception handling in form of exception frames, So can u guide on this issue ?<br><br></div>Thanks,<br></div>Siddharth<br></div><div class="HOEnZb"><div class="h5"><div class="gmail_extra"><br><div class="gmail_quote">On Thu, Apr 20, 2017 at 4:02 PM, mats petersson <span dir="ltr"><<a href="mailto:mats@planetcatfish.com" target="_blank">mats@planetcatfish.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div>The x86_64 and i386 architectures have different actual relocation records. So if you build code for i386, you need one processRelocationRef() function (handling the relevant relocations in that model), and when producing code for x86_64, there are different relocation records. The two files contain the derived form of the class that processes the relocation records when dynamically loading JITed code in LLVM - mainly implementing the two different forms of symbol entries that refer to the relocations - i386 uses COFF::IMAGE_REL_I386_*, in x86_64 the relocation types are COFF::IMAGE_REL_AMD64_*.<br><br></div><div>Conceptually, they do the same thing, it's the details of exactly how and where the relocation ends up and how it's recorded by the linker that differs.<br><br></div><div>Theoretically, one could probably construct a loadable file that doesn't care what architecture it is for, but it would end up with a lot of redundant & overlapping functionality, and the code to handle every different architecture in one huge switch-statement would be rather complex (and long!). So splitting the functionality per architecture helps make the code clear. <br><br></div><div>If you need further help to understand the code, you'll probably need to ask a more concrete question, as it is probably not possible to describe all the relevant information on this subject in less than 200 pages, never mind a simple email-thread.<br><br>--<br></div><div>Mats<br></div></div><div class="gmail_extra"><br><div class="gmail_quote"><div><div class="m_-3714245030167602297h5">On 20 April 2017 at 11:13, Siddharth Shankar Swain via llvm-dev <span dir="ltr"><<a href="mailto:llvm-dev@lists.llvm.org" target="_blank">llvm-dev@lists.llvm.org</a>></span> wrote:<br></div></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div><div class="m_-3714245030167602297h5"><div dir="ltr"><div><div><div>Hi,<br></div>Can anyone explain in lib/ExecutionEngine/RuntimeDyl<wbr>d/Targets/ the header files included for different architectures like RuntimeDyldCOFFX86_64.h or RuntimeDyldCOFFI386.h etc, what is the connection of these files for relocation and linking as the linking and relocation for diff architecture is done in RuntimeDyldELF.cpp, RuntimeDyldCOFF.cpp  and it doesn't use any function from these header file except the processRelocationRef(). The header files in Targets/ also handles exceptions, so what is the need for that in relocation and linking process ? Also please help with what this processRelocationRef() actually does ? . Please guide.<br><br></div>sincerely,<br></div>Siddharth<br></div>
<br></div></div>______________________________<wbr>_________________<br>
LLVM Developers mailing list<br>
<a href="mailto:llvm-dev@lists.llvm.org" target="_blank">llvm-dev@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/<wbr>mailman/listinfo/llvm-dev</a><br>
<br></blockquote></div><br></div>
</blockquote></div><br></div>
</div></div></blockquote></div><br></div>