Creating int8** Pointer - Debug build works but not Release

Hello everyone,

i am writing an transformation pass where i want to insert a specific function call. To get this function i need to create a functionType. This type has an int** as first argument. It all worked fine until i build my pass as release build.

The culprit is probably the creation of the int** type. With the debug build getTypeID() give me 15, which is what i expect according to [0]. With the release build getTypeID() yields 72. Which is probably why i get segmentation faults when i try to use it or simply call dump().

I tried creating the Type in different ways:

Type::getInt8PtrTy(ctx)->getPointerTo()
TypeBuilder<int8_t**, false>::get(ctx)
PointerType::get(Type::getInt8PtrTy(ctx), 0)

All seem to give me the same result. Might this be some kind of bug? Any suggestions how to work around this problem?

Best Regards

Lorenz

[0] http://llvm.org/doxygen/classllvm_1_1Type.html#a5e9e1c0dd93557be1b4ad72860f3cbda

Here the solution to my problem. Maybe someone else has the same problem in the future.

As it seems using ArrayRef to store the types in caused the error. As the documentation [0] states it is not safe to store data in ArrayRef. I just used a normal std::vector and everything worked fine:
- ArrayRef<Type*> reg_var_arg_ty = {TypeBuilder<int8_t**,

::get(ctx), Type::getInt8PtrTy(ctx), ... }

+ vector<Type*> reg_var_arg_ty = {Type::getInt8PtrTy(ctx)->getPointerTo(), Type::getInt8PtrTy(ctx), ... }

Regards
Lorenz

[0] http://llvm.org/doxygen/classllvm_1_1ArrayRef.html#details