标签: llvm-c++-api

将数组传递给外部函数

我是 LLVM 的新手,我正在学习如何使用 LLVM 进行分析。我需要将数组传递给外部方法,并在代码中插入对该方法的调用指令。我目前正在使用以下代码,该代码在执行时会出现分段错误。

std::vector<Value*> Args(1);

//Vector with array values
SmallVector<Constant*, 2> counts;

counts.push_back(ConstantInt::get(Type::getInt32Ty(BB->getContext()),32, false));
                        counts.push_back(ConstantInt::get(Type::getInt32Ty(BB->getContext()),12, false));

//Array with 2 integers
Args[0]= ConstantArray::get(llvm::ArrayType::get(llvm::Type::getInt32Ty(BI->getContext()),2), counts);
Run Code Online (Sandbox Code Playgroud)

这里,外部函数 'hook' 定义为 M.getOrInsertFunction("hook", Type::getVoidTy(M.getContext()), llvm::ArrayType::get(llvm::Type::getInt32Ty(BI->getContext()),2) (Type*)0);

阅读了几个源文件后,我尝试使用 GetElementPtrInst 来传递数组

std::vector<Value*> ids(1);
ids.push_back(ConstantInt::get(Type::getInt32Ty(BB->getContext()),0));
Constant* array = ConstantArray::get(llvm::ArrayType::get(llvm::Type::getInt32Ty(BI->getContext()),2), counts);
Args[0] = ConstantExpr::getGetElementPtr(&(*array), ids, false);
Run Code Online (Sandbox Code Playgroud)

但它失败了

7  opt 0x00000000006c59f5 bool llvm::isa<llvm::Constant, llvm::Value*>(llvm::Value* const&) + 24

8  opt 0x00000000006c5a0f llvm::cast_retty<llvm::Constant, llvm::Value*>::ret_type llvm::cast<llvm::Constant, llvm::Value*>(llvm::Value* const&) + 24

9  opt 0x0000000000b2b22f

10 opt 0x0000000000b2a4fe llvm::ConstantFoldGetElementPtr(llvm::Constant*, bool, llvm::ArrayRef<llvm::Value*>) + 55

11 …
Run Code Online (Sandbox Code Playgroud)

c++ llvm llvm-c++-api

2
推荐指数
1
解决办法
2160
查看次数

LLVM保留循环分析

我正在编写一个LLVM FunctionPass,可以相当积极地转换某些功能.它最终会删除旧的块集并用完全不同的块替换它们.但是,之后运行的循环展开器(LoopUnrollPass)无法在转换后的函数中找到循环.(转换后的版本应该有自然循环.)

重新创建一个函数后,我有什么需要戳的吗?如何触发循环检测器再次运行?最后,还有其他分析,我必须在转换函数时更新吗?

llvm llvm-c++-api

2
推荐指数
1
解决办法
906
查看次数

clang::HeaderSearch 搜索路径被忽略

我试图clang::CompilerInstance解析一个包含包含的源文件,但我不知道如何让它实际找到包含的头文件。这是我的设置:

std::unique_ptr<clang::CompilerInstance> ci(new clang::CompilerInstance());
ci->createDiagnostics();

LLVMInitializeARMTarget();
LLVMInitializeARMTargetMC();
LLVMInitializeARMAsmPrinter();
LLVMInitializeARMAsmParser();


std::shared_ptr<clang::TargetOptions> options(new clang::TargetOptions);
options->Triple = "arm-v7m-unknown-none-eabi";
options->CPU = "cortex-m3";

clang::TargetInfo *targetInfo = clang::TargetInfo::CreateTargetInfo(ci->getDiagnostics(), options);

ci->setTarget(targetInfo);

ci->createFileManager();
ci->createSourceManager(ci->getFileManager());

NSURL *sysrootURL = [[[NSBundle mainBundle] resourceURL] URLByAppendingPathComponent:@"Compiler/basalt"];
NSURL *includeURL = [sysrootURL URLByAppendingPathComponent:@"include"];

ci->createPreprocessor(clang::TranslationUnitKind::TU_Complete);
ci->getPreprocessorOpts().UsePredefines = false;


// Header searcher
llvm::IntrusiveRefCntPtr<clang::HeaderSearchOptions> hso(new clang::HeaderSearchOptions());
hso->UseBuiltinIncludes = false;
hso->UseStandardSystemIncludes = false;
hso->UseStandardCXXIncludes = false;
hso->Sysroot = [[includeURL path] UTF8String];

clang::HeaderSearch headerSearch(hso, ci->getSourceManager(), ci->getDiagnostics(), ci->getLangOpts(), targetInfo);

