本文整理汇总了C++中read_uleb128函数的典型用法代码示例。如果您正苦于以下问题:C++ read_uleb128函数的具体用法?C++ read_uleb128怎么用?C++ read_uleb128使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。
在下文中一共展示了read_uleb128函数的20个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于我们的系统推荐出更棒的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;
}
开发者ID:dleonard0,项目名称:ponyc,代码行数:32,代码来源:lsda.c
示例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);
}
}
开发者ID:christinaa,项目名称:libSystem_and_linker,代码行数:31,代码来源:lnk_macho.cpp
示例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;
}
开发者ID:DJHartley,项目名称:iphone-dev,代码行数:34,代码来源:unwind-c.c
示例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;
}
}
开发者ID:IntegerCompany,项目名称:linaro-android-gcc,代码行数:56,代码来源:raise-gcc.c
示例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++;
}
}
开发者ID:abumaryam,项目名称:gcc,代码行数:52,代码来源:unwind-dw2-fde.c
示例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;
}
开发者ID:OrkFyurer,项目名称:gcc,代码行数:51,代码来源:raise-gcc.c
示例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;
}
开发者ID:dleonard0,项目名称:ponyc,代码行数:30,代码来源:lsda.c
示例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);
}
开发者ID:SylvestreG,项目名称:bitrig,代码行数:47,代码来源:db_dwarf.c
示例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");
}
开发者ID:DCPUTools,项目名称:dcpu16-gcc,代码行数:57,代码来源:raise-gcc.c
示例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++;
}
}
开发者ID:chonghw,项目名称:pemu,代码行数:42,代码来源:unwind-dw2-fde.c
示例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);
}
开发者ID:facebook,项目名称:redex,代码行数:11,代码来源:DexIdx.cpp
示例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;
}
开发者ID:Gwenio,项目名称:DragonFlyBSD,代码行数:41,代码来源:exception.c
示例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;
}
开发者ID:sanjayankur31,项目名称:flatpak,代码行数:40,代码来源:builder-utils.c
示例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));
}
开发者ID:unofficial-opensource-apple,项目名称:gdbforcw,代码行数:49,代码来源:dwarf2loc.c
示例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;
}
}
开发者ID:christinaa,项目名称:libSystem_and_linker,代码行数:36,代码来源:lnk_macho.cpp
示例16: rebaseCompressed
/*
* This is used by the sliding function to read and execute
* the compressed reloc table.
*/
static void rebaseCompressed(struct dyld_info_command* dyldInfo,
macho_segment_command* linkEdit,
uintptr_t slide,
macho_segment_command** segments,
int segCount)
{
/*
* HARD MODE!!!
*/
const uint8_t* base = (uint8_t*)((linkEdit->vmaddr + slide) - linkEdit->fileoff);
const uint8_t* start = addUintPtr2(dyldInfo->rebase_off, base);
const uint8_t* end = addUintPtr3(dyldInfo->rebase_size, dyldInfo->rebase_off, base);
const uint8_t* p = start;
/*
* If you want a better documented version of this code, see 'MachObject.cpp'
*/
uint8_t type = 0;
int segmentIndex = 0;
uintptr_t address = (segments[0]->vmaddr + slide);
uintptr_t segmentEndAddress = (segments[0]->vmaddr + slide + segments[0]->vmsize);
uint32_t count;
uint32_t skip;
bool done = false;
while ( !done && (p < end) ) {
uint8_t immediate = *p & REBASE_IMMEDIATE_MASK;
uint8_t opcode = *p & REBASE_OPCODE_MASK;
++p;
switch (opcode) {
case REBASE_OPCODE_DONE:
done = true;
break;
case REBASE_OPCODE_SET_TYPE_IMM:
type = immediate;
break;
case REBASE_OPCODE_SET_SEGMENT_AND_OFFSET_ULEB:
segmentIndex = immediate;
if (segmentIndex > segCount)
lnk::ldbg::printText("LNK_RELOC_ERROR: baaaad whatever \n");
address = (segments[segmentIndex]->vmaddr + slide) + read_uleb128(p, end);
segmentEndAddress = (segments[segmentIndex]->vmaddr + segments[segmentIndex]->vmsize + slide);
break;
case REBASE_OPCODE_ADD_ADDR_ULEB:
address += read_uleb128(p, end);
break;
case REBASE_OPCODE_ADD_ADDR_IMM_SCALED:
address += immediate*sizeof(uintptr_t);
break;
case REBASE_OPCODE_DO_REBASE_IMM_TIMES:
for (int i=0; i < immediate; ++i) {
if ( address >= segmentEndAddress )
lnk::ldbg::printText("LNK_RELOC_ERROR: baaaad REBASE_OPCODE_DO_REBASE_IMM_TIMES \n");
rebaseAt(address, slide, type);
address += sizeof(uintptr_t);
}
break;
case REBASE_OPCODE_DO_REBASE_ULEB_TIMES:
count = read_uleb128(p, end);
for (uint32_t i=0; i < count; ++i) {
if ( address >= segmentEndAddress )
lnk::ldbg::printText("LNK_RELOC_ERROR: baaaad REBASE_OPCODE_DO_REBASE_ULEB_TIMES \n");
rebaseAt(address, slide, type);
address += sizeof(uintptr_t);
}
break;
case REBASE_OPCODE_DO_REBASE_ADD_ADDR_ULEB:
if ( address >= segmentEndAddress )
lnk::ldbg::printText("LNK_RELOC_ERROR: baaaad REBASE_OPCODE_DO_REBASE_ADD_ADDR_ULEB \n");
rebaseAt(address, slide, type);
address += read_uleb128(p, end) + sizeof(uintptr_t);
break;
case REBASE_OPCODE_DO_REBASE_ULEB_TIMES_SKIPPING_ULEB:
count = read_uleb128(p, end);
skip = read_uleb128(p, end);
for (uint32_t i=0; i < count; ++i) {
if ( address >= segmentEndAddress )
lnk::ldbg::printText("LNK_RELOC_ERROR: baaaad REBASE_OPCODE_DO_REBASE_ULEB_TIMES_SKIPPING_ULEB \n");
rebaseAt(address, slide, type);
address += skip + sizeof(uintptr_t);
}
break;
default:
_printAbrt();
}
}
}
开发者ID:cooljeanius,项目名称:libSystem_and_linker,代码行数:96,代码来源:lnk_bootstrap.cpp
示例17: handle_dwarf2_line
static gboolean
handle_dwarf2_line (DebuginfoData *data, uint32_t off, char *comp_dir, GHashTable *files, GError **error)
{
unsigned char *ptr = data->debug_sections[DEBUG_LINE].data, *dir;
unsigned char **dirt;
unsigned char *endsec = ptr + data->debug_sections[DEBUG_LINE].size;
unsigned char *endcu, *endprol;
unsigned char opcode_base;
uint32_t value, dirt_cnt;
size_t comp_dir_len = !comp_dir ? 0 : strlen (comp_dir);
/* XXX: RhBug:929365, should we error out instead of ignoring? */
if (ptr == NULL)
return TRUE;
ptr += off;
endcu = ptr + 4;
endcu += read_32 (ptr);
if (endcu == ptr + 0xffffffff)
return flatpak_fail (error, "%s: 64-bit DWARF not supported", data->filename);
if (endcu > endsec)
return flatpak_fail (error, "%s: .debug_line CU does not fit into section", data->filename);
value = read_16 (ptr);
if (value != 2 && value != 3 && value != 4)
return flatpak_fail (error, "%s: DWARF version %d unhandled", data->filename, value);
endprol = ptr + 4;
endprol += read_32 (ptr);
if (endprol > endcu)
return flatpak_fail (error, "%s: .debug_line CU prologue does not fit into CU", data->filename);
opcode_base = ptr[4 + (value >= 4)];
ptr = dir = ptr + 4 + (value >= 4) + opcode_base;
/* dir table: */
value = 1;
while (*ptr != 0)
{
ptr = (unsigned char *) strchr ((char *) ptr, 0) + 1;
++value;
}
dirt = (unsigned char **) alloca (value * sizeof (unsigned char *));
dirt[0] = (unsigned char *) ".";
dirt_cnt = 1;
ptr = dir;
while (*ptr != 0)
{
dirt[dirt_cnt++] = ptr;
ptr = (unsigned char *) strchr ((char *) ptr, 0) + 1;
}
ptr++;
/* file table: */
while (*ptr != 0)
{
char *s, *file;
size_t file_len, dir_len;
file = (char *) ptr;
ptr = (unsigned char *) strchr ((char *) ptr, 0) + 1;
value = read_uleb128 (ptr);
if (value >= dirt_cnt)
return flatpak_fail (error, "%s: Wrong directory table index %u", data->filename, value);
file_len = strlen (file);
dir_len = strlen ((char *) dirt[value]);
s = g_malloc (comp_dir_len + 1 + file_len + 1 + dir_len + 1);
if (*file == '/')
{
memcpy (s, file, file_len + 1);
}
else if (*dirt[value] == '/')
{
memcpy (s, dirt[value], dir_len);
s[dir_len] = '/';
memcpy (s + dir_len + 1, file, file_len + 1);
}
else
{
char *p = s;
if (comp_dir_len != 0)
{
memcpy (s, comp_dir, comp_dir_len);
s[comp_dir_len] = '/';
p += comp_dir_len + 1;
}
memcpy (p, dirt[value], dir_len);
p[dir_len] = '/';
memcpy (p + dir_len + 1, file, file_len + 1);
}
canonicalize_path (s, s);
if (s)
g_hash_table_insert (files, s, NULL);
//.........这里部分代码省略.........
开发者ID:sanjayankur31,项目名称:flatpak,代码行数:101,代码来源:builder-utils.c
示例18: PERSONALITY_FUNCTION
//.........这里部分代码省略.........
language_specific_data = (const unsigned char *)
_Unwind_GetLanguageSpecificData (context);
/* If no LSDA, then there are no handlers or cleanups. */
if (! language_specific_data)
CONTINUE_UNWINDING;
/* Parse the LSDA header. */
p = parse_lsda_header (context, language_specific_data, &info);
info.ttype_base = base_of_encoded_value (info.ttype_encoding, context);
#ifdef HAVE_GETIPINFO
ip = _Unwind_GetIPInfo (context, &ip_before_insn);
#else
ip = _Unwind_GetIP (context);
#endif
if (! ip_before_insn)
--ip;
landing_pad = 0;
action_record = 0;
handler_switch_value = 0;
#ifdef SJLJ_EXCEPTIONS
/* The given "IP" is an index into the call-site table, with two
exceptions -- -1 means no-action, and 0 means terminate. But
since we're using uleb128 values, we've not got random access
to the array. */
if ((int) ip < 0)
return _URC_CONTINUE_UNWIND;
else
{
_Unwind_Word cs_lp, cs_action;
do
{
p = read_uleb128 (p, &cs_lp);
p = read_uleb128 (p, &cs_action);
}
while (--ip);
/* Can never have null landing pad for sjlj -- that would have
been indicated by a -1 call site index. */
landing_pad = cs_lp + 1;
if (cs_action)
action_record = info.action_table + cs_action - 1;
goto found_something;
}
#else
/* Search the call-site table for the action associated with this IP. */
while (p < info.action_table)
{
_Unwind_Ptr cs_start, cs_len, cs_lp;
_Unwind_Word cs_action;
/* Note that all call-site encodings are "absolute" displacements. */
p = read_encoded_value (0, info.call_site_encoding, p, &cs_start);
p = read_encoded_value (0, info.call_site_encoding, p, &cs_len);
p = read_encoded_value (0, info.call_site_encoding, p, &cs_lp);
p = read_uleb128 (p, &cs_action);
/* The table is sorted, so if we've passed the ip, stop. */
if (ip < info.Start + cs_start)
p = info.action_table;
else if (ip < info.Start + cs_start + cs_len)
{
if (cs_lp)
landing_pad = info.LPStart + cs_lp;
if (cs_action)
开发者ID:a565109863,项目名称:src,代码行数:67,代码来源:exception.c
示例19: __runa_personality
_Unwind_Reason_Code __runa_personality(int version,
_Unwind_Action actions, _Unwind_Exception_Class exception_class,
struct _Unwind_Exception *ue_header, struct _Unwind_Context *context) {
enum found_handler_type {
found_nothing, found_terminate, found_cleanup, found_handler
} found_type;
struct lsda_header_info info;
const unsigned char *language_specific_data;
const unsigned char *action_record;
const unsigned char *p;
_Unwind_Ptr landing_pad, ip;
int handler_switch_value;
void* thrown_ptr = 0;
bool foreign_exception;
int ip_before_insn = 0;
//__cxa_exception* xh = __get_exception_header_from_ue(ue_header);
// Interface version check.
if (version != 1)
return _URC_FATAL_PHASE1_ERROR;
foreign_exception = exception_class != RUNA_CLASS;
// Shortcut for phase 2 found handler for domestic exception.
if (actions == (_UA_CLEANUP_PHASE | _UA_HANDLER_FRAME) && !foreign_exception) {
restore_caught_exception(ue_header, &handler_switch_value,
&language_specific_data, &landing_pad);
found_type = (landing_pad == 0 ? found_terminate : found_handler);
goto install_context;
}
language_specific_data = (const unsigned char *) _Unwind_GetLanguageSpecificData(context);
// If no LSDA, then there are no handlers or cleanups.
if (!language_specific_data)
return _URC_CONTINUE_UNWIND;
// Parse the LSDA header.
p = parse_lsda_header(context, language_specific_data, &info);
info.ttype_base = base_of_encoded_value(info.ttype_encoding, context);
ip = _Unwind_GetIPInfo(context, &ip_before_insn);
//ip = _Unwind_GetIP(context);
if (!ip_before_insn)
--ip;
landing_pad = 0;
action_record = 0;
handler_switch_value = 0;
// Search the call-site table for the action associated with this IP.
while (p < info.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, info.call_site_encoding, p, &cs_start);
p = read_encoded_value(0, info.call_site_encoding, p, &cs_len);
p = read_encoded_value(0, info.call_site_encoding, p, &cs_lp);
p = read_uleb128(p, &cs_action);
// The table is sorted, so if we've passed the ip, stop.
if (ip < info.Start + cs_start) {
p = info.action_table;
} else if (ip < info.Start + cs_start + cs_len) {
if (cs_lp)
landing_pad = info.LPStart + cs_lp;
if (cs_action)
action_record = info.action_table + cs_action - 1;
goto found_something;
}
}
// If ip is not present in the table, call terminate. This is for
// a destructor inside a cleanup, or a library routine the compiler
// was not expecting to throw.
found_type = found_terminate;
goto do_something;
found_something:
if (landing_pad == 0) {
// If ip is present, and has a null landing pad, there are
// no cleanups or handlers to be run.
found_type = found_nothing;
} else if (action_record == 0) {
// If ip is present, has a non-null landing pad, and a null
// action table offset, then there are only cleanups present.
// Cleanups use a zero switch value, as set above.
found_type = found_cleanup;
} else {
// Otherwise we have a catch handler or exception specification.
_sleb128_t ar_filter, ar_disp;
//const std::type_info* catch_type;
//_throw_typet* throw_type;
bool saw_cleanup = false;
//.........这里部分代码省略.........
开发者ID:djc,项目名称:runa,代码行数:101,代码来源:personality.c
示例20: PERSONALITY_FUNCTION
_Unwind_Reason_Code
PERSONALITY_FUNCTION (int version,
_Unwind_Action actions,
_Unwind_Exception_Class exception_class,
struct _Unwind_Exception *ue_header,
struct _Unwind_Context *context)
#endif
{
lsda_header_info info;
const unsigned char *language_specific_data, *p, *action_record;
_Unwind_Ptr landing_pad, ip;
int ip_before_insn = 0;
_Bool is_foreign;
G *g;
#ifdef __ARM_EABI_UNWINDER__
_Unwind_Action actions;
switch (state & _US_ACTION_MASK)
{
case _US_VIRTUAL_UNWIND_FRAME:
actions = _UA_SEARCH_PHASE;
break;
case _US_UNWIND_FRAME_STARTING:
actions = _UA_CLEANUP_PHASE;
if (!(state & _US_FORCE_UNWIND)
&& ue_header->barrier_cache.sp == _Unwind_GetGR(context, 13))
actions |= _UA_HANDLER_FRAME;
break;
case _US_UNWIND_FRAME_RESUME:
CONTINUE_UNWINDING;
break;
default:
abort();
}
actions |= state & _US_FORCE_UNWIND;
is_foreign = 0;
/* The dwarf unwinder assumes the context structure holds things like the
function and LSDA pointers. The ARM implementation caches these in
the exception header (UCB). To avoid rewriting everything we make the
virtual IP register point at the UCB. */
ip = (_Unwind_Ptr) ue_header;
_Unwind_SetGR (context, 12, ip);
#else
if (version != 1)
return _URC_FATAL_PHASE1_ERROR;
is_foreign = exception_class != __go_exception_class;
#endif
language_specific_data = (const unsigned char *)
_Unwind_GetLanguageSpecificData (context);
/* If no LSDA, then there are no handlers or cleanups. */
if (! language_specific_data)
CONTINUE_UNWINDING;
/* Parse the LSDA header. */
p = parse_lsda_header (context, language_specific_data, &info);
#ifdef HAVE_GETIPINFO
ip = _Unwind_GetIPInfo (context, &ip_before_insn);
#else
ip = _Unwind_GetIP (context);
#endif
if (! ip_before_insn)
--ip;
landing_pad = 0;
action_record = NULL;
#ifdef __USING_SJLJ_EXCEPTIONS__
/* The given "IP" is an index into the call-site table, with two
exceptions -- -1 means no-action, and 0 means terminate. But
since we're using uleb128 values, we've not got random access
to the array. */
if ((int) ip <= 0)
return _URC_CONTINUE_UNWIND;
else
{
_uleb128_t cs_lp, cs_action;
do
{
p = read_uleb128 (p, &cs_lp);
p = read_uleb128 (p, &cs_action);
}
while (--ip);
/* Can never have null landing pad for sjlj -- that would have
been indicated by a -1 call site index. */
landing_pad = (_Unwind_Ptr)cs_lp + 1;
if (cs_action)
action_record = info.action_table + cs_action - 1;
goto found_something;
}
#else
/* Search the call-site table for the action associated with this IP. */
//.........这里部分代码省略.........
开发者ID:markus-oberhumer,项目名称:gcc,代码行数:101,代码来源:go-unwind.c
注:本文中的read_uleb128函数示例由纯净天空整理自Github/MSDocs等源码及文档管理平台,相关代码片段筛选自各路编程大神贡献的开源项目,源码版权归原作者所有,传播和使用请参考对应项目的License;未经允许,请勿转载。 |
请发表评论