<html>
<head>
<meta content="text/html; charset=ISO-8859-1"
http-equiv="Content-Type">
</head>
<body bgcolor="#FFFFFF" text="#000000">
On 7/8/11 4:49 PM, Andrew Ruef wrote:
<blockquote
cite="mid:CAMaQ4+ddQouZzhbAqgM6E+ss4tRQYWxZMHE1B7ggyNdfsJbOZg@mail.gmail.com"
type="cite">
<meta http-equiv="Content-Type" content="text/html;
charset=ISO-8859-1">
I investigated the MachineFunctionPass (that is
runOnMachineFunction, I believe).</blockquote>
<br>
A MachineFunctionPass is a class that you inherit from to write a
transform that operates on MachineInstrs (i.e., native code
instructions generated from the LLVM IR instructions). The
runOnMachineFunction() method is its entry point (i.e., the code
generator calls runOnMachineFunction() for each MachineFunctionPass
that it runs.<br>
<br>
<blockquote
cite="mid:CAMaQ4+ddQouZzhbAqgM6E+ss4tRQYWxZMHE1B7ggyNdfsJbOZg@mail.gmail.com"
type="cite"> In my experimentation it didn't seem that the
MachineFrameInfo was populated (it consistently said that the
stack depth was 0, for example). I might have been doing something
wrong? <br>
</blockquote>
<br>
Is it possible that the function being compiled had a zero-sized
stack frame? If it has no spill slots or alloca instructions, and
if the function parameters are not part of the stack frame, then it
seems possible for the frame size to be zero to me.<br>
<br>
You might also want to check and see if you're running your
MachineFunctionPass at the right stage. Perhaps some other
MachineFunctionPass creates the FrameInfo objects and had not been
run when your MachineFunctionPass was run?<br>
<br>
Unfortunately, the code generator framework is mostly beyond what I
know. I only understand parts of it because I assisted a student in
using it for a project. I'm hoping those more knowledgeable can
chime in. If they don't, I can forward your question to the
aforementioned student (he's not a regular on llvmdev, sadly).<br>
<br>
-- John T.<br>
<br>
<blockquote
cite="mid:CAMaQ4+ddQouZzhbAqgM6E+ss4tRQYWxZMHE1B7ggyNdfsJbOZg@mail.gmail.com"
type="cite">
<br>
<div class="gmail_quote">On Fri, Jul 8, 2011 at 5:21 PM, John
Criswell <span dir="ltr"><<a moz-do-not-send="true"
href="mailto:criswell@illinois.edu">criswell@illinois.edu</a>></span>
wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0
.8ex;border-left:1px #ccc solid;padding-left:1ex;">
<div bgcolor="#FFFFFF" text="#000000">
<div>
<div class="h5"> On 7/8/11 4:09 PM, Andrew Ruef wrote:
<blockquote type="cite"> Hi list,
<div><br>
</div>
<div>I am trying to implement the technique outlined
in the following paper: <a moz-do-not-send="true"
href="http://www.cs.umd.edu/%7Emwh/papers/martin10ownership.html"
target="_blank">http://www.cs.umd.edu/~mwh/papers/martin10ownership.html</a> in
LLVM. My approach so far involves the use of an IR
level transform (via runOnFunction) to identify
memory loads and stores. One thing I need to do (I
am pretty sure I need to do it at least) is
automatically mark each stack frame as "owned" by
the current thread. </div>
<div><br>
</div>
<div>I'm not sure where the best place in the LLVM
architecture to do this is. As I currently
understand it, the concept of a stack frame appears
pretty late in target code generation. I've hacked
in a hook for this in X86FrameLowering.cpp in the
emitPrologue and emitEpilogue methods. </div>
<div><br>
</div>
<div>Is there a cleaner way I can do this? Is there a
way I can subclass the X86 code generator to "hook"
those two methods and insert my instrumentation? Is
there something I'm missing with
runOnMachineFunction? <br>
</div>
</blockquote>
<br>
</div>
</div>
I'm stepping beyond what I know a little bit, but have you
looked at writing a MachineFunctionPass? A student here at
Illinois wrote a MachineFunctionPass to insert additional
epilogue code into functions. Assuming that it's possible,
putting your functionality into a MachineFunctionPass should
be cleaner than modifying the code generator directly
(MachineFunctionPass'es may even be load-able into llc).<br>
<br>
Check out the doxygen docs for MachineFunctionPass (<a
moz-do-not-send="true"
href="http://llvm.org/doxygen/classllvm_1_1MachineFunctionPass.html"
target="_blank">http://llvm.org/doxygen/classllvm_1_1MachineFunctionPass.html</a>),
MachineFunction (<a moz-do-not-send="true"
href="http://llvm.org/doxygen/classllvm_1_1MachineFunction.html"
target="_blank">http://llvm.org/doxygen/classllvm_1_1MachineFunction.html</a>),
and MachineFrameInfo (<a moz-do-not-send="true"
href="http://llvm.org/doxygen/classllvm_1_1MachineFrameInfo.html"
target="_blank">http://llvm.org/doxygen/classllvm_1_1MachineFrameInfo.html</a>).<br>
<br>
-- John T.<br>
<br>
<blockquote type="cite">
<div><br>
</div>
<div>Thank you, <br>
<div><br>
</div>
<div>Andrew</div>
</div>
<br>
<fieldset></fieldset>
<br>
<pre>_______________________________________________
LLVM Developers mailing list
<a moz-do-not-send="true" href="mailto:LLVMdev@cs.uiuc.edu" target="_blank">LLVMdev@cs.uiuc.edu</a> <a moz-do-not-send="true" href="http://llvm.cs.uiuc.edu" target="_blank">http://llvm.cs.uiuc.edu</a>
<a moz-do-not-send="true" href="http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev</a>
</pre>
</blockquote>
<br>
</div>
</blockquote>
</div>
<br>
</blockquote>
<br>
</body>
</html>