headerSearch.AddSearchPath(clang::DirectoryLookup(ci->getFileManager().getDirectory([[includeURL path] UTF8String]), clang::SrcMgr::C_System, false), true);

clang::InitializePreprocessor(ci->getPreprocessor(), ci->getPreprocessorOpts(), ci->getFrontendOpts());


// …
Run Code Online (Sandbox Code Playgroud)

c++ llvm clang llvm-c++-api

2
推荐指数
1
解决办法
653
查看次数

什么是LLVM层?

我正在玩LLVM 3.7并希望使用新的ORC内容.但是我现在已经在这几个小时了,仍然没有得到每一层的用途,何时使用它们,如何组合它们或者至少是我需要的最小的一组事物.

已经完成了Kaleidoscope教程,但这些并没有解释组成部分是什么,只是说这里和这里这个(加上解析等分散核心LLVM位).虽然开始这很好,但却留下了很多空白.在LLVM中有很多关于各种事物的文档,但是它实际上接近于压倒性的东西.像http://llvm.org/releases/3.7.0/docs/ProgrammersManual.html这样的东西,但我找不到任何解释所有部分如何组合在一起的东西.更令人困惑的是,似乎有多个API用于做同样的事情,想到MCJIT了新的ORCAPI.我看到Lang Hames的帖子解释,自从他在该链接中发布的补丁以来,似乎已经发生了一些变化.

因此,对于特定问题,所有这些层如何组合在一起?当我以前使用LLVM时,我可以相当容易地链接到C函数,使用" 如何使用JIT "示例作为基础,我尝试链接到一个externed函数,extern "C" double doIt但最终得到LLVM ERROR: Tried to execute an unknown external function: doIt.

看看这个ORC示例,我似乎需要配置它搜索符号的位置.但TBH虽然我还在摇摆,但它在很大程度上是猜测工作.这是我得到的:

#include "llvm/ADT/STLExtras.h"
#include "llvm/ExecutionEngine/GenericValue.h"
#include "llvm/ExecutionEngine/Interpreter.h"
#include "llvm/IR/Constants.h"
#include "llvm/IR/DerivedTypes.h"
#include "llvm/IR/IRBuilder.h"
#include "llvm/IR/Instructions.h"
#include "llvm/IR/LLVMContext.h"
#include "llvm/IR/Module.h"
#include "llvm/Support/ManagedStatic.h"
#include "llvm/Support/TargetSelect.h"
#include "llvm/Support/raw_ostream.h"
#include "std.hpp"

using namespace llvm;

