[llvm-dev] How to pass a StringRef to a function call inserted as instrumentation?

Tim Northover via llvm-dev
Sat, 29 Apr 2017 00:27:01 -0000

Hi, Dipanjan,

On 28 April 2017 at 16:32, Dipanjan Das via llvm-dev
<llvm-dev at lists.llvm.org> wrote:
> 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.