<html>
<head>
<meta content="text/html; charset=utf-8" http-equiv="Content-Type">
</head>
<body bgcolor="#FFFFFF" text="#000000">
<div class="moz-cite-prefix">On 11/3/15 7:54 PM, fateme Hoseini
wrote:<br>
</div>
<blockquote
cite="mid:CAOQsd8YpX9+KmkK6oafX=ZUojzJkzm+Ad+O5hfmY7qVwcunphw@mail.gmail.com"
type="cite">
<meta http-equiv="Context-Type" content="text/html; charset=UTF-8">
<div dir="ltr">Dear John,
<div>Thank you so much for your help. I looked at those
documents. Could you kindly answer the following questions:</div>
<div><br>
</div>
<div>Does it mean that I have to make my own backend target in
order to write a machine pass even if I want to run a simple
machinefunction pass? for example,if I want my pass to get
MIPS instructions as an input, I have to copy all the files
from mips target and add a file to it which implements my
pass. and there should be a way to connect the pass to other
MIPS backend files? <br>
</div>
</div>
</blockquote>
<br>
No, you do not need to create a new backend. All you need to do is
to add your pass to the list of passes that are run when the MIPS
code generator is used.<br>
<br>
In LLVM 3.3, there was a file in the X86 backend that had code to
schedule all the MachineFunctionPass'es when the X86 code generator
was used. That was in lib/Target/X86/X86TargetMachine.cpp. You can
probably find a similar file for LLVM 3.7 for the MIPS backend.<br>
<br>
So, to summarize, you'll add your source file to the MIPS backend,
add a line somewhere to run your pass when the MIPS code generator
is used, and then recompile llvm/lib and llvm/tools/llc.<br>
<br>
<br>
<blockquote
cite="mid:CAOQsd8YpX9+KmkK6oafX=ZUojzJkzm+Ad+O5hfmY7qVwcunphw@mail.gmail.com"
type="cite">
<div dir="ltr">
<div><br>
</div>
<div>As a result, is the way that I described in my first post
completely wrong because I cannot run a stand alone machine
function pass like a frontend function pass?</div>
</div>
</blockquote>
<br>
As far as I know, there is no way to load a MachineFunctionPass and
run it using llc, opt, or clang. I believe you need to compile it
into the MIPS backend code.<br>
<br>
<blockquote
cite="mid:CAOQsd8YpX9+KmkK6oafX=ZUojzJkzm+Ad+O5hfmY7qVwcunphw@mail.gmail.com"
type="cite">
<div dir="ltr">
<div><br>
</div>
<div>Also another question, I'm a PhD student and I'm completely
new to the llvm backend process. I want to estimate my project
time. How long approximately do you think it will take to be
get familiar with backend and be able to write machinefunction
pass? for further steps I have to implement a register
allocation algorithm.</div>
</div>
</blockquote>
<br>
It's difficult to estimate (especially since I haven't implemented
anything as complicated as a register allocator). Your profiling
pass may take anywhere from 1 week to 1 month depending on how
complicated it is. I think a register allocator would take anywhere
from 1 month up to 6 months depending on how robust you need it to
be, but since I've never built one, I can't say for certain.<br>
<br>
Regards,<br>
<br>
John Criswell<br>
<br>
<blockquote
cite="mid:CAOQsd8YpX9+KmkK6oafX=ZUojzJkzm+Ad+O5hfmY7qVwcunphw@mail.gmail.com"
type="cite">
<div dir="ltr">
<div><br>
</div>
<div>Regards,</div>
<div>Fami</div>
<div><br>
</div>
</div>
<div class="gmail_extra"><br>
<div class="gmail_quote">On Tue, Nov 3, 2015 at 3:52 PM, John
Criswell <span dir="ltr"><<a moz-do-not-send="true"
href="mailto:jtcriswel@gmail.com" target="_blank">jtcriswel@gmail.com</a>></span>
wrote:<br>
<blockquote class="gmail_quote">
<div>
<div>Dear Fami,<br>
<br>
A MachineFunctionPass is run by the code generator, so
you can only use it in tools like llc, clang, and
libLTO. The opt program only manipulates LLVM IR and
therefore does not run MachineFunctionPass'es.<br>
<br>
Regarding documentation, have you looked at the
following?<br>
<br>
<a moz-do-not-send="true"
href="http://llvm.org/docs/WritingAnLLVMBackend.html"
target="_blank">http://llvm.org/docs/WritingAnLLVMBackend.html</a><br>
<a moz-do-not-send="true"
href="http://llvm.org/docs/CodeGenerator.html"
target="_blank">http://llvm.org/docs/CodeGenerator.html</a><br>
<a moz-do-not-send="true"
href="http://llvm.org/docs/MIRLangRef.html"
target="_blank">http://llvm.org/docs/MIRLangRef.html</a><br>
<br>
Regards,<br>
<br>
John Criswell
<div>
<div class="h5"><br>
<br>
On 11/3/15 3:47 PM, fateme Hoseini via llvm-dev
wrote:<br>
</div>
</div>
</div>
<blockquote type="cite">
<div>
<div class="h5">
<div dir="ltr">
<div>Hi everyone,</div>
<div>I am a LLVM newbie. I need to write a
machinefunction pass for my project. This should
be an analyzer of the machine code to do some
profiling. I have written a couple of function
passes for front end, but it seems they are
completely different. I searched through forum
and llvm documents, but couldn't find anything
useful or questions were unanswered. Can anyone
reference me to any material on how to do that
or help me with my roblem.</div>
<div><br>
</div>
<div>I have created a folder in: lib/Transform and
put my pass in it.</div>
<div>I am writing a simple pass like this:</div>
<div><br>
</div>
<div>using namespace llvm;</div>
<div><br>
</div>
<div>namespace {</div>
<div><span> </span></div>
<div> struct analyzer : public
MachineFunctionPass {</div>
<div><span> </span>static char ID; </div>
<div><span> </span>analyzer() :
MachineFunctionPass(ID) {}<span> </span> <span>
</span></div>
<div><span> </span></div>
<div><span> </span>virtual bool
runOnMachineFunction(MachineFunction &MF) {<span>
</span></div>
<div><span> </span>errs() << "hello " ;</div>
<div><span> </span></div>
<div><span> </span>return false;<span> </span></div>
<div><span> </span>}</div>
<div> };</div>
<div>}</div>
<div>char analyzer::ID = 0;</div>
<div>static RegisterPass<analyzer>
X("analyzer", "WAW analyzer");</div>
<div><br>
</div>
<div>I make it successfully. But when I load it
for my test code I get this error:</div>
<div><br>
</div>
<div>
<div>Pass 'WAW analyzer' is not initialized.</div>
<div>Verify if there is a pass dependency cycle.</div>
<div>Required Passes:</div>
<div>opt:
/llvm/llvm-3.7/lib/IR/LegacyPassManager.cpp:635:
void
llvm::PMTopLevelManager::schedulePass(llvm::Pass*):
Assertion `PI && "Expected required
passes to be initialized"' failed.</div>
<div>.....</div>
</div>
<div><br>
</div>
<div>I don't know how to solve it? Do we have to
run machinefunction passes with OPT command? Is
this correct to put machinefunction pass in an
external folder or do we have to change some
llvm built-in files? </div>
<div><br>
</div>
<div>Regards,<br>
</div>
<div>Fami</div>
<div><br>
</div>
</div>
<br>
<fieldset></fieldset>
<br>
</div>
</div>
<pre>_______________________________________________
LLVM Developers mailing list
<a moz-do-not-send="true" href="mailto:llvm-dev@lists.llvm.org" target="_blank">llvm-dev@lists.llvm.org</a>
<a moz-do-not-send="true" href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev</a><span class="HOEnZb">
</span></pre>
<span class="HOEnZb"> </span></blockquote>
<span class="HOEnZb"> <br>
<br>
<pre cols="72">--
John Criswell
Assistant Professor
Department of Computer Science, University of Rochester
<a moz-do-not-send="true" href="http://www.cs.rochester.edu/u/criswell" target="_blank">http://www.cs.rochester.edu/u/criswell</a></pre>
</span></div>
</blockquote>
</div>
<br>
</div>
</blockquote>
<br>
<br>
<pre class="moz-signature" cols="72">--
John Criswell
Assistant Professor
Department of Computer Science, University of Rochester
<a class="moz-txt-link-freetext" href="http://www.cs.rochester.edu/u/criswell">http://www.cs.rochester.edu/u/criswell</a></pre>
</body>
</html>