Can't find symbol from llvm backend

Hi, I am new to llvm.
I create a global variable called “test_llvm_var” in the front end function pass like this:

new GlobalVariable(*m, tmp->getType(), true, llvm::GlobalValue::ExternalLinkage, tmp, “test_llvm_var”);

where tmp is a function.

Then I tried to access this global variable in the back end MachineFunctionPass like this:

MCContext& MCC = MF.getContext();
MCSymbol* MCS = MCC.lookupSymbol(“test_llvm_var”);
if (MCS == NULL) {
errs() << “>>> MCSymbol is null\n”;
}
else {
MCS->dump();
}

(MF is a MachineFunction).

However I always get MCS==NULL, there is no symbol called test_llvm_var in the backend.

Am I doing something wrong? What I would like to do is to modify the global variable’s value from the backend pass.

Any help would be appreciated.
Thank you!

Do you have a use of the new variable as well? If not, it might be optimized out between the point where you create it and your MachineFunction pass.

–paulr

No, I don’t. But I’m sure it is not optimized because I can see this variable in the final binary file emitted.

Do you mean if I don’t refer to this variable in the front end, then I can’t see it in the backend? (although it’s in the final binary file)

Thank you!

2019年1月19日(土) 2:00 <paul.robinson@sony.com>:

No, I don’t. But I’m sure it is not optimized because I can see this variable in the final binary file emitted.

Do you mean if I don’t refer to this variable in the front end, then I can’t see it in the backend? (although it’s in the final binary file)

Thank you!

I’m not sure, but I think the MCSymbol won’t exist until the AsmPrinter pass runs at the end of the codegen pipeline.

Hi,

Did you check your variable is inserted successfully? As far as I know, to insert functions you need to instrument the bitcode as the following:

Constant *c = module->getOrInsertFunction(“cmpr”,
FunctionType::getVoidTy(*context),
Type::getInt64Ty(*context),
Type::getInt64Ty(*context), NULL);

f = &cast(*c);

The upper code inserts a new function “cmpr” (declaration) to the function table, but later you need to add definitions.

Or if you want to insert a variable (e.g. int), the following is code from StackOverflow I found work for my case: