如何在getOrInsertFunction()llvm中定义字符串类型?

时间:2016-03-09 13:30:55

标签: clang llvm instrumentation

我是llvm的新手并且正在尝试做乐器。但我发现LLVM API只有原始类型,如:getInt32Ty(Ctx)..我想要做的是使用getOrInsertFunction(),函数参数类型是字符串类型。众所周知,当参数类型为int时,我们可以做到喜欢是:

 LLVMContext &Ctx = F.getContext();
  Constant *logFunc = F.getParent()->getOrInsertFunction(
    "logop", Type::getVoidTy(Ctx), Type::getInt32Ty(Ctx), NULL );

Type::getInt32Ty(Ctx)是函数参数类型(int),我想要做的是:

getOrInsertFunction(
    "logop", Type::getVoidTy(Ctx), string type, NULL);

字符串类型我不知道如何定义它。简而言之,请你告诉我如何定义它,谢谢!

1 个答案:

答案 0 :(得分:1)

LLVM IR没有定义任何特殊的字符串或字符类型。

通常使用[N x i8]i8*,但这取决于你 - 例如,Java风格的字符串可能是一个结构,其中一些i32用于字符串长度,并且i16*代表UTF-16代码点。

LLVM IR确实有一个“字符串文字”,其类型为i8数组 - 例如c"hello world\0A\00"[13 x i8]。但这并没有规定你应该使用什么字符串形式。

请记住,如果您的功能应与某些内容互操作,例如:托管C ++应用程序,然后您需要使用相同的字符串类型 - 在这种情况下,std::string正在编译。您可以使用Clang或this online demo来检查该类型是什么。