LLVM禁用堆栈

时间:2014-01-05 23:55:10

标签: llvm

在编译使用堆分配的闭包持有by-val或指向堆分配参数的语言时,如何保证LLVM不会生成使用堆栈的代码(并且可选地使用ebp / esp作为另一个通用目的)寄存器)?

该函数可能在没有C /传统堆栈的strand / microthread中运行。


修改

一篇可能相关的文章,但它没有说明是否有保证LLVM不会尝试使用堆栈。

http://nondot.org/sabre/LLVMNotes/ExplicitlyManagedStackFrames.txt


修改2

要清楚,我不需要堆栈进行常规调用,因为我可以使用指向旧闭包的指针生成新的闭包,以便从调用返回时状态正常。

将此视为链接堆栈。

2 个答案:

答案 0 :(得分:3)

您必须编写自己的后端代码。现有的x86 / x64后端将不会被编程为支持这种堆栈使用基本上对于几乎所有功能都是强制性的。您可以将alloca()指令降低到您自己的堆栈中的伪堆栈。更不用说你必须开发自己的调用堆栈,你自己的函数调用ABI,所有这些讨厌的东西。即便如此,你基本上还是要模拟一个堆栈。

唯一没有提供硬件堆栈但仍然有用的编程环境是GPU,实际上,这只是因为它们提供了如此多的可用寄存器,并且每个函数都应该受到非常严格的限制。只有可用的寄存器空间才会削弱在x86或x64上运行的程序。

答案 1 :(得分:2)

C ++标准规范描述的抽象机清楚地描述了堆栈模型。它用于描述具有自动存储的任何(非静态)变量的行为。 (如果封闭对象是成员对象,则成员对象可能在堆栈中。)

虽然它在技术上是可能的我知道没有一个C ++编译器以这样的方式编译代码,即堆栈是否,动态地使用。 (编译应该在其他内存中模拟堆栈(堆?) - 这会比使用那里的的CPU基础结构效率低得多。这使得任何编译器都不可能提供便利。这种编译模式。

现在,回答问题的潜在X / Y部分,我假设您正在寻找一种实现无堆栈协同程序的方法:Boost Asio只提供 Stackless Coroutines

实际上,Boost Asio的面向演员的设计知道“strands”,你也可以使用Stackless / Stackful协程。

我认为你可能最关注HTTP Server Sample using Stackless Coroutines,这是一个预告片(server.cpp,为简洁起见删除了评论):

reenter(this) {
    do {
        socket_.reset(new tcp::socket(acceptor_->get_io_service()));
        yield acceptor_->async_accept(*socket_, *this);
        fork server(*this)();
    } while(is_parent());

    buffer_.reset(new boost::array<char, 8192>);
    request_.reset(new request);

    do {
        yield socket_->async_read_some(boost::asio::buffer(*buffer_), *this);
        boost::tie(valid_request_, boost::tuples::ignore)
            = request_parser_.parse(*request_,
                    buffer_->data(), buffer_->data() + length);
    } while(boost::indeterminate(valid_request_));

    reply_.reset(new reply);

    if(valid_request_)
        request_handler_(*request_, *reply_);
    else
        *reply_ = reply::stock_reply(reply::bad_request);

    yield boost::asio::async_write(*socket_, reply_->to_buffers(), *this);
    socket_->shutdown(tcp::socket::shutdown_both, ec);
}

为了完整性,Stackful Coroutines还有Boost Coroutine(基于Boost Context构建)。这些更重要,因为库将主动保存和恢复上下文切换中的寄存器/堆栈内容。