- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试使用 LLVM 和 C++ 编写一个玩具编译器。但每当我尝试创建具有多个索引的 GetElementPtrInst 时,就会出现段错误。有关此说明的文档对我没有帮助 ( API-Documentation Language-Documentation )
我的 llvm 版本是 3.1,这是在 Arch Linux 上。刚刚在另一台 Arch 机器上测试了它并得到了同样的错误。
我做错了什么吗?
这是一个小的工作程序来说明我的问题。它可以通过以下方式编译:
g++ -o segfault_example segfault_example.cpp -Wall -Wextra -pedantic \
`llvm-config --libs core jit native --cxxflags --ldflags`
#include <llvm/Module.h>
#include <llvm/Constants.h>
#include <llvm/DerivedTypes.h>
#include <llvm/LLVMContext.h>
#include <llvm/Instructions.h>
#include <llvm/Analysis/Verifier.h>
#include <llvm/ADT/ArrayRef.h>
#include <string>
#include <iostream>
static llvm::LLVMContext& global = llvm::getGlobalContext();
static llvm::Type* int32ty = llvm::Type::getInt32Ty(global);
llvm::ConstantInt* getInt32(int n)
{
return llvm::ConstantInt::get(llvm::Type::getInt32Ty(global), n);
}
int main()
{
//setup everything for a minimal example
llvm::Module* mainModule = new llvm::Module("main", global);
llvm::FunctionType* ftype = llvm::FunctionType::get(int32ty, false);
llvm::Function* mainFunction = llvm::Function::Create(
ftype, llvm::GlobalValue::InternalLinkage, "main", mainModule);
llvm::BasicBlock* bblock = llvm::BasicBlock::Create(
global, "entry", mainFunction, 0);
llvm::AllocaInst* mem = new llvm::AllocaInst(llvm::Type::getInt32PtrTy(global, 0x1000)
, getInt32(0x1000), 0x1000, "mem", bblock);
//tests
//this works
std::cout << "Testing with one element vector" << std::endl;
std::vector<llvm::Value*> vect_1;
vect_1.push_back(getInt32(0));
llvm::GetElementPtrInst* gep1 =
llvm::GetElementPtrInst::CreateInBounds(mem, llvm::ArrayRef<llvm::Value*>(vect_1)
, "retval", bblock);
std::cout << "done" << std::endl;
//this works too, but I can't find this signature in the documentation
std::cout << "Testing with Value* instead of ArrayRef" << std::endl;
llvm::GetElementPtrInst::CreateInBounds(mem, getInt32(0), "retval", bblock);
std::cout << "done" << std::endl;
//this segfaults
std::cout << "Filling two element vector" << std::endl;
std::vector<llvm::Value*> vect_2;
vect_2.push_back(getInt32(0));
vect_2.push_back(getInt32(1));
std::cout << "Testing with two element vector" << std::endl;
//segfault
llvm::GetElementPtrInst* gep2 =
llvm::GetElementPtrInst::CreateInBounds(mem, llvm::ArrayRef<llvm::Value*>(vect_2)
, "retval", bblock);
std::cout << "done" << std::endl;
mainModule->dump();
llvm::verifyFunction(*mainFunction);
}
最佳答案
发现错误。我会尝试解释原因和我的解决方案,但解释可能是错误的。
mem
的类型错误。 (就我而言)需要使用 new llvm::AllocaInst(llvm::ArrayType::get(int32ty, 100), "mem", bblock); 声明。创建两个间接级别 ( explanation why there are two indirections )。以前的类型只有一个间接寻址,因此使用 GetElementPtrInst
和两元素向量取消引用它不起作用。
我在玩 llvm in the browser 时注意到了这一点并发出 LLVM C++ Api 代码。
您可以在命令行上为 C 示例文件创建 C++ Api 代码,如下所示:
clang -c -emit-llvm -o ex.bf example.c
llc -march=cpp -o ex.cpp ex.bf
关于llvm - 将 GetElementPtrInst 与包含多个值的 ArrayRef 一起使用时出现段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11186052/
试图回答How to instantiate Moose classes from a big hash ,我想我又遇到了一个我不完全理解 Moose 类型强制的地方。由于某种原因,以下代码发出警告:
我偶然发现了这个 http://llvm.org/docs/doxygen/html/classllvm_1_1ArrayRef.html我正在尝试了解它的用途。 我看不出 ArrayRef 解决了什
我正在编写一个脚本来解析“pure-ftpwho -s”命令以获取当前传输的列表。但是,当用户断开与 FTP 的连接并重新连接并恢复传输时,该文件会出现两次。我想用 Perl 删除重影。解析后,arr
我正在尝试将 Moose 与 Moose::Meta::Attribute::Native::Trait::Array 一起使用,但看起来 ArrayRef 助手对我不起作用。波纹管是我返回的代码 C
我意识到这可能是我对 perl 或 Moose 某些部分的基本误解,但我似乎无法从 default 返回 ArrayRef方法: has '_directories' => ( is => '
我在以下子类型和强制链中缺少什么?我希望能够强制验证类型的 arrayref 或从以下输入中消失: 强制字符串 有效字符串 混合强制和有效字符串的 Arrayref 假设所有类型都是完全命名空间的,并
我正在尝试编写一个程序来获取一个大的 MySQL 表,重命名一些字段并将其写入 JSON。这是我现在拥有的: use strict; use JSON; use DBI; # here goes so
我使用用于 Java 字节码检测的 ASM API,我希望能够在每次访问任何数组时确定访问了哪个数组(通过数组名称)。 我有两个问题:- 让我们以 iastore 指令为例。 arrayref 被放置
if((scalar keys ($this->{'libraries'}->{$y}->{'cellHash'})) == 0){ 这是我得到“引用的键的参数类型必须是无福的 hashref 或 a
给定一个包含其他数组引用的数组引用,是否可以使用 List::MoreUtils 中的 zip 函数将嵌套的数组引用压缩在一起? ? 例如给定这个arrayref: my $matrix = [
我目前正在阅读Intermediate Perl来自 O'Reilly,我正在尝试做其中一项练习。我对 Perl 中的引用不熟悉,所以我希望我不会误解某些东西并错误地编写此练习。 但是,我尝试调试此代
我尝试这样的代码: my @rows = getRows($sth); $self->stash(rows => \@rows); getRows 是一个子函数名称,代码在模板中工作。 $rows 是
我正在尝试使用 LLVM 和 C++ 编写一个玩具编译器。但每当我尝试创建具有多个索引的 GetElementPtrInst 时,就会出现段错误。有关此说明的文档对我没有帮助 ( API-Docume
抱歉,代码有点长,但我想提供一个几乎可以工作的示例。 package MLQ::Jobs::Job { use 5.016; use Moose; use warnings;
我无法使用 Inline C 将 arrayrefs 传递给 C 函数。我需要一些帮助。 首先,为了证明我可以让 Inline C 工作,我将一个标量值传递给 C 函数: #!/usr/bin/per
我认为我对 Perl 引用以及如何使用它们有所了解。我开始接触 Perl 5.005。现在我有一段用 Perl 5.32 新鲜编写的代码,其中一些数组引用操作的行为让我感到困惑。 这是我的最小示例:
好吧,我做错了什么 - Moose 忽略了我的强制: package moo; use Moose; use Moose::Util::TypeConstraints; subtype Bar =>
我认为我对 Perl 引用以及如何使用它们有所了解。我开始接触 Perl 5.005。现在我有一段用 Perl 5.32 新鲜编写的代码,其中一些数组引用操作的行为让我感到困惑。 这是我的最小示例:
我试图按照跟踪变量使用的顺序绑定(bind)一个哈希(或 hashref)。 一切都适用于简单的情况,但是当我尝试在一些真实代码上使用我的模块时,我遇到了这个错误: hash- or arrayref
使用 Moose和 Bread::Board , 是否可以创建一个具有 ArrayRef[SomeObject] 类型约束的属性的对象,并以如下方式注入(inject)该参数: ArrayRef 约束
我是一名优秀的程序员,十分优秀!