Text or Data symbol

I am again calling for help from LLVM developers :wink:

For my DSP backend, at the lowering stage and also at the AsmPrinter stage, I need to know if a GlobalAddress is a code or a data address.

So I tried at the lowering stage to use:
GlobalAddressSDNode *GSDN = cast(Op);
const GlobalValue *GV = GSDN->getGlobal();
GV->hasSection() and GV->getSection()
But the section is not set at this stage (hasSection = false)

And at the AsmPrinter stage:
const GlobalValue *GV = MO.getGlobal();
SectionKind sectionKind = Mang->getSymbol(GV)->getSection().getKind();
But again the section does not seem to be set (sectionKind.isInSection() = false)

Do you know a way to tell if a global address corresponds to data or code ? I have to process differently text and data address…

Thank you !

Damien

I reply to myself… I didn’t go in the right direction in my previous email.

There is an easy way to tell if a GlobalValue corresponds to data or code:
const GlobalValue *GV;
if(Function::classof(GV))
… // process the global value as a function
else
… // process the global value as data

Damien

I reply to myself… I didn’t go in the right direction in my previous email.

There is an easy way to tell if a GlobalValue corresponds to data or code:
const GlobalValue *GV;
if(Function::classof(GV))
… // process the global value as a function
else
… // process the global value as data

Damien

You should be able to use isa(GV) to determine if GV is a function. You may have to put in an additional check to see if GV is a GlobalAlias and to determine if the GlobalAlias is an alias for a function:

if (GlobalAlias * GA = dyn_cast(GV)) {
… Check to see if GA is an alias for a function
}

I recommend looking at the doxygen documentation on llvm.org to learn the class hierarchy relationships between GlobalValue, GlobalVariable, GlobalAlias, and Function. You should also read the Programmer’s Guide to get familiar with the isa<>() and dyn_cast<>() functions if you are not familiar with them already.

– John T.

In fact, my initial idea was to use “dyn_cast(GV)”, but I didn’t use the resulting pointer (except for testing if the pointer is null). That’s why I used classof… but I forgot about the existence of isa<>.

Thank you for this clarification,

Damien