Björn Pettersson A via llvm-dev
2018-Jun-13 11:41 UTC
[llvm-dev] ModulePass cannot be registered as EarlyAsPossible
Yes, sorry that I wasn’t very clear about that, but the hack in opt.cpp only
works when using opt. We are doing the “early rewrites” when using another
frontend than clang, and in that case we are running the opt/llc binaries
standalone after the frontend.
I’m not sure, but maybe it is possible to do something similar in
EmitAssemblyHelper::CreatePasses (in clang/lib/CodeGen/BackendUtil.cpp), if you
want to do it in clang.
/Björn
From: Son Tuan VU <sontuan.vu119 at gmail.com>
Sent: den 12 juni 2018 19:54
To: Björn Pettersson A <bjorn.a.pettersson at ericsson.com>
Subject: Re: [llvm-dev] ModulePass cannot be registered as EarlyAsPossible
Thanks Björn for your answer.
So your way of doing this implies that we have to use opt, what if we want to
use clang instead? I mean, instead of
clang -O0 -emit-llvm -S foo.c -o foo.ll
opt -O1 -S foo.ll -o foo_opt.ll
we would have
clang -O1 -emit-llvm -S foo.c -o foo_opt.ll
I guess this requires me to find the right place in clang to add the same code
as yours in opt?
Son Tuan Vu
On Tue, Jun 12, 2018 at 6:11 PM, Björn Pettersson A <bjorn.a.pettersson at
ericsson.com<mailto:bjorn.a.pettersson at ericsson.com>> wrote:
I let someone else answer about if it is a bug or not.
Anyway, in our out-of-tree-target we have some module passes that we want to run
early in opt.
Our way of doing it is to use a hack in tools/opt/opt.cpp like this:
diff --git a/tools/opt/opt.cpp b/tools/opt/opt.cpp
index 43771d5d75b..2a08ce1a448 100644
--- a/tools/opt/opt.cpp
+++ b/tools/opt/opt.cpp
@@ -608,6 +608,16 @@ int main(int argc, char **argv) {
OptCustomPassManager Passes;
bool AddOneTimeDebugifyPasses = EnableDebugify && !DebugifyEach;
+ // EarlyRewriter must run very early. Since we made it a
+ // ModulePass, there is no standard way to make this happen (the standard
ways
+ // only work for FunctionPasses). Run the pass in a separate Passmanager
+ // before any other pass.
+ if (TM && TM->runEarlyModulePasses()) {
+ legacy::PassManager FirstPasses;
+ addPass(FirstPasses,
static_cast<ModulePass*>(createEarlyRewriterPass()));
+ FirstPasses.run(*M);
+ }
+
// Add an appropriate TargetLibraryInfo pass for the module's triple.
TargetLibraryInfoImpl TLII(ModuleTriple);
Note the FirstPasses.run(*M), which means that those first passes are run
directly.
And then we have added the runEarlyModulePasses() hook in TargetMachine that
will make sure we add and run the FirstPasses pass manager when compiling for
our target.
Regards,
Björn
From: llvm-dev <llvm-dev-bounces at lists.llvm.org<mailto:llvm-dev-bounces
at lists.llvm.org>> On Behalf Of Son Tuan VU via llvm-dev
Sent: den 12 juni 2018 15:46
To: llvm-dev <llvm-dev at lists.llvm.org<mailto:llvm-dev at
lists.llvm.org>>
Subject: [llvm-dev] ModulePass cannot be registered as EarlyAsPossible
Hello all,
I've followed the example in
https://github.com/CompilerTeaching/SimplePass/blob/master/SimplePass.cc in
order to create a custom pass.
The pass needs to be added before any transformation, so I used
EP_EarlyAsPossible extension point to register it. Furthermore, I need to
access to every GlobalVariable in the IR, so my pass has to be a ModulePass,
like this:
struct MyPass : public ModulePass {
static char ID;
MyPass(): ModulePass(ID) {}
virtual bool runOnModule(Module &M) {...}
...
}
However, every time I try to access to the Module object M inside runOnModule(),
clang just crashes. Even a debug message like outs() << M.getName()
<< '\n'; would cause a segfault. So am I doing something wrong,
like EP_EarlyAsPossible is really not to be used with ModulePasses, or is this
rather a bug?
In case this is not a bug, what would be the best way to manipulate an IR Module
as it is coming right out of the frontend?
Thanks for your help,
Son Tuan Vu
-------------- next part --------------
An HTML attachment was scrubbed...
URL:
<http://lists.llvm.org/pipermail/llvm-dev/attachments/20180613/786fc582/attachment.html>