Seyyid Hikmet Çelik via llvm-dev
2021-May-26 00:50 UTC
[llvm-dev] How To Emit an LLVM IR or Object Code From A Source Code Inside A Tool
Hi everyone, I am kind of a newbie here, working on llvm as a undergraduate student and I am struggling about some situations. Yet I can write meaningless passes, working tools by copying or trying to porting from llvm source and know how to build them. I am searching on the web, using https://llvm.org/doxygen to understand some functions, classes and how I can integrate these kind of things in my experimental codes but I think that I can't go any further now that's why I am writing this e-mail and probably more comes for different questions. I am trying to write a tool which will get target triple as a command option and a C or C++ code, will emit and change LLVM IR code (maybe adding a pass or meaningless operation for now :) ) inside, will emit and change object code from changed LLVM IR, and lastly will give output as an executable file. Example tool in summary as I thought: Usage (I can add some command line options later): mytool --triple riscv32 example.c Sequence of this complete tool: Run Tool --> Get Target Triple --> Emit LLVM IR code from source code --> Change LLVM IR code --> Emit Object Code --> Change Object Code --> Give Executable File Output For this, firstly I thought implement to get file and target triple (If I am mistaken or incomplete you can warn): #include "llvm/Support/CommandLine.h" static cl::list<std::string> InputFilenames(cl::Positional, cl::desc("<input files>"),cl::ZeroOrMore); extern cl::opt<std::string> TripleName; cl::opt<std::string> llvm::TripleName("triple", cl::desc("target triple")); Suppose that I did more coding and get source code file in main function, after that how can I emit LLVM IR or object code inside and apply on some operations? I am asking this because for example we can use a pass in command line as: opt -load libMyPass.so -mypass example.ll -o output.ll or in clang with -Xclang -load -Xclang option. or this is more proper example: clang -mem2reg example.ll -o output.ll And we can also use these passes in our codes (in other passes or tools): static std::unique_ptr<legacy::FunctionPassManager> TheFPM; TheFPM->add(createPromoteMemoryToRegisterPass()); TheFPM->run(*TheFunction); (TheFunction should be declared before.) or maybe addPass function (I am not sure.) https://llvm.org/doxygen/classllvm_1_1PassManager.html#a314ff184ce4ace8801e1158ef909e22e or like using an analysis pass inside another different pass: void LegacyAnotherPass::getAnalysisUsage(AnalysisUsage &Info) const { Info.addRequired<LegacyMyAnalysisPass>(); } I thought we could other command line operations inside our code as this. I am trying to find a function for my desire. For example as in the pass example above: clang -S -emit-llvm example.c -o example.ll clang -c example.ll -o example.o And code equivalent (extremely making up :) ): for llvm ir: llvmir = file.getLLVMIRCode(); for object code: objcode = llvmir.getObjectCode(); Is there a way like this in simply and how I can? Maybe you can say "write a bash script and do operations step by step" but I want to write this complete tool using llvm and its functions inside. If you can answer I will be satisfied and please don't forget I am newbie if I am mistaken on some points. Thanks, Seyyid -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20210526/6f342cf2/attachment.html>
kuter dinel via llvm-dev
2021-May-26 01:50 UTC
[llvm-dev] How To Emit an LLVM IR or Object Code From A Source Code Inside A Tool
Hello/Merhaba Seyyid from what I understand you are trying to write a compiler Instrumentation. To run a pass directly from clang: For the old pass manager `-Xclang -load -Xclang mypass.so ...` For the new pass manager `-fpass-plugin=mypass.so ...` If you really wanted you could fork llvm and add your pass as a built-in pass. But I think you shouldn't do it that way. Seyyid Hikmet Çelik via llvm-dev <llvm-dev at lists.llvm.org>, 26 May 2021 Çar, 03:50 tarihinde şunu yazdı:> Hi everyone, > I am kind of a newbie here, working on llvm as a undergraduate student and > I am struggling about some situations. Yet I can write meaningless passes, > working tools by copying or trying to porting from llvm source and know how > to build them. I am searching on the web, using https://llvm.org/doxygen > to understand some functions, classes and how I can integrate these kind of > things in my experimental codes but I think that I can't go any further now > that's why I am writing this e-mail and probably more comes for different > questions. > I am trying to write a tool which will get target triple as a command > option and a C or C++ code, will emit and change LLVM IR code (maybe adding > a pass or meaningless operation for now :) ) inside, will emit and change > object code from changed LLVM IR, and lastly will give output as an > executable file. > Example tool in summary as I thought: > Usage (I can add some command line options later): > > mytool --triple riscv32 example.c > > > Sequence of this complete tool: > Run Tool --> Get Target Triple --> Emit LLVM IR code from source code --> > Change LLVM IR code --> Emit Object Code --> Change Object Code --> Give > Executable File Output > > For this, firstly I thought implement to get file and target triple (If I > am mistaken or incomplete you can warn): > > #include "llvm/Support/CommandLine.h" > static cl::list<std::string> > InputFilenames(cl::Positional, cl::desc("<input files>"),cl::ZeroOrMore); > extern cl::opt<std::string> TripleName; > > cl::opt<std::string> > llvm::TripleName("triple", cl::desc("target triple")); > > > Suppose that I did more coding and get source code file in main function, > after that how can I emit LLVM IR or object code inside and apply on some > operations? > > I am asking this because for example we can use a pass in command line as: > > opt -load libMyPass.so -mypass example.ll -o output.ll > > or in clang with -Xclang -load -Xclang option. > > or this is more proper example: > > clang -mem2reg example.ll -o output.ll > > > And we can also use these passes in our codes (in other passes or tools): > > static std::unique_ptr<legacy::FunctionPassManager> TheFPM; > TheFPM->add(createPromoteMemoryToRegisterPass()); > TheFPM->run(*TheFunction); > > (TheFunction should be declared before.) > > or maybe addPass function (I am not sure.) > > https://llvm.org/doxygen/classllvm_1_1PassManager.html#a314ff184ce4ace8801e1158ef909e22e > > or like using an analysis pass inside another different pass: > > void LegacyAnotherPass::getAnalysisUsage(AnalysisUsage &Info) const { > Info.addRequired<LegacyMyAnalysisPass>(); > } > > > I thought we could other command line operations inside our code as this. > I am trying to find a function for my desire. For example as in the pass > example above: > > clang -S -emit-llvm example.c -o example.ll > clang -c example.ll -o example.o > > > And code equivalent (extremely making up :) ): > for llvm ir: > > llvmir = file.getLLVMIRCode(); > > > for object code: > > objcode = llvmir.getObjectCode(); > > > Is there a way like this in simply and how I can? > > Maybe you can say "write a bash script and do operations step by step" but > I want to write this complete tool using llvm and its functions inside. If > you can answer I will be satisfied and please don't forget I am newbie if I > am mistaken on some points. > > Thanks, > Seyyid > _______________________________________________ > LLVM Developers mailing list > llvm-dev at lists.llvm.org > https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev >-------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20210526/79e7118a/attachment.html>