16

I'd like to record some dynamic behaviors into some global variables. So I wrote a pass to instrument the code and insert some instructions to update the global variable. I tried to use the GlobalVariable constructor to define a global variable, but there are two problems. First, how can I DEFINE the global variables in the module containing main function? Second, how can I DECLARE those global variables in other modules? It's like "extern double someThing;".

The target programs are written in C.

3
  • What language are you using? (LLVM is not a language, it's "a collection of modular and reusable compiler and toolchain technologies"). Commented Oct 16, 2011 at 21:08
  • 3
    It sounds like they're using the LLVM API to construct programs directly, rather than via compiling a language. Commented Oct 16, 2011 at 21:12
  • 1
    Yes, I just want to insert several instructions. Commented Oct 16, 2011 at 21:49

1 Answer 1

30

There is a tool which can answer this and many other questions about LLVM API: llc -march=cpp. You can generate a bitcode file using Clang or llvm-gcc, and then build a C++ code which should reconstruct the same module using the cpp backend.

A sample output, showing how to define a global int * variable:

// Global Variable Declarations GlobalVariable* gvar_ptr_abc = new GlobalVariable(/*Module=*/*mod, /*Type=*/PointerTy_0, /*isConstant=*/false, /*Linkage=*/GlobalValue::CommonLinkage, /*Initializer=*/0, // has initializer, specified below /*Name=*/"abc"); gvar_ptr_abc->setAlignment(4); // Constant Definitions ConstantPointerNull* const_ptr_2 = ConstantPointerNull::get(PointerTy_0); // Global Variable Definitions gvar_ptr_abc->setInitializer(const_ptr_2); 
Sign up to request clarification or add additional context in comments.

7 Comments

That looks like C++, not C (the ConstantPointerNull::get() call).
@Keith Thompson, you can't write an LLVM pass in C anyway, so what's the problem?
The OP said the target programs are written in C. (I'm not familiar with LLVM, so I won't comment further.)
Thanks for answering part of the question. Can you explain a bit on the use of "CommonLinkage" rather than "ExternalLinkage"? I guess this piece of code implies that I should use the constructor to both declare and define a global variable. The only difference is that for declaration I set the initializer to 0?
Update to anyone who sees this -- don't bother trying the C++ backend, it doesn't exist anymore.
|

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.