int main() {

  InitializeNativeTarget();

  LLVMContext Context;

  // Create some module to put our function …
Run Code Online (Sandbox Code Playgroud)

c++ llvm llvm-c++-api

2
推荐指数
1
解决办法
876
查看次数

LLVM将if / else插入现有基本块

我想在运行时检查某些指令的值。因此,我创建了一个比较指令和一个分支指令,它们分支到“然后”基本块或“其他”基本块。但是,我不确定如何在条件分支之后插入创建的基本块,以及如何拆分现有基本块。

Instruction* someInst;
IRBuilder<> B(someInst);

Value* condition = B.CreateICmp(CmpInst::ICMP_UGT, someInst, someValue);

BasicBlock* thenBB = BasicBlock::Create(*ctx, "then");
BasicBlock* elseBB = BasicBlock::Create(*ctx, "else");

B.CreateCondBr(condition, thenBB, elseBB);

B.SetInsertPoint(thenBB);
//insert stuff

B.SetInsertPoint(elseBB);
//insert stuff
Run Code Online (Sandbox Code Playgroud)

如何在现有基本块的中间插入if / else?

llvm llvm-ir llvm-c++-api

2
推荐指数
1
解决办法
2326
查看次数

如何在LLVM-IR中比较指针?

我想分析LLVM IR中的指针值。

LLVM Value Class中所示

Value是一个非常重要的LLVM类。它是程序所计算的所有值的基类,可用作所有其他值的操作数。值是其他重要类的超类,例如指令和功能。所有值都有一个类型。类型不是Value的子类。一些值可以具有名称,并且它们属于某个模块。在值上设置名称会自动更新模块的符号表。

要测试a Value是否为指针,有一个函数a->getType()->isPointerTy()。LLVM还提供了LLVM PointerType类,但是没有直接的api来比较指针的值。

所以我想知道如何比较这些指针值,以测试它们是否相等。我知道有AliasAnalysis,但是我对AliasAnalysis结果有疑问,所以我想自己验证一下。

pointers llvm-ir llvm-c++-api

2
推荐指数
1
解决办法
1101
查看次数

运行标准优化传递给LLVM模块

说我有一个有效的LLVM模块:

std::unique_ptr<llvm::Module> module;
Run Code Online (Sandbox Code Playgroud)

我想在其上运行LLVM传统优化:

llvm::PassBuilder passBuilder;
llvm::ModulePassManager modulePassManager = passBuilder.buildPerModuleDefaultPipeline(llvm::PassBuilder::OptimizationLevel::O3);
llvm::ModuleAnalysisManager moduleAnalysisManager;
passBuilder.registerModuleAnalyses(moduleAnalysisManager);
modulePassManager.run(*module, moduleAnalysisManager);
Run Code Online (Sandbox Code Playgroud)

不幸的是,该调用崩溃并进行了调试,显示moduleAnalysisManager仅通过模块,而没有通过代理类包装的函数通过。

我应该如何设置modulePassManager以处理特定级别的所有(模块)通行证?我没有单独的功能,因此无法仅对它们运行功能传递。

c++ jit llvm compiler-optimization llvm-c++-api

2
推荐指数
1
解决办法
187
查看次数

LLVM 可以用于生成优化的 C 代码吗

是否可以使用 LLVM 读取 C 代码并使其更快?我已经看到很多关于使用 LLVM 将 C++ 转换为(不可读的)C 代码的讨论,但我想知道 LLVM 是否可以读取 C 代码,并生成一个具有相同功能的文件(代码,而不是可执行文件)速度更快。

c llvm llvm-clang llvm-c++-api

2
推荐指数
1
解决办法
684
查看次数

在函数传递中访问循环信息的 LLVM 错误

我试图通过编写函数传递从 IR 获取循环信息。所以我按照一些例子写了如下。我对写通行证和通行证管理器不是很熟悉。

#include <iostream>
#include "llvm/LLVMContext.h"
#include "llvm/Module.h"
#include "llvm/Function.h"
#include "llvm/BasicBlock.h"
#include "llvm/Analysis/LoopInfo.h"
#include "llvm/Support/IRReader.h"
#include "llvm/Support/SourceMgr.h"
#include "llvm/Support/raw_ostream.h"
#include "llvm/Analysis/LoopInfo.h"
#include "llvm/Analysis/LoopPass.h"
#include "llvm/Pass.h"
#include "llvm/PassManager.h"

using namespace llvm;

namespace {
    class DetectLoop: public FunctionPass {
    public:
        DetectLoop() : FunctionPass(ID) {}

        static char ID;

        virtual void getAnalysisUsage(AnalysisUsage &AU) const {
            AU.addRequired<LoopInfo>();//I'm not sure if it's correct here *****1*****
        }

        virtual bool runOnFunction(Function &F) {
            if (!F.isDeclaration())
                LoopInfo &li = getAnalysis<LoopInfo>(F);//*****2*****
            for (Function::iterator I = F.begin(); I != …
Run Code Online (Sandbox Code Playgroud)

llvm llvm-ir llvm-c++-api

1
推荐指数
1
解决办法
1813
查看次数

将函数从 LLVM C++ API 导出到 WebAssembly

情况:我目前在 LLVM IR 中解析前端语言并生成函数定义。

我可以使用 LLVM12 C++ API 将函数定义编译为 WebAssembly 文件。

但是,生成的 wasm 代码不会“导出”任何已编译的函数,因此无法从加载 wasm 文件的 javascript 访问。

问题:有人可以让我知道我可能遗漏了什么吗?如何告诉 llvm 编译器为定义的函数创建导出。我尝试将函数可见性设置为 llvm::GlobalValue::DefaultVisibility。但这似乎没有帮助。

为函数生成的 IR(具有默认可见性)看起来像

define double @f(double %x) #0 {
entry:
  %multmp = fmul double %x, 2.000000e+00
  ret double %multmp
}

attributes #0 = { "target-features" }
Run Code Online (Sandbox Code Playgroud)

将包含函数定义的模块编译到 Wasm 目标的函数如下所示:

define double @f(double %x) #0 {
entry:
  %multmp = fmul double %x, 2.000000e+00
  ret double %multmp
}

attributes #0 = { "target-features" }
Run Code Online (Sandbox Code Playgroud)

这会输出一个看起来像的 wasm 文件

(module
  (type …
Run Code Online (Sandbox Code Playgroud)

c++ llvm clang llvm-c++-api webassembly

1
推荐指数
1
解决办法
596
查看次数