1e243fd9e2be8897c9350650b724d7eda2f607f8fEric Christopher//===- Object.cpp - C bindings to the object file library--------*- C++ -*-===// 2e243fd9e2be8897c9350650b724d7eda2f607f8fEric Christopher// 3e243fd9e2be8897c9350650b724d7eda2f607f8fEric Christopher// The LLVM Compiler Infrastructure 4e243fd9e2be8897c9350650b724d7eda2f607f8fEric Christopher// 5e243fd9e2be8897c9350650b724d7eda2f607f8fEric Christopher// This file is distributed under the University of Illinois Open Source 6e243fd9e2be8897c9350650b724d7eda2f607f8fEric Christopher// License. See LICENSE.TXT for details. 7e243fd9e2be8897c9350650b724d7eda2f607f8fEric Christopher// 8e243fd9e2be8897c9350650b724d7eda2f607f8fEric Christopher//===----------------------------------------------------------------------===// 9e243fd9e2be8897c9350650b724d7eda2f607f8fEric Christopher// 10e243fd9e2be8897c9350650b724d7eda2f607f8fEric Christopher// This file defines the C bindings to the file-format-independent object 11e243fd9e2be8897c9350650b724d7eda2f607f8fEric Christopher// library. 12e243fd9e2be8897c9350650b724d7eda2f607f8fEric Christopher// 13e243fd9e2be8897c9350650b724d7eda2f607f8fEric Christopher//===----------------------------------------------------------------------===// 14e243fd9e2be8897c9350650b724d7eda2f607f8fEric Christopher 15e243fd9e2be8897c9350650b724d7eda2f607f8fEric Christopher#include "llvm/Object/ObjectFile.h" 16e243fd9e2be8897c9350650b724d7eda2f607f8fEric Christopher#include "llvm-c/Object.h" 17e243fd9e2be8897c9350650b724d7eda2f607f8fEric Christopher 18e243fd9e2be8897c9350650b724d7eda2f607f8fEric Christopherusing namespace llvm; 19e243fd9e2be8897c9350650b724d7eda2f607f8fEric Christopherusing namespace object; 20e243fd9e2be8897c9350650b724d7eda2f607f8fEric Christopher 213cb056797b17785cfd2429ce8232143d5aeb5e42Owen Anderson// ObjectFile creation 22e243fd9e2be8897c9350650b724d7eda2f607f8fEric ChristopherLLVMObjectFileRef LLVMCreateObjectFile(LLVMMemoryBufferRef MemBuf) { 23e243fd9e2be8897c9350650b724d7eda2f607f8fEric Christopher return wrap(ObjectFile::createObjectFile(unwrap(MemBuf))); 24e243fd9e2be8897c9350650b724d7eda2f607f8fEric Christopher} 25e243fd9e2be8897c9350650b724d7eda2f607f8fEric Christopher 26e243fd9e2be8897c9350650b724d7eda2f607f8fEric Christophervoid LLVMDisposeObjectFile(LLVMObjectFileRef ObjectFile) { 27e243fd9e2be8897c9350650b724d7eda2f607f8fEric Christopher delete unwrap(ObjectFile); 28e243fd9e2be8897c9350650b724d7eda2f607f8fEric Christopher} 29e243fd9e2be8897c9350650b724d7eda2f607f8fEric Christopher 303cb056797b17785cfd2429ce8232143d5aeb5e42Owen Anderson// ObjectFile Section iterators 31e243fd9e2be8897c9350650b724d7eda2f607f8fEric ChristopherLLVMSectionIteratorRef LLVMGetSections(LLVMObjectFileRef ObjectFile) { 324344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer section_iterator SI = unwrap(ObjectFile)->begin_sections(); 334344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer return wrap(new section_iterator(SI)); 34e243fd9e2be8897c9350650b724d7eda2f607f8fEric Christopher} 35e243fd9e2be8897c9350650b724d7eda2f607f8fEric Christopher 36e243fd9e2be8897c9350650b724d7eda2f607f8fEric Christophervoid LLVMDisposeSectionIterator(LLVMSectionIteratorRef SI) { 37e243fd9e2be8897c9350650b724d7eda2f607f8fEric Christopher delete unwrap(SI); 38e243fd9e2be8897c9350650b724d7eda2f607f8fEric Christopher} 39e243fd9e2be8897c9350650b724d7eda2f607f8fEric Christopher 40e243fd9e2be8897c9350650b724d7eda2f607f8fEric ChristopherLLVMBool LLVMIsSectionIteratorAtEnd(LLVMObjectFileRef ObjectFile, 41e243fd9e2be8897c9350650b724d7eda2f607f8fEric Christopher LLVMSectionIteratorRef SI) { 42e243fd9e2be8897c9350650b724d7eda2f607f8fEric Christopher return (*unwrap(SI) == unwrap(ObjectFile)->end_sections()) ? 1 : 0; 43e243fd9e2be8897c9350650b724d7eda2f607f8fEric Christopher} 44e243fd9e2be8897c9350650b724d7eda2f607f8fEric Christopher 45e243fd9e2be8897c9350650b724d7eda2f607f8fEric Christophervoid LLVMMoveToNextSection(LLVMSectionIteratorRef SI) { 4625b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer error_code ec; 4725b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer unwrap(SI)->increment(ec); 4825b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer if (ec) report_fatal_error("LLVMMoveToNextSection failed: " + ec.message()); 49e243fd9e2be8897c9350650b724d7eda2f607f8fEric Christopher} 50e243fd9e2be8897c9350650b724d7eda2f607f8fEric Christopher 51e2fa64ef22321c5771667a8f00dca737ecb0799cOwen Andersonvoid LLVMMoveToContainingSection(LLVMSectionIteratorRef Sect, 52e2fa64ef22321c5771667a8f00dca737ecb0799cOwen Anderson LLVMSymbolIteratorRef Sym) { 53e2fa64ef22321c5771667a8f00dca737ecb0799cOwen Anderson if (error_code ec = (*unwrap(Sym))->getSection(*unwrap(Sect))) 54e2fa64ef22321c5771667a8f00dca737ecb0799cOwen Anderson report_fatal_error(ec.message()); 55e2fa64ef22321c5771667a8f00dca737ecb0799cOwen Anderson} 56e2fa64ef22321c5771667a8f00dca737ecb0799cOwen Anderson 573cb056797b17785cfd2429ce8232143d5aeb5e42Owen Anderson// ObjectFile Symbol iterators 583cb056797b17785cfd2429ce8232143d5aeb5e42Owen AndersonLLVMSymbolIteratorRef LLVMGetSymbols(LLVMObjectFileRef ObjectFile) { 593cb056797b17785cfd2429ce8232143d5aeb5e42Owen Anderson symbol_iterator SI = unwrap(ObjectFile)->begin_symbols(); 603cb056797b17785cfd2429ce8232143d5aeb5e42Owen Anderson return wrap(new symbol_iterator(SI)); 613cb056797b17785cfd2429ce8232143d5aeb5e42Owen Anderson} 623cb056797b17785cfd2429ce8232143d5aeb5e42Owen Anderson 633cb056797b17785cfd2429ce8232143d5aeb5e42Owen Andersonvoid LLVMDisposeSymbolIterator(LLVMSymbolIteratorRef SI) { 643cb056797b17785cfd2429ce8232143d5aeb5e42Owen Anderson delete unwrap(SI); 653cb056797b17785cfd2429ce8232143d5aeb5e42Owen Anderson} 663cb056797b17785cfd2429ce8232143d5aeb5e42Owen Anderson 673cb056797b17785cfd2429ce8232143d5aeb5e42Owen AndersonLLVMBool LLVMIsSymbolIteratorAtEnd(LLVMObjectFileRef ObjectFile, 683cb056797b17785cfd2429ce8232143d5aeb5e42Owen Anderson LLVMSymbolIteratorRef SI) { 693cb056797b17785cfd2429ce8232143d5aeb5e42Owen Anderson return (*unwrap(SI) == unwrap(ObjectFile)->end_symbols()) ? 1 : 0; 703cb056797b17785cfd2429ce8232143d5aeb5e42Owen Anderson} 713cb056797b17785cfd2429ce8232143d5aeb5e42Owen Anderson 723cb056797b17785cfd2429ce8232143d5aeb5e42Owen Andersonvoid LLVMMoveToNextSymbol(LLVMSymbolIteratorRef SI) { 733cb056797b17785cfd2429ce8232143d5aeb5e42Owen Anderson error_code ec; 743cb056797b17785cfd2429ce8232143d5aeb5e42Owen Anderson unwrap(SI)->increment(ec); 753cb056797b17785cfd2429ce8232143d5aeb5e42Owen Anderson if (ec) report_fatal_error("LLVMMoveToNextSymbol failed: " + ec.message()); 763cb056797b17785cfd2429ce8232143d5aeb5e42Owen Anderson} 773cb056797b17785cfd2429ce8232143d5aeb5e42Owen Anderson 783cb056797b17785cfd2429ce8232143d5aeb5e42Owen Anderson// SectionRef accessors 79e243fd9e2be8897c9350650b724d7eda2f607f8fEric Christopherconst char *LLVMGetSectionName(LLVMSectionIteratorRef SI) { 8025b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer StringRef ret; 8125b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer if (error_code ec = (*unwrap(SI))->getName(ret)) 8225b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer report_fatal_error(ec.message()); 8325b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer return ret.data(); 84e243fd9e2be8897c9350650b724d7eda2f607f8fEric Christopher} 85e243fd9e2be8897c9350650b724d7eda2f607f8fEric Christopher 86e243fd9e2be8897c9350650b724d7eda2f607f8fEric Christopheruint64_t LLVMGetSectionSize(LLVMSectionIteratorRef SI) { 8725b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer uint64_t ret; 8825b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer if (error_code ec = (*unwrap(SI))->getSize(ret)) 8925b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer report_fatal_error(ec.message()); 9025b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer return ret; 91e243fd9e2be8897c9350650b724d7eda2f607f8fEric Christopher} 92e243fd9e2be8897c9350650b724d7eda2f607f8fEric Christopher 93e243fd9e2be8897c9350650b724d7eda2f607f8fEric Christopherconst char *LLVMGetSectionContents(LLVMSectionIteratorRef SI) { 9425b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer StringRef ret; 9525b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer if (error_code ec = (*unwrap(SI))->getContents(ret)) 9625b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer report_fatal_error(ec.message()); 9725b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer return ret.data(); 98e243fd9e2be8897c9350650b724d7eda2f607f8fEric Christopher} 993cb056797b17785cfd2429ce8232143d5aeb5e42Owen Anderson 1003cb056797b17785cfd2429ce8232143d5aeb5e42Owen Andersonuint64_t LLVMGetSectionAddress(LLVMSectionIteratorRef SI) { 1013cb056797b17785cfd2429ce8232143d5aeb5e42Owen Anderson uint64_t ret; 1023cb056797b17785cfd2429ce8232143d5aeb5e42Owen Anderson if (error_code ec = (*unwrap(SI))->getAddress(ret)) 1033cb056797b17785cfd2429ce8232143d5aeb5e42Owen Anderson report_fatal_error(ec.message()); 1043cb056797b17785cfd2429ce8232143d5aeb5e42Owen Anderson return ret; 1053cb056797b17785cfd2429ce8232143d5aeb5e42Owen Anderson} 1063cb056797b17785cfd2429ce8232143d5aeb5e42Owen Anderson 107ca7eb3e171f63de3cfc1020d86375ce11d356194Owen AndersonLLVMBool LLVMGetSectionContainsSymbol(LLVMSectionIteratorRef SI, 1083cb056797b17785cfd2429ce8232143d5aeb5e42Owen Anderson LLVMSymbolIteratorRef Sym) { 1093cb056797b17785cfd2429ce8232143d5aeb5e42Owen Anderson bool ret; 1103cb056797b17785cfd2429ce8232143d5aeb5e42Owen Anderson if (error_code ec = (*unwrap(SI))->containsSymbol(**unwrap(Sym), ret)) 1113cb056797b17785cfd2429ce8232143d5aeb5e42Owen Anderson report_fatal_error(ec.message()); 1123cb056797b17785cfd2429ce8232143d5aeb5e42Owen Anderson return ret; 1133cb056797b17785cfd2429ce8232143d5aeb5e42Owen Anderson} 1143cb056797b17785cfd2429ce8232143d5aeb5e42Owen Anderson 115d8b0b915c5a94806596c381660c548aabef447b2Owen Anderson// Section Relocation iterators 116d8b0b915c5a94806596c381660c548aabef447b2Owen AndersonLLVMRelocationIteratorRef LLVMGetRelocations(LLVMSectionIteratorRef Section) { 117d8b0b915c5a94806596c381660c548aabef447b2Owen Anderson relocation_iterator SI = (*unwrap(Section))->begin_relocations(); 118d8b0b915c5a94806596c381660c548aabef447b2Owen Anderson return wrap(new relocation_iterator(SI)); 119d8b0b915c5a94806596c381660c548aabef447b2Owen Anderson} 120d8b0b915c5a94806596c381660c548aabef447b2Owen Anderson 121d8b0b915c5a94806596c381660c548aabef447b2Owen Andersonvoid LLVMDisposeRelocationIterator(LLVMRelocationIteratorRef SI) { 122d8b0b915c5a94806596c381660c548aabef447b2Owen Anderson delete unwrap(SI); 123d8b0b915c5a94806596c381660c548aabef447b2Owen Anderson} 124d8b0b915c5a94806596c381660c548aabef447b2Owen Anderson 125d8b0b915c5a94806596c381660c548aabef447b2Owen AndersonLLVMBool LLVMIsRelocationIteratorAtEnd(LLVMSectionIteratorRef Section, 126d8b0b915c5a94806596c381660c548aabef447b2Owen Anderson LLVMRelocationIteratorRef SI) { 127d8b0b915c5a94806596c381660c548aabef447b2Owen Anderson return (*unwrap(SI) == (*unwrap(Section))->end_relocations()) ? 1 : 0; 128d8b0b915c5a94806596c381660c548aabef447b2Owen Anderson} 129d8b0b915c5a94806596c381660c548aabef447b2Owen Anderson 130d8b0b915c5a94806596c381660c548aabef447b2Owen Andersonvoid LLVMMoveToNextRelocation(LLVMRelocationIteratorRef SI) { 131d8b0b915c5a94806596c381660c548aabef447b2Owen Anderson error_code ec; 132d8b0b915c5a94806596c381660c548aabef447b2Owen Anderson unwrap(SI)->increment(ec); 133d8b0b915c5a94806596c381660c548aabef447b2Owen Anderson if (ec) report_fatal_error("LLVMMoveToNextRelocation failed: " + 134d8b0b915c5a94806596c381660c548aabef447b2Owen Anderson ec.message()); 135d8b0b915c5a94806596c381660c548aabef447b2Owen Anderson} 136d8b0b915c5a94806596c381660c548aabef447b2Owen Anderson 137d8b0b915c5a94806596c381660c548aabef447b2Owen Anderson 1383cb056797b17785cfd2429ce8232143d5aeb5e42Owen Anderson// SymbolRef accessors 1393cb056797b17785cfd2429ce8232143d5aeb5e42Owen Andersonconst char *LLVMGetSymbolName(LLVMSymbolIteratorRef SI) { 1403cb056797b17785cfd2429ce8232143d5aeb5e42Owen Anderson StringRef ret; 1413cb056797b17785cfd2429ce8232143d5aeb5e42Owen Anderson if (error_code ec = (*unwrap(SI))->getName(ret)) 1423cb056797b17785cfd2429ce8232143d5aeb5e42Owen Anderson report_fatal_error(ec.message()); 1433cb056797b17785cfd2429ce8232143d5aeb5e42Owen Anderson return ret.data(); 1443cb056797b17785cfd2429ce8232143d5aeb5e42Owen Anderson} 1453cb056797b17785cfd2429ce8232143d5aeb5e42Owen Anderson 1463cb056797b17785cfd2429ce8232143d5aeb5e42Owen Andersonuint64_t LLVMGetSymbolAddress(LLVMSymbolIteratorRef SI) { 1473cb056797b17785cfd2429ce8232143d5aeb5e42Owen Anderson uint64_t ret; 1483cb056797b17785cfd2429ce8232143d5aeb5e42Owen Anderson if (error_code ec = (*unwrap(SI))->getAddress(ret)) 1493cb056797b17785cfd2429ce8232143d5aeb5e42Owen Anderson report_fatal_error(ec.message()); 1503cb056797b17785cfd2429ce8232143d5aeb5e42Owen Anderson return ret; 1513cb056797b17785cfd2429ce8232143d5aeb5e42Owen Anderson} 1523cb056797b17785cfd2429ce8232143d5aeb5e42Owen Anderson 153b0436a73054fe676b216a0cf872d1fc433125c62Danil Malyshevuint64_t LLVMGetSymbolFileOffset(LLVMSymbolIteratorRef SI) { 1543cb056797b17785cfd2429ce8232143d5aeb5e42Owen Anderson uint64_t ret; 155b0436a73054fe676b216a0cf872d1fc433125c62Danil Malyshev if (error_code ec = (*unwrap(SI))->getFileOffset(ret)) 1563cb056797b17785cfd2429ce8232143d5aeb5e42Owen Anderson report_fatal_error(ec.message()); 1573cb056797b17785cfd2429ce8232143d5aeb5e42Owen Anderson return ret; 1583cb056797b17785cfd2429ce8232143d5aeb5e42Owen Anderson} 1593cb056797b17785cfd2429ce8232143d5aeb5e42Owen Anderson 1603cb056797b17785cfd2429ce8232143d5aeb5e42Owen Andersonuint64_t LLVMGetSymbolSize(LLVMSymbolIteratorRef SI) { 1613cb056797b17785cfd2429ce8232143d5aeb5e42Owen Anderson uint64_t ret; 1623cb056797b17785cfd2429ce8232143d5aeb5e42Owen Anderson if (error_code ec = (*unwrap(SI))->getSize(ret)) 1633cb056797b17785cfd2429ce8232143d5aeb5e42Owen Anderson report_fatal_error(ec.message()); 1643cb056797b17785cfd2429ce8232143d5aeb5e42Owen Anderson return ret; 1653cb056797b17785cfd2429ce8232143d5aeb5e42Owen Anderson} 1663cb056797b17785cfd2429ce8232143d5aeb5e42Owen Anderson 1673529c53d2f07bb283e990d1678962f1b5eba9ba4Owen Anderson// RelocationRef accessors 1683529c53d2f07bb283e990d1678962f1b5eba9ba4Owen Andersonuint64_t LLVMGetRelocationAddress(LLVMRelocationIteratorRef RI) { 1693529c53d2f07bb283e990d1678962f1b5eba9ba4Owen Anderson uint64_t ret; 1703529c53d2f07bb283e990d1678962f1b5eba9ba4Owen Anderson if (error_code ec = (*unwrap(RI))->getAddress(ret)) 1713529c53d2f07bb283e990d1678962f1b5eba9ba4Owen Anderson report_fatal_error(ec.message()); 1723529c53d2f07bb283e990d1678962f1b5eba9ba4Owen Anderson return ret; 1733529c53d2f07bb283e990d1678962f1b5eba9ba4Owen Anderson} 1743529c53d2f07bb283e990d1678962f1b5eba9ba4Owen Anderson 175b0436a73054fe676b216a0cf872d1fc433125c62Danil Malyshevuint64_t LLVMGetRelocationOffset(LLVMRelocationIteratorRef RI) { 176b0436a73054fe676b216a0cf872d1fc433125c62Danil Malyshev uint64_t ret; 177b0436a73054fe676b216a0cf872d1fc433125c62Danil Malyshev if (error_code ec = (*unwrap(RI))->getOffset(ret)) 178b0436a73054fe676b216a0cf872d1fc433125c62Danil Malyshev report_fatal_error(ec.message()); 179b0436a73054fe676b216a0cf872d1fc433125c62Danil Malyshev return ret; 180b0436a73054fe676b216a0cf872d1fc433125c62Danil Malyshev} 181b0436a73054fe676b216a0cf872d1fc433125c62Danil Malyshev 1823529c53d2f07bb283e990d1678962f1b5eba9ba4Owen AndersonLLVMSymbolIteratorRef LLVMGetRelocationSymbol(LLVMRelocationIteratorRef RI) { 1833529c53d2f07bb283e990d1678962f1b5eba9ba4Owen Anderson SymbolRef ret; 1843529c53d2f07bb283e990d1678962f1b5eba9ba4Owen Anderson if (error_code ec = (*unwrap(RI))->getSymbol(ret)) 1853529c53d2f07bb283e990d1678962f1b5eba9ba4Owen Anderson report_fatal_error(ec.message()); 1863529c53d2f07bb283e990d1678962f1b5eba9ba4Owen Anderson 1873529c53d2f07bb283e990d1678962f1b5eba9ba4Owen Anderson return wrap(new symbol_iterator(ret)); 1883529c53d2f07bb283e990d1678962f1b5eba9ba4Owen Anderson} 1893529c53d2f07bb283e990d1678962f1b5eba9ba4Owen Anderson 1903529c53d2f07bb283e990d1678962f1b5eba9ba4Owen Andersonuint64_t LLVMGetRelocationType(LLVMRelocationIteratorRef RI) { 1913529c53d2f07bb283e990d1678962f1b5eba9ba4Owen Anderson uint64_t ret; 1923529c53d2f07bb283e990d1678962f1b5eba9ba4Owen Anderson if (error_code ec = (*unwrap(RI))->getType(ret)) 1933529c53d2f07bb283e990d1678962f1b5eba9ba4Owen Anderson report_fatal_error(ec.message()); 1943529c53d2f07bb283e990d1678962f1b5eba9ba4Owen Anderson return ret; 1953529c53d2f07bb283e990d1678962f1b5eba9ba4Owen Anderson} 1963529c53d2f07bb283e990d1678962f1b5eba9ba4Owen Anderson 1973529c53d2f07bb283e990d1678962f1b5eba9ba4Owen Anderson// NOTE: Caller takes ownership of returned string. 1983529c53d2f07bb283e990d1678962f1b5eba9ba4Owen Andersonconst char *LLVMGetRelocationTypeName(LLVMRelocationIteratorRef RI) { 1993529c53d2f07bb283e990d1678962f1b5eba9ba4Owen Anderson SmallVector<char, 0> ret; 2003529c53d2f07bb283e990d1678962f1b5eba9ba4Owen Anderson if (error_code ec = (*unwrap(RI))->getTypeName(ret)) 2013529c53d2f07bb283e990d1678962f1b5eba9ba4Owen Anderson report_fatal_error(ec.message()); 2023529c53d2f07bb283e990d1678962f1b5eba9ba4Owen Anderson 2033529c53d2f07bb283e990d1678962f1b5eba9ba4Owen Anderson char *str = static_cast<char*>(malloc(ret.size())); 2043529c53d2f07bb283e990d1678962f1b5eba9ba4Owen Anderson std::copy(ret.begin(), ret.end(), str); 2053529c53d2f07bb283e990d1678962f1b5eba9ba4Owen Anderson return str; 2063529c53d2f07bb283e990d1678962f1b5eba9ba4Owen Anderson} 2073529c53d2f07bb283e990d1678962f1b5eba9ba4Owen Anderson 2083529c53d2f07bb283e990d1678962f1b5eba9ba4Owen Anderson// NOTE: Caller takes ownership of returned string. 2093529c53d2f07bb283e990d1678962f1b5eba9ba4Owen Andersonconst char *LLVMGetRelocationValueString(LLVMRelocationIteratorRef RI) { 2103529c53d2f07bb283e990d1678962f1b5eba9ba4Owen Anderson SmallVector<char, 0> ret; 2113529c53d2f07bb283e990d1678962f1b5eba9ba4Owen Anderson if (error_code ec = (*unwrap(RI))->getValueString(ret)) 2123529c53d2f07bb283e990d1678962f1b5eba9ba4Owen Anderson report_fatal_error(ec.message()); 2133529c53d2f07bb283e990d1678962f1b5eba9ba4Owen Anderson 2143529c53d2f07bb283e990d1678962f1b5eba9ba4Owen Anderson char *str = static_cast<char*>(malloc(ret.size())); 2153529c53d2f07bb283e990d1678962f1b5eba9ba4Owen Anderson std::copy(ret.begin(), ret.end(), str); 2163529c53d2f07bb283e990d1678962f1b5eba9ba4Owen Anderson return str; 2173529c53d2f07bb283e990d1678962f1b5eba9ba4Owen Anderson} 2183529c53d2f07bb283e990d1678962f1b5eba9ba4Owen Anderson 219