[LLVMdev] Adding a module in a pass
John Criswell
criswell at cs.uiuc.edu
Tue Aug 9 11:59:32 PDT 2011
On 8/9/11 9:15 AM, Bjorn Reese wrote:
> On 2011-08-09 16:48, John Criswell wrote:
>> On 8/9/11 6:49 AM, Bjorn Reese wrote:
>>> I have an optimization pass (FunctionPass) where I need to add global
>>> constructors.
>>>
>>> For cleaness sake I decided to add these in my own module. My module
>>> is created in my FunctionPass constructor:
>> This is not how I would do it. A FunctionPass has doInitialization()
>> and doFinalization() methods that you can implement thatcan operate on
>> the whole module. They are designed for exactly the situation you
>> describe: your pass does some sort of local transform, but there's some
>> global modifications it needs to do (add global constructors, add
>> function prototypes, etc).
> Doesn't doIntialization() run once for each translation unit (module)?
It is run once per LLVM module. An LLVM module can either be a single
translation unit or multiple translation units linked together (i.e.,
LLVM can link multiple LLVM modules together into one large module).
>
> I only want to generate my global constructors once for the whole
> program. They are generated from a scripting language, which is parsed
> in the optimization pass.
I'm not familiar with how your languages organizes compilation units,
but from the sounds of it, it seems like you're saying that you want to
add the global ctor once after the compilation units are linked into a
single LLVM bitcode file.
In that case, you either delay running your FunctionPass until you have
the whole bitcode file, or you create a ModulePass that is only executed
once the whole-program bitcode is generated.
-- John T.
> _______________________________________________
> LLVM Developers mailing list
> LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
More information about the llvm-dev
mailing list