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

fateme Hoseini via llvm-dev llvm-dev at lists.llvm.org
Wed Nov 18 13:02:54 PST 2015


I fixed the problem. I have to make clean the target folder everytime, then
make it again.

On Tue, Nov 17, 2015 at 11:48 AM, fateme Hoseini <hoseini.f at gmail.com>
wrote:

> I noticed something else, I just made a change to my x86 wawanalyzer and
> make it again. And I can't see the change in my output. So the problem is
> with all my targets.
> After I ran my first sunctionpass in x86, I needed to crosscopmpile LLVM
> so I ran the following instructions a couple of days ago:
> $ cd <llvm_build_dir>
> $ <PATH_TO_SOURCE>/configure --enable-targets=arm --disable-optimized
> --prefix=/usr/local/llvm-arm --target=armv7a-unknown-linux-gnueabi
> $ make && sudo make install
> Does my problem have to do something with these instructions?
>
> On Tue, Nov 17, 2015 at 11:29 AM, fateme Hoseini <hoseini.f at gmail.com>
> wrote:
>
>> Yes, I have done exactly the same. The wawanalyzer is the same. I changed
>> ARM.h and ARMTargetMachine.cpp in the tager/arm folder. then I make
>> tool/llc and lib folder.
>>
>> On Tue, Nov 17, 2015 at 10:55 AM, John Criswell <jtcriswel at gmail.com>
>> wrote:
>>
>>> On 11/17/15 12:16 AM, fateme Hoseini via llvm-dev wrote:
>>>
>>> Hi,
>>> So, I run my pass in X86 target with llc command and it printed out
>>> "hello****". Now I am trying to do the same pass for ARM target. So I did
>>> exactly what I did for X86 as mentioned in my previous posts. When I run
>>> the following command:
>>>
>>>
>>> Have you modified the ARM code generator to run your pass (the same way
>>> that you modified the X86 code generator to run your pass)?
>>>
>>> Each backend has code that configures the set of MachineFunctionPass'es
>>> to run when that code generator is used.  For each backend, you must modify
>>> that code to run your MachineFunctionPass.
>>>
>>> Regards,
>>>
>>> John Criswell
>>>
>>>
>>> llc -march=arm test.ll -o test
>>> nothing prints out. I did the same for MIPS target too and I got no
>>> result. Can anyone tell me what I'm doing wrong. Is there any difference
>>> between writing machinefunction passes in x86 and other targets?
>>> Thank you,
>>> Fami
>>>
>>> On Fri, Nov 6, 2015 at 10:56 AM, fateme Hoseini <hoseini.f at gmail.com>
>>> wrote:
>>>
>>>> Hi
>>>> So I m trying to write my first backend pass. I created a file in
>>>> target\x86\wawanalyzer.cpp based on hexagonHardwareLoops.cpp file. Now it's
>>>> just a simple file that prints hello to the output. I have attached the
>>>> file to this post.
>>>>
>>>> Then I did the following:
>>>>
>>>> 1. add "FunctionPass *createwawAnalyzer();" line to x86.h
>>>> 2. add file name to CMakelist.txt.
>>>> 3. This is going to run after postRAscheduler and before code emission
>>>> so I changed the x86TrgetMachine.cpp as follow:
>>>> void X86PassConfig::addPreEmitPass() {
>>>> /////////////add mypass here///////
>>>>   addPass(createwawAnalyzer());
>>>> //////////////////////////////////
>>>>   if (getOptLevel() != CodeGenOpt::None)
>>>>     addPass(createExecutionDependencyFixPass(&X86::VR128RegClass));
>>>>
>>>>   if (UseVZeroUpper)
>>>>     addPass(createX86IssueVZeroUpperPass());
>>>>
>>>>   if (getOptLevel() != CodeGenOpt::None) {
>>>>     addPass(createX86PadShortFunctions());
>>>>     addPass(createX86FixupLEAs());
>>>>   }
>>>> then I run make on mypass and remake  llvm3.7\lib and llvm3.7\tool\llc.
>>>> but when I run llc -help it doesn't show my pass. Did I miss some steps
>>>> or did something wrong? What's the correct way to run the pass with llc
>>>> command?
>>>>
>>>> I appreciate any help,
>>>> Regards
>>>> Fami
>>>>
>>>> On Wed, Nov 4, 2015 at 1:02 PM, fateme Hoseini < <hoseini.f at gmail.com>
>>>> hoseini.f at gmail.com> wrote:
>>>>
>>>>> Thank you so much.
>>>>> That helped alot.
>>>>>
>>>>> Fami
>>>>>
>>>>> On Wed, Nov 4, 2015 at 9:40 AM, John Criswell < <jtcriswel at gmail.com>
>>>>> jtcriswel at gmail.com> wrote:
>>>>>
>>>>>> On 11/3/15 7:54 PM, fateme Hoseini wrote:
>>>>>>
>>>>>> 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?
>>>>>>
>>>>>>
>>>>>> 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.
>>>>>>
>>>>>> 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.
>>>>>>
>>>>>> 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.
>>>>>>
>>>>>>
>>>>>>
>>>>>> 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?
>>>>>>
>>>>>>
>>>>>> 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.
>>>>>>
>>>>>>
>>>>>> 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.
>>>>>>
>>>>>>
>>>>>> 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.
>>>>>>
>>>>>> Regards,
>>>>>>
>>>>>> John Criswell
>>>>>>
>>>>>>
>>>>>>
>>>>>> Regards,
>>>>>> Fami
>>>>>>
>>>>>>
>>>>>> On Tue, Nov 3, 2015 at 3:52 PM, John Criswell < <jtcriswel at gmail.com>
>>>>>> 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/WritingAnLLVMBackend.html
>>>>>>> <http://llvm.org/docs/CodeGenerator.html>
>>>>>>> http://llvm.org/docs/CodeGenerator.html
>>>>>>> <http://llvm.org/docs/MIRLangRef.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
>>>>>>>
>>>>>>>
>>>>>>
>>>>>>
>>>>>> --
>>>>>> John Criswell
>>>>>> Assistant Professor
>>>>>> Department of Computer Science, University of Rochesterhttp://www.cs.rochester.edu/u/criswell
>>>>>>
>>>>>>
>>>>>
>>>>
>>>
>>>
>>> _______________________________________________
>>> 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/20151118/4537e264/attachment.html>


More information about the llvm-dev mailing list