Re: [llvm-dev] Moving to ORCv2 - Where are my global constructors and destructors? + More information

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
2 messages Options
Reply | Threaded
Open this post in threaded view
|

Re: [llvm-dev] Moving to ORCv2 - Where are my global constructors and destructors? + More information

Sriraman Tallam via llvm-dev

Sorry for the spam, but I made some progress with my issue and wanted to share what I found out.

 

I tried the following line before adding my module to the LLJIT:

this->mainModule->getFunction("_GLOBAL__sub_I_VectorBIOS.cpp")->isDiscardableIfUnused();” This actually returned true

So I tried the following line:

this->mainModule->getFunction("_GLOBAL__sub_I_VectorBIOS.cpp")->setLinkage(llvm::GlobalValue::ExternalLinkage);”

Now I was able to find the function and execute the global constructor. For a workaround this works for me.

However, running LLJITs ‘runConstructors’ does still not work, they are still empty.

 

 

From: llvm-dev <[hidden email]> On Behalf Of Gaier, Bjoern via llvm-dev
Sent: 06 January 2020 15:02
To: David Blaikie <[hidden email]>; Lang Hames <[hidden email]>
Cc: [hidden email]
Subject: Re: [llvm-dev] Moving to ORCv2 - Where are my global constructors and destructors?

 

Is there a code example or maybe a documentation about this subject? Sadly it is an important part of my project to get the addresses of the constructors and destructors.

I really ran out of ideas though, every time when I try to look them up, they seem to be gone already .w.

 

From: David Blaikie <[hidden email]>
Sent: 19 December 2019 20:52
To: Gaier, Bjoern <[hidden email]>; Lang Hames <[hidden email]>
Cc: [hidden email]
Subject: Re: [llvm-dev] Moving to ORCv2 - Where are my global constructors and destructors?

 

