C++ 返回指向llvm::Value的指针时boost::python崩溃
我有一个函数,它返回一个C++ 返回指向llvm::Value的指针时boost::python崩溃,c++,llvm,boost-python,python-extensions,C++,Llvm,Boost Python,Python Extensions,我有一个函数,它返回一个llvm::Value*,我想向Python公开它。我不需要将接口公开给llvm::Value;它可以是Python中的不透明对象 当我调用该函数时,会发生崩溃。(我将提供下面的堆栈)。如果我将指针包装在一个带有auto_ptr的普通结构中,则不会发生崩溃。我正在运行MacOS X并使用darwin gcc工具链进行编译 代码如下: #include <boost/python.hpp> #include <memory> #include "l
llvm::Value*
,我想向Python公开它。我不需要将接口公开给llvm::Value
;它可以是Python中的不透明对象
当我调用该函数时,会发生崩溃。(我将提供下面的堆栈)。如果我将指针包装在一个带有auto_ptr
的普通结构中,则不会发生崩溃。我正在运行MacOS X并使用darwin gcc工具链进行编译
代码如下:
#include <boost/python.hpp>
#include <memory>
#include "llvm/IR/IRBuilder.h"
#include "llvm/IR/LLVMContext.h"
namespace python = boost::python;
struct Wrapper {
std::auto_ptr<llvm::Value> val;
Wrapper(llvm::Value* val):val(val) {}
};
llvm::Value* getValue() {
llvm::Value* v = llvm::ConstantFP::get(llvm::getGlobalContext(), llvm::APFloat(2.5));
v->dump();
return v;
}
Wrapper* getWrapper() {
llvm::Value* v = llvm::ConstantFP::get(llvm::getGlobalContext(), llvm::APFloat(3.5));
v->dump();
return new Wrapper(v);
}
BOOST_PYTHON_MODULE(TestCase) {
// functions
// (note that the same issue still persists if
// return_value_policy is reference_existing_object).
python::def("getValue", &getValue, python::return_value_policy<python::manage_new_object>());
python::def("getWrapper", &getWrapper, python::return_value_policy<python::manage_new_object>());
// classes
python::class_< llvm::Value, boost::noncopyable >("LLVMValue", python::no_init);
python::class_< Wrapper, boost::noncopyable >("Wrapper", python::no_init);
}
和堆栈:
0 libc++abi.dylib 0x00007fff919cb78a __cxxabiv1::__si_class_type_info::has_unambiguous_public_base(__cxxabiv1::__dynamic_cast_info*, void*, int) const + 0
1 libstdc++.6.dylib 0x000000010df5294b __dynamic_cast + 104
2 TestCase.so 0x000000010bad66be _object* boost::python::detail::wrapper_base_::owner_impl<llvm::Value>(llvm::Value const volatile*, mpl_::bool_<true>) + 57 (wrapper_base.hpp:64)
3 TestCase.so 0x000000010bad6487 _object* boost::python::detail::wrapper_base_::owner<llvm::Value>(llvm::Value const volatile*) + 29 (wrapper_base.hpp:37)
4 TestCase.so 0x000000010bad63a0 _object* boost::python::to_python_indirect<llvm::Value*, boost::python::detail::make_owning_holder>::execute<llvm::Value>(llvm::Value const&, mpl_::bool_<false>) const + 36 (to_python_indirect.hpp:67)
...
0 libc++abi.dylib 0x00007fff919cb78a\uuuuuu cxxabiv1::\uuuu si\u类\u类型\u信息::具有明确的\u公共\u基(\uuuuuuuucxxabiv1::\uuuu动态\u cast\u信息*,void*,int)常量+0
1 libstdc++.6.dylib 0x000000010df5294b\u动态\u cast+104
2 TestCase.so 0x000000010bad66be_object*boost::python::detail::wrapper_base_::owner_impl(llvm::Value const volatile*,mpl_::bool_)+57(wrapper_base.hpp:64)
3 TestCase.so 0x000000010bad6487_object*boost::python::detail::wrapper_base_::owner(llvm::Value const volatile*)+29(wrapper_base.hpp:37)
4 TestCase.so 0x000000010bad63a0_object*boost::python::to_python_indirect::execute(llvm::Value const&,mpl_::bool_)const+36(to_python_indirect.hpp:67)
...
我是否误用了boost::python
?这是虫子吗?为什么会崩溃?我希望不要到处包装包装,因为这需要对C++ API进行侵入性的更改。
0 libc++abi.dylib 0x00007fff919cb78a __cxxabiv1::__si_class_type_info::has_unambiguous_public_base(__cxxabiv1::__dynamic_cast_info*, void*, int) const + 0
1 libstdc++.6.dylib 0x000000010df5294b __dynamic_cast + 104
2 TestCase.so 0x000000010bad66be _object* boost::python::detail::wrapper_base_::owner_impl<llvm::Value>(llvm::Value const volatile*, mpl_::bool_<true>) + 57 (wrapper_base.hpp:64)
3 TestCase.so 0x000000010bad6487 _object* boost::python::detail::wrapper_base_::owner<llvm::Value>(llvm::Value const volatile*) + 29 (wrapper_base.hpp:37)
4 TestCase.so 0x000000010bad63a0 _object* boost::python::to_python_indirect<llvm::Value*, boost::python::detail::make_owning_holder>::execute<llvm::Value>(llvm::Value const&, mpl_::bool_<false>) const + 36 (to_python_indirect.hpp:67)
...