如何使用IRBuilder在llvm中插入stdlib C函数?

时间:2018-05-13 08:35:43

标签: llvm llvm-clang llvm-ir llvm-c++-api

我是llvm的初学者。我想在这里实现的是,一旦声明了变量,然后将其清理为随机值。例如,

#include <stdio.h>

#define enable_init 1

static const int len = 10;

void print(int* x, int len);

int main(int argc, char **argv){
    int x[len];
    print(x, len);
    return 0;
}

void print(int* x, int len){
    for(int i=0;i<len;i++){
        printf("0x%08x \n",x[i]);
    }
}

仪表后,

#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include <string.h>

#define enable_init 1

static const int len = 10;

void print(int* x, int len);
void forceInit(void *ptr, size_t size);

int main(int argc, char **argv){
    int x[len];
    forceInit(x, sizeof(int) * len);
    print(x, len);
    return 0;
}

void print(int* x, int len){
    for(int i=0;i<len;i++){
        printf("0x%08x \n",x[i]);
    }
}

void forceInit(void *ptr, size_t size){
    srand(time(NULL));
    for(size_t i=0;i<size;i++){
        unsigned char r = (unsigned char)(rand() % 255);
        memset(ptr+i,r,1);
    }
}

这是我为此写的一个简单代码:

void visitAllocaInst(AllocaInst &I) {
    IRBuilder<> IRB(I.getNextNode());
    Value *toVar = IRB.CreatePointerCast(&I, IRB.getInt8PtrTy());
    Value *deadbeef = IRB.getInt8(255);
    IRB.CreateMemSet(toVar, deadbeef, Len, I.getAlignment());
}

当前版本只能将变量赋值给0xFF。我在IRBuilder的API中找到了CreateMemSet函数,但是我不知道如何处理rand()。

0 个答案:

没有答案