[llvm-dev] Confused on how to do a machinefunction pass

fateme Hoseini via llvm-dev
Wed, 04 Nov 2015 00:54:53 -0000

Dear John,
Thank you so much for your help. I looked at those documents. Could you
kindly answer the following questions:

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?

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?

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.

Regards,
Fami


On Tue, Nov 3, 2015 at 3:52 PM, John Criswell <jtcriswel at gmail.com>
wrote:

> Dear Fami,
>
> 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.
>
> Regarding documentation, have you looked at the following?
>
> http://llvm.org/docs/WritingAnLLVMBackend.html
> http://llvm.org/docs/CodeGenerator.html
> http://llvm.org/docs/MIRLangRef.html
>
> Regards,
>
> John Criswell
>
>
> On 11/3/15 3:47 PM, fateme Hoseini via llvm-dev wrote:
>
> Hi everyone,
> 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.
>
> I have created a folder in: lib/Transform and put my pass in it.
> I am writing a simple pass like this:
>
> using namespace llvm;
>
> namespace {
>     struct analyzer : public MachineFunctionPass {
> static char ID;
> analyzer() : MachineFunctionPass(ID) {}
> virtual bool runOnMachineFunction(MachineFunction &MF) {
> errs() << "hello " ;
> return false;
> }
>   };
> }
> char analyzer::ID = 0;
> static RegisterPass<analyzer> X("analyzer", "WAW
analyzer");
>
> I make it successfully. But when I load it for my test code I get this
> error:
>
> Pass 'WAW analyzer' is not initialized.
> Verify if there is a pass dependency cycle.
> Required Passes:
> 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.
> .....
>
> 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?
>
> Regards,
> Fami
>
>
>
> _______________________________________________
> LLVM Developers mailing listllvm-dev at
lists.llvm.orghttp://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev
>
>
>
> --
> John Criswell
> Assistant Professor
> Department of Computer Science, University of
Rochesterhttp://www.cs.rochester.edu/u/criswell
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL:
<http://lists.llvm.org/pipermail/llvm-dev/attachments/20151103/cd75b402/attachment.html>