I am wriitng an LLVM pass to insert instrumentation at certain points of the program. I want to pass the StringRef
obtained from getName()
as a parameter to a function func(char* s)
. I can allocate some space on stack using AllocaInst
to generate an alloca
instruction. But, how can I copy the StringRef
to the stack space?
StringRef::str().c_str() or StringRef::data()?
StringRef::data, basically char*
Hi, Dipanjan,
I am wriitng an LLVM pass to insert instrumentation at certain points of the
program. I want to pass the `StringRef` obtained from `getName()` as a
parameter to a function `func(char* s)`. I can allocate some space on stack
using `AllocaInst` to generate an `alloca` instruction. But, how can I copy
the `StringRef` to the stack space?
I think this is usually done via anonymous globals. For example if you
use Clang to compile this:
void note_store(char *LocName, void *Addr);
void foo(int *Ptr) {
note_store("store in foo", (void *)Ptr);
*Ptr = 42;
}
you get (essentially):
@.str = private unnamed_addr constant [13 x i8] c"store in foo\00", align 1
define void @foo(i32* %Ptr) {
%Ptr8 = bitcast i32* %Ptr to i8*
call void @note_store(i8* getelementptr inbounds ([13 x i8], [13 x
i8]* @.str, i64 0, i64 0), i8* %Ptr8)
store i32 42, i32* %Ptr, align 4
ret void
}
So you'll create a new global i8 array that gets initialized to your
StringRef's data and then pass a pointer to its first element into
your instrumentation function.
Cheers.
Tim.
Hi Tim,