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