Frustrated Programmer
Frustrated Programmer

Reputation: 51

LLVM Clang C++ code injection

I am a bit confused about implementing a code injection function in LLVM Clang. I basically want to add a function before a variable or a pointer is created in the source code. Example:

#include <iostream>
int main() {
  int a;
  return 0;
}

to

#include <iostream>
int main() {
  foo();
  int a;
  return 0;
}

I read the LLVM docs to find an answer but couldn't. Please help me. Thank you in advance.

Upvotes: 2

Views: 1557

Answers (1)

Mats Petersson
Mats Petersson

Reputation: 129374

First step is to decide whether you want to do this in Clang or LLVM. Although they are "connected", they are not the same thing. At clang you can do it at AST level, in which case you need to write a recursive AST-visitor, and from that identify the function definitions that you want to instrument - inserting the AST to call your foo function. This will only work for functions implemented by the compiler.

There is information on how to write such a visitor here: https://clang.llvm.org/docs/RAVFrontendAction.html

In LLVM you could write a function-pass, that inserts code into each function. This obviously works for ANY functions, regardless of language.

How to write an LLVM pass: http://llvm.org/docs/WritingAnLLVMPass.html

However, while this may seem trivial at the beginning, there are some interesting quirks. In an LLVM function, the alloca instructions should be first, so you would have to "skip" those functions. There may be functions that "shouldbn't be instrumented" - for example, if your function foo prints something using cout << something;, it would be rather terrible idea to insert foo into the operator<<(ostream&, ...) type functions... ;) And you obviously don't want to instrument foo itself, or any functions it calls.

There are ways in Clang that you can determine if the source is the "main file" or some header-file - although that may not be enough in your case. It is much harder to determine "which function is this" in LLVM.

Upvotes: 3

Related Questions