How to annotate an arbitrary source line


I'm trying to push LLVM annotations from source code into IR. I use
the following syntax to achieve that.


For example:

__attribute__((annotate(“my message")))
int a = 1;

However, this mechanism is applicable to only certain types of
statements. For example, I can annotate a function declaration, but
not a function call:

__attribute__((annotate("my message"))) memcpy(buffer, "hello", 6);
// Compile-time error!

I thought I could get around this problem by using an empty statement such as:

__attribute__((annotate("my message"))); //Notice a semicolon here.
But when I see this annotation "my message", I apply it to the next
source line below.
memcpy(buffer, "hello", 6);

Unfortunately, this hack didn't work out because the compiler didn’t
push the annotation into the bitcode.

Instead, the following is a hack that fixes the problem:

__attribute__((annotate("my message"))) int a; //Notice a dummy
statement “int a"
memcpy(buffer, "hello", 6);

It uses a dummy statement “int a” but I use the annotation "my
message" for the memcpy call in the next line. It compiles clean and
its IR does have the annotation in it as well. However, I think this
is an ugly solution, not to mention extra IR statements for the local
variable a and memory overhead.

I'd appreciate any ideas.