Как вставить функцию stdlib C в llvm с помощью IRBuilder? - PullRequest
0 голосов
/ 13 мая 2018

Я новичок в 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. Я нашел функцию CreateMemSet в API IRBuilder, но не знаю, что делать с rand ().

...