[hidden email] owner/author of the ORC JIT (though I think he's out of office at the moment, so replies from him might be delayed).

I believe there's a way to wire up the global ctors, but I don't know the details unfortunately - perhaps someone else will chime in if/before Lang gets a chance.

 

On Thu, Dec 19, 2019 at 5:53 AM Gaier, Bjoern via llvm-dev <[hidden email]> wrote:

Heyho,

 

Recently I tried out the ORCv2 JIT, especially the LLJIT. I gotta say, that I really like the new interface and the way you use it! However there is one thing I’m missing. I wrote a small bit code file, which should force having a global constructor.

 

int wuff();

 

__declspec(noinline) int miau()

{

       printf("Huhuhu");

       return wuff();

}

 

const int x = miau();

 

When I parse this IR file in my JIT and go through the ‘globals()’ of the llvm::Module, then I will encounter a symbol with the following name:

“_GLOBAL__sub_I_VectorBIOS.cpp” where VectorBIOS.cpp was the name of the source file I compiled to the bit code.

 

I then wanted to get the address of that symbol - from the MCJIT times I remember, that those functions are the global constructors, but when calling lookup on that name, I was not able to find the symbol.

So I tried a different way:

llvm::GlobalVariable *var = module->getNamedGlobal("llvm.global_ctors");

if(var)

{

       llvm::ConstantArray *InitList = (llvm::ConstantArray*)var->getInitializer();

       for(unsigned int n = 0; n < InitList->getNumOperands(); n++)

       {

             llvm::ConstantStruct *CS = (llvm::ConstantStruct*)InitList->getOperand(n);

             if(!CS)

             {

                    continue;

             }

 

             llvm::Constant *FP = CS->getOperand(1);

             if(FP->isNullValue())

                    continue;

 

             llvm::ConstantExpr *CE = (llvm::ConstantExpr*)FP;

             if(CE->isCast())

             {

                    FP = CE->getOperand(0);

             }

 

             ((llvm::Function*)FP)->getName();

       }

}

I then printed the name of the llvm::Function but it was exactly the name I expected “_GLOBAL__sub_I_VectorBIOS.cpp”. This code was executed before I added module to the JIT.

For various reasons I wanted to store the address to the constructor – so I don’t want to call the LLJIT runConstructor – simply because I want to execute those functions later, when the LLJIT does not exist anymore.

 

I hope someone can help me with this…

 

Kind Greetings

Björn

Als GmbH eingetragen im Handelsregister Bad Homburg v.d.H. HRB 9816, USt.ID-Nr. DE 114 165 789 Geschäftsführer: Dr. Hiroshi Nakamura, Dr. Robert Plank, Markus Bode, Heiko Lampert, Takashi Nagano, Takeshi Fukushima. Junichi Tajika

_______________________________________________
LLVM Developers mailing list
[hidden email]
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev

Als GmbH eingetragen im Handelsregister Bad Homburg v.d.H. HRB 9816, USt.ID-Nr. DE 114 165 789 Geschäftsführer: Dr. Hiroshi Nakamura, Dr. Robert Plank, Markus Bode, Heiko Lampert, Takashi Nagano, Takeshi Fukushima. Junichi Tajika

Als GmbH eingetragen im Handelsregister Bad Homburg v.d.H. HRB 9816, USt.ID-Nr. DE 114 165 789 Geschäftsführer: Dr. Hiroshi Nakamura, Dr. Robert Plank, Markus Bode, Heiko Lampert, Takashi Nagano, Takeshi Fukushima. Junichi Tajika
_______________________________________________
LLVM Developers mailing list
[hidden email]
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev
Reply | Threaded
Open this post in threaded view
|

Re: [llvm-dev] Moving to ORCv2 - Where are my global constructors and destructors? + More information

Sriraman Tallam via llvm-dev
HI Bjoern,

Thanks for your patience — It’s going to take some time for me to get through all the emails that built up while I was away last month.

I’m glad you found a workaround for your issue, and thanks for pointing out the runConstructors problem. I’m working on a big update to the static initializers/deinitializers problem which I hope to land in the next week or so. Hopefully that will address this issue.

— Lang.

Sent from my iPad

On Jan 7, 2020, at 6:13 AM, Gaier, Bjoern <[hidden email]> wrote:



Sorry for the spam, but I made some progress with my issue and wanted to share what I found out.

 

I tried the following line before adding my module to the LLJIT:

this->mainModule->getFunction("_GLOBAL__sub_I_VectorBIOS.cpp")->isDiscardableIfUnused();” This actually returned true

So I tried the following line:

this->mainModule->getFunction("_GLOBAL__sub_I_VectorBIOS.cpp")->setLinkage(llvm::GlobalValue::ExternalLinkage);”

Now I was able to find the function and execute the global constructor. For a workaround this works for me.

However, running LLJITs ‘runConstructors’ does still not work, they are still empty.

 

 

From: llvm-dev <[hidden email]> On Behalf Of Gaier, Bjoern via llvm-dev
Sent: 06 January 2020 15:02
To: David Blaikie <[hidden email]>; Lang Hames <[hidden email]>
Cc: [hidden email]
Subject: Re: [llvm-dev] Moving to ORCv2 - Where are my global constructors and destructors?

 

Is there a code example or maybe a documentation about this subject? Sadly it is an important part of my project to get the addresses of the constructors and destructors.

I really ran out of ideas though, every time when I try to look them up, they seem to be gone already .w.

 

From: David Blaikie <[hidden email]>
Sent: 19 December 2019 20:52
To: Gaier, Bjoern <[hidden email]>; Lang Hames <[hidden email]>
Cc: [hidden email]
Subject: Re: [llvm-dev] Moving to ORCv2 - Where are my global constructors and destructors?

 

[hidden email] owner/author of the ORC JIT (though I think he's out of office at the moment, so replies from him might be delayed).

I believe there's a way to wire up the global ctors, but I don't know the details unfortunately - perhaps someone else will chime in if/before Lang gets a chance.

 

On Thu, Dec 19, 2019 at 5:53 AM Gaier, Bjoern via llvm-dev <[hidden email]> wrote:

Heyho,

 

Recently I tried out the ORCv2 JIT, especially the LLJIT. I gotta say, that I really like the new interface and the way you use it! However there is one thing I’m missing. I wrote a small bit code file, which should force having a global constructor.

 

int wuff();

 

__declspec(noinline) int miau()

{

       printf("Huhuhu");

       return wuff();

}

 

const int x = miau();

 

When I parse this IR file in my JIT and go through the ‘globals()’ of the llvm::Module, then I will encounter a symbol with the following name:

“_GLOBAL__sub_I_VectorBIOS.cpp” where VectorBIOS.cpp was the name of the source file I compiled to the bit code.

 

I then wanted to get the address of that symbol - from the MCJIT times I remember, that those functions are the global constructors, but when calling lookup on that name, I was not able to find the symbol.

So I tried a different way:

llvm::GlobalVariable *var = module->getNamedGlobal("llvm.global_ctors");

if(var)

{

       llvm::ConstantArray *InitList = (llvm::ConstantArray*)var->getInitializer();

       for(unsigned int n = 0; n < InitList->getNumOperands(); n++)

       {

             llvm::ConstantStruct *CS = (llvm::ConstantStruct*)InitList->getOperand(n);

             if(!CS)

             {

                    continue;

             }

 

             llvm::Constant *FP = CS->getOperand(1);

             if(FP->isNullValue())

                    continue;

 

             llvm::ConstantExpr *CE = (llvm::ConstantExpr*)FP;

             if(CE->isCast())

             {

                    FP = CE->getOperand(0);

             }

 

             ((llvm::Function*)FP)->getName();

       }

}

I then printed the name of the llvm::Function but it was exactly the name I expected “_GLOBAL__sub_I_VectorBIOS.cpp”. This code was executed before I added module to the JIT.

For various reasons I wanted to store the address to the constructor – so I don’t want to call the LLJIT runConstructor – simply because I want to execute those functions later, when the LLJIT does not exist anymore.

 

I hope someone can help me with this…

 

Kind Greetings

Björn

Als GmbH eingetragen im Handelsregister Bad Homburg v.d.H. HRB 9816, USt.ID-Nr. DE 114 165 789 Geschäftsführer: Dr. Hiroshi Nakamura, Dr. Robert Plank, Markus Bode, Heiko Lampert, Takashi Nagano, Takeshi Fukushima. Junichi Tajika

_______________________________________________
LLVM Developers mailing list
[hidden email]
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev

Als GmbH eingetragen im Handelsregister Bad Homburg v.d.H. HRB 9816, USt.ID-Nr. DE 114 165 789 Geschäftsführer: Dr. Hiroshi Nakamura, Dr. Robert Plank, Markus Bode, Heiko Lampert, Takashi Nagano, Takeshi Fukushima. Junichi Tajika

Als GmbH eingetragen im Handelsregister Bad Homburg v.d.H. HRB 9816, USt.ID-Nr. DE 114 165 789 Geschäftsführer: Dr. Hiroshi Nakamura, Dr. Robert Plank, Markus Bode, Heiko Lampert, Takashi Nagano, Takeshi Fukushima. Junichi Tajika

_______________________________________________
LLVM Developers mailing list
[hidden email]
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev