本文整理汇总了C++中read_uleb128函数的典型用法代码示例。如果您正苦于以下问题:C++ read_uleb128函数的具体用法?C++ read_uleb128怎么用?C++ read_uleb128使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。
在下文中一共展示了read_uleb128函数的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: lsda_init
bool lsda_init(lsda_t* lsda, exception_context_t* context)
{
const uint8_t* data =
(const uint8_t*)_Unwind_GetLanguageSpecificData(context);
if(data == NULL)
return false;
lsda->region_start = _Unwind_GetRegionStart(context);
//-1 because IP points past the faulting instruction
lsda->ip = _Unwind_GetIP(context) - 1;
lsda->ip_offset = lsda->ip - lsda->region_start;
lsda->landing_pads = read_with_encoding(&data, lsda->region_start);
lsda->type_table_encoding = *data++;
if(lsda->type_table_encoding != DW_EH_PE_omit)
{
lsda->type_table = (const uint8_t*)read_uleb128(&data);
lsda->type_table += (uintptr_t)data;
} else {
lsda->type_table = NULL;
}
lsda->call_site_encoding = *data++;
uintptr_t length = read_uleb128(&data);
lsda->call_site_table = data;
lsda->action_table = data + length;
return true;
}
示例2: addUintPtr2
uintptr_t MachObject::exportedSymbolAddressCompressed(Symbol *sym)
{
const uint8_t* exportNode = (uint8_t*)(sym->addr);
const uint8_t* start = addUintPtr2(fLinkEditBase, fDyldInfo->export_off);
const uint8_t* end = addUintPtr3(fLinkEditBase, fDyldInfo->export_off, fDyldInfo->export_size);
bool runResolver = true;
uintptr_t result = 0;
if ((exportNode < start) || (exportNode > end))
lnk::halt("symbol not in a trie");
uint32_t flags = read_uleb128(exportNode, end);
if ((flags & EXPORT_SYMBOL_FLAGS_KIND_MASK) == EXPORT_SYMBOL_FLAGS_KIND_REGULAR) {
if ( runResolver && (flags & EXPORT_SYMBOL_FLAGS_STUB_AND_RESOLVER) ) {
lnk::halt("XXX: resolvers not implemented, fix macho loader on line %d", __LINE__);
return result;
}
return read_uleb128(exportNode, end) + (uintptr_t)fHeader;
}
else if ((flags & EXPORT_SYMBOL_FLAGS_KIND_MASK) == EXPORT_SYMBOL_FLAGS_KIND_THREAD_LOCAL) {
if (flags & EXPORT_SYMBOL_FLAGS_STUB_AND_RESOLVER)
lnk::halt("unsupported local exported symbol kind. flags=%d at node=%p", flags, sym);
return read_uleb128(exportNode, end) + (uintptr_t)fHeader;
}
else {
lnk::halt("unsupported exported symbol kind. flags=%d at node=%p", flags, sym);
}
}
示例3: parse_lsda_header
static const unsigned char *
parse_lsda_header (struct _Unwind_Context *context, const unsigned char *p,
lsda_header_info *info)
{
_Unwind_Word tmp;
unsigned char lpstart_encoding;
info->Start = (context ? _Unwind_GetRegionStart (context) : 0);
/* Find @LPStart, the base to which landing pad offsets are relative. */
lpstart_encoding = *p++;
if (lpstart_encoding != DW_EH_PE_omit)
p = read_encoded_value (context, lpstart_encoding, p, &info->LPStart);
else
info->LPStart = info->Start;
/* Find @TType, the base of the handler and exception spec type data. */
info->ttype_encoding = *p++;
if (info->ttype_encoding != DW_EH_PE_omit)
{
p = read_uleb128 (p, &tmp);
info->TType = p + tmp;
}
else
info->TType = 0;
/* The encoding and length of the call-site table; the action table
immediately follows. */
info->call_site_encoding = *p++;
p = read_uleb128 (p, &tmp);
info->action_table = p + tmp;
return p;
}
示例4: get_call_site_action_for
static void
get_call_site_action_for (_Unwind_Context *uw_context,
region_descriptor *region,
action_descriptor *action)
{
_Unwind_Ptr call_site
= _Unwind_GetIP (uw_context) - 1;
/* Subtract 1 because GetIP returns the actual call_site value + 1. */
/* call_site is a direct index into the call-site table, with two special
values : -1 for no-action and 0 for "terminate". The latter should never
show up for Ada. To test for the former, beware that _Unwind_Ptr might be
unsigned. */
if ((int)call_site < 0)
{
action->kind = nothing;
return;
}
else if (call_site == 0)
{
db (DB_ERR, "========> Err, null call_site for Ada/sjlj\n");
action->kind = nothing;
return;
}
else
{
_uleb128_t cs_lp, cs_action;
/* Let the caller know there may be an action to take, but let it
determine the kind. */
action->kind = unknown;
/* We have a direct index into the call-site table, but this table is
made of leb128 values, the encoding length of which is variable. We
can't merely compute an offset from the index, then, but have to read
all the entries before the one of interest. */
const unsigned char * p = region->call_site_table;
do {
p = read_uleb128 (p, &cs_lp);
p = read_uleb128 (p, &cs_action);
} while (--call_site);
action->landing_pad = cs_lp + 1;
if (cs_action)
action->table_entry = region->action_table + cs_action - 1;
else
action->table_entry = 0;
return;
}
}
示例5: get_cie_encoding
static int
get_cie_encoding (const struct dwarf_cie *cie)
{
const unsigned char *aug, *p;
_Unwind_Ptr dummy;
_uleb128_t utmp;
_sleb128_t stmp;
aug = cie->augmentation;
p = aug + strlen ((const char *)aug) + 1; /* Skip the augmentation string. */
if (__builtin_expect (cie->version >= 4, 0))
{
if (p[0] != sizeof (void *) || p[1] != 0)
return DW_EH_PE_omit; /* We are not prepared to handle unexpected
address sizes or segment selectors. */
p += 2; /* Skip address size and segment size. */
}
if (aug[0] != 'z')
return DW_EH_PE_absptr;
p = read_uleb128 (p, &utmp); /* Skip code alignment. */
p = read_sleb128 (p, &stmp); /* Skip data alignment. */
if (cie->version == 1) /* Skip return address column. */
p++;
else
p = read_uleb128 (p, &utmp);
aug++; /* Skip 'z' */
p = read_uleb128 (p, &utmp); /* Skip augmentation length. */
while (1)
{
/* This is what we're looking for. */
if (*aug == 'R')
return *p;
/* Personality encoding and pointer. */
else if (*aug == 'P')
{
/* ??? Avoid dereferencing indirect pointers, since we're
faking the base address. Gotta keep DW_EH_PE_aligned
intact, however. */
p = read_encoded_value_with_base (*p & 0x7F, 0, p + 1, &dummy);
}
/* LSDA encoding. */
else if (*aug == 'L')
p++;
/* Otherwise end of string, or unknown augmentation. */
else
return DW_EH_PE_absptr;
aug++;
}
}
示例6: get_region_description_for
static void
get_region_description_for (_Unwind_Context *uw_context,
region_descriptor *region)
{
const unsigned char * p;
_uleb128_t tmp;
unsigned char lpbase_encoding;
/* Get the base address of the lsda information. If the provided context
is null or if there is no associated language specific data, there's
nothing we can/should do. */
region->lsda
= (_Unwind_Ptr) (uw_context
? _Unwind_GetLanguageSpecificData (uw_context) : 0);
if (! region->lsda)
return;
/* Parse the lsda and fill the region descriptor. */
p = (const unsigned char *)region->lsda;
region->base = _Unwind_GetRegionStart (uw_context);
/* Find @LPStart, the base to which landing pad offsets are relative. */
lpbase_encoding = *p++;
if (lpbase_encoding != DW_EH_PE_omit)
p = read_encoded_value
(uw_context, lpbase_encoding, p, ®ion->lp_base);
else
region->lp_base = region->base;
/* Find @TType, the base of the handler and exception spec type data. */
region->ttype_encoding = *p++;
if (region->ttype_encoding != DW_EH_PE_omit)
{
p = read_uleb128 (p, &tmp);
region->ttype_table = p + tmp;
}
else
region->ttype_table = 0;
region->ttype_base
= base_of_encoded_value (region->ttype_encoding, uw_context);
/* Get the encoding and length of the call-site table; the action table
immediately follows. */
region->call_site_encoding = *p++;
region->call_site_table = read_uleb128 (p, &tmp);
region->action_table = region->call_site_table + tmp;
}
示例7: lsda_scan
_Unwind_Reason_Code lsda_scan(lsda_t* lsda, _Unwind_Action actions,
uintptr_t* lp)
{
(void)actions;
const uint8_t* p = lsda->call_site_table;
while(p < lsda->action_table)
{
uintptr_t start = read_encoded_ptr(&p, lsda->call_site_encoding);
uintptr_t length = read_encoded_ptr(&p, lsda->call_site_encoding);
uintptr_t landing_pad = read_encoded_ptr(&p, lsda->call_site_encoding);
// Pony ignores the action index, since it uses only cleanup landing pads.
read_uleb128(&p);
if((start <= lsda->ip_offset) && (lsda->ip_offset < (start + length)))
{
// No landing pad.
if(landing_pad == 0)
return _URC_CONTINUE_UNWIND;
// Pony doesn't read the type index or look up types. We treat cleanup
// landing pads the same as any other landing pad.
*lp = lsda->landing_pads + landing_pad;
return _URC_HANDLER_FOUND;
}
}
return _URC_CONTINUE_UNWIND;
}
示例8: read_filename
static bool
read_filename(struct dwbuf *names, const char **outdirname,
const char **outbasename, uint8_t opcode_base, uint64_t file)
{
if (file == 0)
return (false);
/* Skip over opcode table. */
size_t i;
for (i = 1; i < opcode_base; i++) {
uint64_t dummy;
if (!read_uleb128(names, &dummy))
return (false);
}
/* Skip over directory name table for now. */
struct dwbuf dirnames = *names;
for (;;) {
const char *name;
if (!read_string(names, &name))
return (false);
if (*name == '\0')
break;
}
/* Locate file entry. */
const char *basename = NULL;
uint64_t dir = 0;
for (i = 0; i < file; i++) {
uint64_t mtime, size;
if (!read_string(names, &basename) || *basename == '\0' ||
!read_uleb128(names, &dir) ||
!read_uleb128(names, &mtime) ||
!read_uleb128(names, &size))
return (false);
}
const char *dirname = NULL;
for (i = 0; i < dir; i++) {
if (!read_string(&dirnames, &dirname) || *dirname == '\0')
return (false);
}
*outdirname = dirname;
*outbasename = basename;
return (true);
}
示例9: get_call_site_action_for
static void
get_call_site_action_for (_Unwind_Context *uw_context,
region_descriptor *region,
action_descriptor *action)
{
const unsigned char *p = region->call_site_table;
_Unwind_Ptr ip = get_ip_from_context (uw_context);
/* Unless we are able to determine otherwise... */
action->kind = nothing;
db (DB_CSITE, "\n");
while (p < region->action_table)
{
_Unwind_Ptr cs_start, cs_len, cs_lp;
_uleb128_t cs_action;
/* Note that all call-site encodings are "absolute" displacements. */
p = read_encoded_value (0, region->call_site_encoding, p, &cs_start);
p = read_encoded_value (0, region->call_site_encoding, p, &cs_len);
p = read_encoded_value (0, region->call_site_encoding, p, &cs_lp);
p = read_uleb128 (p, &cs_action);
db (DB_CSITE,
"c_site @ %p (+%p), len = %p, lpad @ %p (+%p)\n",
(void *)region->base + cs_start, (void *)cs_start, (void *)cs_len,
(void *)region->lp_base + cs_lp, (void *)cs_lp);
/* The table is sorted, so if we've passed the IP, stop. */
if (ip < region->base + cs_start)
break;
/* If we have a match, fill the ACTION fields accordingly. */
else if (ip < region->base + cs_start + cs_len)
{
/* Let the caller know there may be an action to take, but let it
determine the kind. */
action->kind = unknown;
if (cs_lp)
action->landing_pad = region->lp_base + cs_lp;
else
action->landing_pad = 0;
if (cs_action)
action->table_entry = region->action_table + cs_action - 1;
else
action->table_entry = 0;
db (DB_CSITE, "+++\n");
return;
}
}
db (DB_CSITE, "---\n");
}
示例10: get_cie_encoding
static int
get_cie_encoding (struct dwarf_cie *cie)
{
const unsigned char *aug, *p;
_Unwind_Ptr dummy;
_Unwind_Word utmp;
_Unwind_Sword stmp;
aug = cie->augmentation;
if (aug[0] != 'z')
return DW_EH_PE_absptr;
/* Skip the augmentation string. */
p = aug + strlen ((const char *) aug) + 1;
p = read_uleb128 (p, &utmp); /* Skip code alignment. */
p = read_sleb128 (p, &stmp); /* Skip data alignment. */
p++; /* Skip return address column. */
aug++; /* Skip 'z' */
p = read_uleb128 (p, &utmp); /* Skip augmentation length. */
while (1)
{
/* This is what we're looking for. */
if (*aug == 'R')
return *p;
/* Personality encoding and pointer. */
else if (*aug == 'P')
{
/* ??? Avoid dereferencing indirect pointers, since we're
faking the base address. Gotta keep DW_EH_PE_aligned
intact, however. */
p = read_encoded_value_with_base (*p & 0x7F, 0, p + 1, &dummy);
}
/* LSDA encoding. */
else if (*aug == 'L')
p++;
/* Otherwise end of string, or unknown augmentation. */
else
return DW_EH_PE_absptr;
aug++;
}
}
示例11: redex_assert
DexString* DexIdx::get_stringidx_fromdex(uint32_t stridx) {
redex_assert(stridx < m_string_ids_size);
uint32_t stroff = m_string_ids[stridx].offset;
always_assert_log(
stroff < ((dex_header*)m_dexbase)->file_size,
"String data offset out of range");
const uint8_t* dstr = m_dexbase + stroff;
/* Strip off uleb128 size encoding */
int utfsize = read_uleb128(&dstr);
return DexString::make_string((const char*)dstr, utfsize);
}
示例12: parse_lsda_header
static const unsigned char *
parse_lsda_header (struct _Unwind_Context *context, const unsigned char *p,
struct lsda_header_info *info)
{
_uleb128_t tmp;
unsigned char lpstart_encoding;
info->Start = (context ? _Unwind_GetRegionStart (context) : 0);
/* Find @LPStart, the base to which landing pad offsets are
relative. */
lpstart_encoding = *p++;
if (lpstart_encoding != DW_EH_PE_omit)
p = read_encoded_value (context, lpstart_encoding, p, &info->LPStart);
else
info->LPStart = info->Start;
/* Find @TType, the base of the handler and exception spec type
data. */
info->ttype_encoding = *p++;
if (info->ttype_encoding != DW_EH_PE_omit)
{
#if _GLIBCXX_OVERRIDE_TTYPE_ENCODING
/* Older ARM EABI toolchains set this value incorrectly, so use a
hardcoded OS-specific format. */
info->ttype_encoding = _GLIBCXX_OVERRIDE_TTYPE_ENCODING;
#endif
p = read_uleb128 (p, &tmp);
info->TType = p + tmp;
}
else
info->TType = 0;
/* The encoding and length of the call-site table; the action table
immediately follows. */
info->call_site_encoding = *p++;
p = read_uleb128 (p, &tmp);
info->action_table = p + tmp;
return p;
}
示例13: read_abbrev
static GHashTable *
read_abbrev (DebuginfoData *data, unsigned char *ptr)
{
GHashTable *h;
unsigned int attr, entry, form;
struct abbrev_tag *t;
int size;
h = g_hash_table_new_full (g_direct_hash, g_direct_equal,
NULL, g_free);
while ((attr = read_uleb128 (ptr)) != 0)
{
size = 10;
entry = attr;
t = g_malloc (sizeof (*t) + size * sizeof (struct abbrev_attr));
t->tag = read_uleb128 (ptr);
t->nattr = 0;
++ptr; /* skip children flag. */
while ((attr = read_uleb128 (ptr)) != 0)
{
if (t->nattr == size)
{
size += 10;
t = g_realloc (t, sizeof (*t) + size * sizeof (struct abbrev_attr));
}
form = read_uleb128 (ptr);
if (form == 2 || (form > DW_FORM_flag_present && form != DW_FORM_ref_sig8))
g_warning ("%s: Unknown DWARF DW_FORM_%d", data->filename, form);
t->attr[t->nattr].attr = attr;
t->attr[t->nattr++].form = form;
}
if (read_uleb128 (ptr) != 0)
g_warning ("%s: DWARF abbreviation does not end with 2 zeros", data->filename);
g_hash_table_insert (h, GINT_TO_POINTER (entry), t);
}
return h;
}
示例14: dwarf2_tracepoint_var_ref
static void
dwarf2_tracepoint_var_ref (struct symbol * symbol, struct agent_expr * ax,
struct axs_value * value, unsigned char *data,
int size)
{
if (size == 0)
error ("Symbol \"%s\" has been optimized out.",
SYMBOL_PRINT_NAME (symbol));
if (size == 1
&& data[0] >= DW_OP_reg0
&& data[0] <= DW_OP_reg31)
{
value->kind = axs_lvalue_register;
value->u.reg = data[0] - DW_OP_reg0;
}
else if (data[0] == DW_OP_regx)
{
ULONGEST reg;
read_uleb128 (data + 1, data + size, ®);
value->kind = axs_lvalue_register;
value->u.reg = reg;
}
else if (data[0] == DW_OP_fbreg)
{
/* And this is worse than just minimal; we should honor the frame base
as above. */
int frame_reg;
LONGEST frame_offset;
unsigned char *buf_end;
buf_end = read_sleb128 (data + 1, data + size, &frame_offset);
if (buf_end != data + size)
error ("Unexpected opcode after DW_OP_fbreg for symbol \"%s\".",
SYMBOL_PRINT_NAME (symbol));
TARGET_VIRTUAL_FRAME_POINTER (ax->scope, &frame_reg, &frame_offset);
ax_reg (ax, frame_reg);
ax_const_l (ax, frame_offset);
ax_simple (ax, aop_add);
ax_const_l (ax, frame_offset);
ax_simple (ax, aop_add);
value->kind = axs_lvalue_memory;
}
else
error ("Unsupported DWARF opcode in the location of \"%s\".",
SYMBOL_PRINT_NAME (symbol));
}
示例15: CS
bool MachObject::findExportedSymbolCompressed(const char* symbol, Symbol* sym)
{
/*
This is a slightly tidier version of 'findExportedSymbol'
from dyld. Still no fucking idea what the semantics of it
are since I suck at CS (lol, wtf is a trie?!).
*/
/* export table sanity */
if (fDyldInfo->export_size == 0)
return false;
const uint8_t* start = addUintPtr2(fLinkEditBase, fDyldInfo->export_off);
const uint8_t* end = addUintPtr3(fLinkEditBase, fDyldInfo->export_off, fDyldInfo->export_size);
const uint8_t* foundNodeStart = trie_walk(start, end, symbol);
if (foundNodeStart != NULL) {
const uint8_t* p = foundNodeStart;
const uint32_t flags = read_uleb128(p, end);
if (flags & EXPORT_SYMBOL_FLAGS_REEXPORT) {
lnk::halt("no fucking idea, honestly");
return false;
}
else {
sym->addr = (void*)foundNodeStart;
sym->inImage = (void*)this;
return true;
}
}
else {
return false;
}
}