aboutsummaryrefslogtreecommitdiff
AgeCommit message (Collapse)AuthorFilesLines
2020-07-22libctf: pass the thunk down properly when wrapping qsort_rNick Alcock2-1/+5
When wrapping qsort_r on a system like FreeBSD on which the compar argument comes first, we wrap the passed arg in a thunk so we can pass down both the caller-supplied comparator function and its argument. We should pass the *argument* down to the comparator, not the thunk, which is basically random nonsense on the stack from the point of view of the caller of qsort_r. libctf/ ctf-decls.h (ctf_qsort_compar_thunk): Fix arg passing.
2020-07-22libctf, next, hash: add dynhash and dynset _next iterationNick Alcock5-1/+305
This lets you iterate over dynhashes and dynsets using the _next API. dynhashes can be iterated over in sorted order, which works by populating an array of key/value pairs using ctf_dynhash_next itself, then sorting it with qsort. Convenience inline functions named ctf_dyn{hash,set}_cnext are also provided that take (-> return) const keys and values. libctf/ * ctf-impl.h (ctf_next_hkv_t): New, kv-pairs passed to sorting functions. (ctf_next_t) <u.ctn_sorted_hkv>: New, sorted kv-pairs for ctf_dynhash_next_sorted. <cu.ctn_h>: New, pointer to the dynhash under iteration. <cu.ctn_s>: New, pointer to the dynset under iteration. (ctf_hash_sort_f): Sorting function passed to... (ctf_dynhash_next_sorted): ... this new function. (ctf_dynhash_next): New. (ctf_dynset_next): New. * ctf-inlines.h (ctf_dynhash_cnext_sorted): New. (ctf_dynhash_cnext): New. (ctf_dynset_cnext): New. * ctf-hash.c (ctf_dynhash_next_sorted): New. (ctf_dynhash_next): New. (ctf_dynset_next): New. * ctf-util.c (ctf_next_destroy): Free the u.ctn_sorted_hkv if needed. (ctf_next_copy): Alloc-and-copy the u.ctn_sorted_hkv if needed.
2020-07-22libctf, next: introduce new class of easier-to-use iteratorsNick Alcock9-10/+606
The libctf machinery currently only provides one way to iterate over its data structures: ctf_*_iter functions that take a callback and an arg and repeatedly call it. This *works*, but if you are doing a lot of iteration it is really quite inconvenient: you have to package up your local variables into structures over and over again and spawn lots of little functions even if it would be clearer in a single run of code. Look at ctf-string.c for an extreme example of how unreadable this can get, with three-line-long functions proliferating wildly. The deduplicator takes this to the Nth level. It iterates over a whole bunch of things: if we'd had to use _iter-class iterators for all of them there would be twenty additional functions in the deduplicator alone, for no other reason than that the iterator API requires it. Let's do something better. strtok_r gives us half the design: generators in a number of other languages give us the other half. The *_next API allows you to iterate over CTF-like entities in a single function using a normal while loop. e.g. here we are iterating over all the types in a dict: ctf_next_t *i = NULL; int *hidden; ctf_id_t id; while ((id = ctf_type_next (fp, &i, &hidden, 1)) != CTF_ERR) { /* do something with 'hidden' and 'id' */ } if (ctf_errno (fp) != ECTF_NEXT_END) /* iteration error */ Here we are walking through the members of a struct with CTF ID 'struct_type': ctf_next_t *i = NULL; ssize_t offset; const char *name; ctf_id_t membtype; while ((offset = ctf_member_next (fp, struct_type, &i, &name, &membtype)) >= 0 { /* do something with offset, name, and membtype */ } if (ctf_errno (fp) != ECTF_NEXT_END) /* iteration error */ Like every other while loop, this means you have access to all the local variables outside the loop while inside it, with no need to tiresomely package things up in structures, move the body of the loop into a separate function, etc, as you would with an iterator taking a callback. ctf_*_next allocates 'i' for you on first entry (when it must be NULL), and frees and NULLs it and returns a _next-dependent flag value when the iteration is over: the fp errno is set to ECTF_NEXT_END when the iteartion ends normally. If you want to exit early, call ctf_next_destroy on the iterator. You can copy iterators using ctf_next_copy, which copies their current iteration position so you can remember loop positions and go back to them later (or ctf_next_destroy them if you don't need them after all). Each _next function returns an always-likely-to-be-useful property of the thing being iterated over, and takes pointers to parameters for the others: with very few exceptions all those parameters can be NULLs if you're not interested in them, so e.g. you can iterate over only the offsets of members of a structure this way: while ((offset = ctf_member_next (fp, struct_id, &i, NULL, NULL)) >= 0) If you pass an iterator in use by one iteration function to another one, you get the new error ECTF_NEXT_WRONGFUN back; if you try to change ctf_file_t in mid-iteration, you get ECTF_NEXT_WRONGFP back. Internally the ctf_next_t remembers the iteration function in use, various sizes and increments useful for almost all iterations, then uses unions to overlap the actual entities being iterated over to keep ctf_next_t size down. Iterators available in the public API so far (all tested in actual use in the deduplicator): /* Iterate over the members of a STRUCT or UNION, returning each member's offset and optionally name and member type in turn. On end-of-iteration, returns -1. */ ssize_t ctf_member_next (ctf_file_t *fp, ctf_id_t type, ctf_next_t **it, const char **name, ctf_id_t *membtype); /* Iterate over the members of an enum TYPE, returning each enumerand's NAME or NULL at end of iteration or error, and optionally passing back the enumerand's integer VALue. */ const char * ctf_enum_next (ctf_file_t *fp, ctf_id_t type, ctf_next_t **it, int *val); /* Iterate over every type in the given CTF container (not including parents), optionally including non-user-visible types, returning each type ID and optionally the hidden flag in turn. Returns CTF_ERR on end of iteration or error. */ ctf_id_t ctf_type_next (ctf_file_t *fp, ctf_next_t **it, int *flag, int want_hidden); /* Iterate over every variable in the given CTF container, in arbitrary order, returning the name and type of each variable in turn. The NAME argument is not optional. Returns CTF_ERR on end of iteration or error. */ ctf_id_t ctf_variable_next (ctf_file_t *fp, ctf_next_t **it, const char **name); /* Iterate over all CTF files in an archive, returning each dict in turn as a ctf_file_t, and NULL on error or end of iteration. It is the caller's responsibility to close it. Parent dicts may be skipped. Regardless of whether they are skipped or not, the caller must ctf_import the parent if need be. */ ctf_file_t * ctf_archive_next (const ctf_archive_t *wrapper, ctf_next_t **it, const char **name, int skip_parent, int *errp); ctf_label_next is prototyped but not implemented yet. include/ * ctf-api.h (ECTF_NEXT_END): New error. (ECTF_NEXT_WRONGFUN): Likewise. (ECTF_NEXT_WRONGFP): Likewise. (ECTF_NERR): Adjust. (ctf_next_t): New. (ctf_next_create): New prototype. (ctf_next_destroy): Likewise. (ctf_next_copy): Likewise. (ctf_member_next): Likewise. (ctf_enum_next): Likewise. (ctf_type_next): Likewise. (ctf_label_next): Likewise. (ctf_variable_next): Likewise. libctf/ * ctf-impl.h (ctf_next): New. (ctf_get_dict): New prototype. * ctf-lookup.c (ctf_get_dict): New, split out of... (ctf_lookup_by_id): ... here. * ctf-util.c (ctf_next_create): New. (ctf_next_destroy): New. (ctf_next_copy): New. * ctf-types.c (includes): Add <assert.h>. (ctf_member_next): New. (ctf_enum_next): New. (ctf_type_iter): Document the lack of iteration over parent types. (ctf_type_next): New. (ctf_variable_next): New. * ctf-archive.c (ctf_archive_next): New. * libctf.ver: Add new public functions.
2020-07-22libctf: add ctf_refNick Alcock5-0/+22
This allows you to bump the refcount on a ctf_file_t, so that you can smuggle it out of iterators which open and close the ctf_file_t for you around the loop body (like ctf_archive_iter). You still can't use this to preserve a ctf_file_t for longer than the lifetime of its containing entity (e.g. ctf_archive). include/ * ctf-api.h (ctf_ref): New. libctf/ * libctf.ver (ctf_ref): New. * ctf-open.c (ctf_ref): Implement it.
2020-07-22libctf: add ctf_forwardable_kindNick Alcock3-1/+12
The internals of the deduplicator want to know if something is a type that can have a forward to it fairly often, often enough that inlining it brings a noticeable performance gain. Convert the one place in libctf that can already benefit, even though it doesn't bring any sort of performance gain there. libctf/ * ctf-inlines.h (ctf_forwardable_kind): New. * ctf-create.c (ctf_add_forward): Use it.
2020-07-22libctf: move existing inlines into ctf-inlines.hNick Alcock3-8/+14
Just housekeeping. libctf/ * ctf-impl.h (ctf_get_ctt_size): Move definition from here... * ctf-inlines.h (ctf_get_ctt_size): ... to here.
2020-07-22libctf, hash: introduce the ctf_dynsetNick Alcock4-11/+203
There are many places in the deduplicator which use hashtables as tiny sets: keys with no value (and usually, but not always, no freeing function) often with only one or a few members. For each of these, even after the last change to not store the freeing functions, we are storing a little malloced block for each item just to track the key/value pair, and a little malloced block for the hash table itself just to track the freeing function because we can't use libiberty hashtab's freeing function because we are using that to free the little malloced per-item block. If we only have a key, we don't need any of that: we can ditch the per-malloced block because we don't have a value, and we can ditch the per-hashtab structure because we don't need to independently track the freeing functions since libiberty hashtab is doing it for us. That means we don't need an owner field in the (now nonexistent) item block either. Roughly speaking, this datatype saves about 25% in time and 20% in peak memory usage for normal links, even fairly big ones. So this might seem redundant, but it's really worth it. Instead of a _lookup function, a dynset has two distinct functions: ctf_dynset_exists, which returns true or false and an optional pointer to the set member, and ctf_dynhash_lookup_any, which is used if all members of the set are expected to be equivalent and we just want *any* member and we don't care which one. There is no iterator in this set of functions, not because we don't iterate over dynset members -- we do, a lot -- but because the iterator here is a member of an entirely new family of much more convenient iteration functions, introduced in the next commit. libctf/ * ctf-hash.c (ctf_dynset_eq_string): New. (ctf_dynset_create): New. (DYNSET_EMPTY_ENTRY_REPLACEMENT): New. (DYNSET_DELETED_ENTRY_REPLACEMENT): New. (key_to_internal): New. (internal_to_key): New. (ctf_dynset_insert): New. (ctf_dynset_remove): New. (ctf_dynset_destroy): New. (ctf_dynset_lookup): New. (ctf_dynset_exists): New. (ctf_dynset_lookup_any): New. (ctf_hash_insert_type): Coding style. (ctf_hash_define_type): Likewise. * ctf-impl.h (ctf_dynset_t): New. (ctf_dynset_eq_string): New. (ctf_dynset_create): New. (ctf_dynset_insert): New. (ctf_dynset_remove): New. (ctf_dynset_destroy): New. (ctf_dynset_lookup): New. (ctf_dynset_exists): New. (ctf_dynset_lookup_any): New. * ctf-inlines.h (ctf_dynset_cinsert): New.
2020-07-22libctf, hash: save per-item space when no key/item freeing functionNick Alcock2-21/+62
The libctf dynhash hashtab abstraction supports per-hashtab arbitrary key/item freeing functions -- but it also has a constant slot type that holds both key and value requested by the user, so it needs to use its own freeing function to free that -- and it has nowhere to store the freeing functions the caller requested. So it copies them into every hash item, bloating every slot, even though all items in a given hash table must have the same key and value freeing functions. So point back to the owner using a back-pointer, but don't even spend space in the item or the hashtab allocating those freeing functions unless necessary: if none are needed, we can simply arrange to not pass in ctf_dynhash_item_free as a del_f to hashtab_create_alloc, and none of those fields will ever be accessed. The only downside is that this makes the code sensitive to the order of fields in the ctf_helem_t and ctf_hashtab_t: but the deduplicator allocates so many hash tables that doing this alone cuts memory usage during deduplication by about 10%. (libiberty hashtab itself has a lot of per-hashtab bloat: in the future we might trim that down, or make a trimmer version.) libctf/ * ctf-hash.c (ctf_helem_t) <key_free>: Remove. <value_free>: Likewise. <owner>: New. (ctf_dynhash_item_free): Indirect through the owner. (ctf_dynhash_create): Only pass in ctf_dynhash_item_free and allocate space for the key_free and value_free fields fields if necessary. (ctf_hashtab_insert): Likewise. Fix OOM errno value. (ctf_dynhash_insert): Only access ctf_hashtab's key_free and value_free if they will exist. Set the slot's owner, but only if it exists. (ctf_dynhash_remove): Adjust.
2020-07-22libctf, hash: improve insertion of existing keys into dynhashesNick Alcock2-2/+7
Right now, if you insert a key/value pair into a dynhash, the old slot's key is freed and the new one always assigned. This seemed sane to me when I wrote it, but I got it wrong time and time again. It's much less confusing to free the key passed in: if a key-freeing function was passed, you are asserting that the dynhash owns the key in any case, so if you pass in a key it is always buggy to assume it sticks around. Freeing the old key means that you can't even safely look up a key from out of a dynhash and hold on to it, because some other matching key might force it to be freed at any time. In the new model, you can always get a key out of a dynhash with ctf_dynhash_lookup_kv and hang on to it until the kv-pair is actually deleted from the dynhash. In the old model the pointer to the key might be freed at any time if a matching key was inserted. libctf/ * ctf-hash.c (ctf_hashtab_insert): Free the key passed in if there is a key-freeing function and the key already exists.
2020-07-22libctf: add new dynhash functionsNick Alcock4-0/+122
Future commits will use these. ctf_dynhash_elements: count elements in a dynhash ctf_dynhash_lookup_kv: look up and return pointers to the original key and value in a dynhash (the only way of getting a reference to the original key) ctf_dynhash_iter_find: iterate until an item is found, then return its key ctf_dynhash_cinsert: insert a const key / value into a dynhash (a thim wrapper in a new header dedicated to inline functions). As with the rest of ctf_dynhash, this is not public API. No impact on existing callers is expected. libctf/ * ctf-inlines.h: New file. * ctf-impl.h: Include it. (ctf_hash_iter_find_f): New typedef. (ctf_dynhash_elements): New. (ctf_dynhash_lookup_kv): New. (ctf_dynhash_iter_find): New. * ctf-hash.c (ctf_dynhash_lookup_kv): New. (ctf_traverse_find_cb_arg_t): New. (ctf_hashtab_traverse_find): New. (ctf_dynhash_iter_find): New. (ctf_dynhash_elements): New.
2020-07-22libctf: fix __extension__ with non-GNU C compilersNick Alcock2-0/+5
We forgot to #define __extension__ to nothing in this case. libctf/ * ctf-impl.h [!__GNUC__] (__extension__): Define to nothing.
2020-07-22libctf: add ctf_archive_countNick Alcock5-0/+21
Another count that was otherwise unavailable without doing expensive operations. include/ * ctf-api.h (ctf_archive_count): New. libctf/ * ctf-archive.c (ctf_archive_count): New. * libctf.ver: New public function.
2020-07-22libctf: add ctf_member_countNick Alcock5-0/+35
This returns the number of members in a struct or union, or the number of enumerations in an enum. (This was only available before now by iterating across every member, but it can be returned much faster than that.) include/ * ctf-api.h (ctf_member_count): New. libctf/ * ctf-types.c (ctf_member_count): New. * libctf.ver: New public function.
2020-07-22libctf: add ctf_type_kind_forwardedNick Alcock5-0/+30
This is just like ctf_type_kind, except that forwards get the type of the thing being pointed to rather than CTF_K_FORWARD. include/ * ctf-api.h (ctf_type_kind_forwarded): New. libctf/ * ctf-types.c (ctf_type_kind_forwarded): New.
2020-07-22libctf: add ctf_type_name_rawNick Alcock5-6/+28
We already have a function ctf_type_aname_raw, which returns the raw name of a type with no decoration for structures or arrays or anything like that: just the underlying name of whatever it is that's being ultimately pointed at. But this can be inconvenient to use, becauswe it always allocates new storage for the string and copies it in, so it can potentially fail. Add ctf_type_name_raw, which just returns the string directly out of libctf's guts: it will live until the ctf_file_t is closed (if we later gain the ability to remove types from writable dicts, it will live as long as the type lives). Reimplement ctf_type_aname_raw in terms of it. include/ * ctf-api.c (ctf_type_name_raw): New. libctf/ * ctf-types.c (ctf_type_name_raw): New. (ctf_type_aname_raw): Reimplement accordingly.
2020-07-22libctf: having debugging enabled is unlikelyNick Alcock2-1/+5
The deduplicator can emit enormous amounts of debugging output, so much so that a later commit will introduce a new configure flag that configures most of it out (and configures it out by default). It became clear that when this configure flag is on, but debugging is not enabled via the LIBCTF_DEBUG environment variable, up to 10% of runtime can be spent on branch mispredictions checking the _libctf_debug variable. Mark it unlikely to be set (when it is set, performance is likely to be the least of your concerns). libctf/ * ctf-subr.c (ctf_dprintf): _libctf_debug is unlikely to be set.
2020-07-22libctf, archive: stop ctf_arc_bufopen triggering crazy unmapsNick Alcock4-12/+40
The archive machinery mmap()s its archives when possible: so it arranges to do appropriately-sized unmaps by recording the unmap length in the ctfa_magic value and unmapping that. This brilliant (horrible) trick works less well when ctf_arc_bufopen is called with an existing buffer (which might be a readonly mapping). ctf_arc_bufopen always returns a ctf_archive_t wrapper, so record in there the necessity to not unmap anything when a bufopen'ed archive is closed again. libctf/ * ctf-impl.h (struct ctf_archive_internal) <ctfi_unmap_on_close>: New. (ctf_new_archive_internal): Adjust. * ctf-archive.c (ctf_new_archive_internal): Likewise. Initialize ctfi_unmap_on_close. Adjust error path. (ctf_arc_bufopen): Adjust ctf_new_archive_internal call (unmap_on_close is 0). (ctf_arc_close): Only unmap if ctfi_unmap_on_close. * ctf-open-bfd.c (ctf_fdopen): Adjust.
2020-07-22libctf, types: ints, floats and typedefs with no name are invalidNick Alcock2-1/+15
Report them as such, rather than letting ctf_decl_sprintf wrongly conclude that the printing of zero characters means we are out of memory. libctf/ * ctf-types.c (ctf_type_aname): Return ECTF_CORRUPT if ints, floats or typedefs have no name. Fix comment typo.
2020-07-22libctf, types: support slices of anything terminating in an intNick Alcock3-3/+22
It is perfectly valid C to say e.g. typedef u64 int; struct foo_t { const volatile u64 wibble:2; }; i.e. bitfields have to be integral types, but they can be cv-qualified integral types or typedefs of same, etc. This is easy to fix: do a ctf_type_resolve_unsliced() at creation time to ensure the ultimate type is integral, and ctf_type_resolve() at lookup time so that if you somehow have e.g. a slice of a typedef of a slice of a cv-qualified int, we pull the encoding that the topmost slice is based on out of the subsidiary slice (and then modify it), not out of the underlying int. (This last bit is rather academic right now, since all slices override exactly the same properties of the underlying type, but it's still the right thing to do.) libctf/ * ctf-create.c (ctf_add_slice): Support slices of any kind that resolves to an integral type. * ctf-types.c (ctf_type_encoding): Resolve the type before fishing its encoding out.
2020-07-22libctf, create: empty dicts are dirty to start withNick Alcock2-0/+5
Without this, an empty dict that is written out immediately never gets any content at all: even the header is left empty. libctf/ * ctf-create.c (ctf_create): Mark dirty.
2020-07-22libctf, create: fix addition of anonymous struct/union membersNick Alcock2-0/+9
A Solaris-era bug causes us to check the offsets of types with no names against the first such type when ctf_add_type()ing members to a struct or union. Members with no names (i.e. anonymous struct/union members) can appear as many times as you like in a struct/union, so this check should be skipped in this case. libctf/ * ctf-create.c (membcmp) Skip nameless members.
2020-07-22libctf, create: member names of "" and NULL should be the sameNick Alcock2-0/+8
This matters for the case of unnamed bitfields, whose names are the null string. These are special in that they are the only members whose "names" are allowed to be duplicated in a single struct, but we were only handling this for the case where name == NULL. Translate "" to NULL to help callers. libctf/ * ctf-create.c (ctf_add_member_offset): Support names of "" as if they were the null pointer.
2020-07-22libctf, open: drop unnecessary historical wart around forwardsNick Alcock2-9/+8
When opening, we consider a forward with a kind above the maximum allowable set of kinds and a forward of kind CTF_K_UNKNOWN to be a forward to a struct. Whatever CTF version it was that produced forwards with no associated kind, it predates anything we can read: remove this wart. libctf/ * ctf-open.c (init_types): Remove typeless CTF_K_FORWARD special-casing.
2020-07-22libctf, types: allow ctf_type_reference of dynamic slicesNick Alcock2-3/+16
One spot was missed when we rejigged ctf_update into ctf_serialize and allowed all operations on dynamic containers: ctf_type_reference of slices. A dynamic slice's vlen state is stored in the dtu_slice member, so fetch it from there. libctf/ * ctf-types.c (ctf_type_reference): Add support for dynamic slices.
2020-07-22libctf, create: add explicit casts for variables' and slices' typesNick Alcock2-2/+7
This is technically unnecessary -- the compiler is quite capable of doing the range reduction for us -- but it does mean that all assignments of a ctf_id_t to its final uint32_t representation now have appropriate explicit casts. libctf/ * ctf-create.c (ctf_serialize): Add cast. (ctf_add_slice): Likewise.
2020-07-22libctf, create: do not corrupt function types' arglists at insertion timeNick Alcock4-14/+27
ctf_add_function assumes that function types' arglists are of type ctf_id_t. Since they are CTF IDs, they are 32 bits wide, a uint32_t: unfortunately ctf_id_t is a forward-compatible user-facing 64 bits wide, and should never ever reach the CTF storage level. All the CTF code other than ctf_add_function correctly assumes that function arglists outside dynamic containers are 32 bits wide, so the serialization machinery ends up cutting off half the arglist, corrupting all args but the first (a good sign is a bunch of args of ID 0, the unimplemented type, popping up). Fix this by copying the arglist into place item by item, casting it properly, at the same time as we validate the arg types. Fix the type of the dtu_argv in the dynamic container and drop the now-unnecessary cast in the serializer. libctf/ * ctf-impl.h (ctf_dtdef_t) <dtu_argv>: Fix type. * ctf-create.c (ctf_add_function): Check for unimplemented type and populate at the same time. Populate one-by-one, not via memcpy. (ctf_serialize): Remove unnecessary cast. * ctf-types.c (ctf_func_type_info): Likewise. (ctf_func_type_args): Likewise. Fix comment typo.
2020-07-22libctf, create: support addition of references to the unimplemented typeNick Alcock2-8/+44
The deduplicating linker adds types from the linker inputs to the output via the same API everyone else does, so it's important that we can emit everything that the compiler wants us to. Unfortunately, the compiler may represent the unimplemented type (used for compiler constructs that CTF cannot currently encode) as type zero or as a type of kind CTF_K_UNKNOWN, and we don't allow the addition of types that cite the former. Adding this support adds a tiny bit of extra complexity: additions of structure members immediately following a member of the unimplemented type must be via ctf_add_member_offset or ctf_add_member_encoded, since we have no idea how big members of the unimplemented type are. (Attempts to do otherwise return -ECTF_NONREPRESENTABLE, like other attempts to do forbidden things with the unimplemented type.) Even slices of the unimplemented type are permitted: this is the only case in which you can slice a type that terminates in a non-integral type, on the grounds that it was likely integral in the source code, it's just that we can't represent that sort of integral type properly yet. libctf/ * ctf-create.c (ctf_add_reftype): Support refs to type zero. (ctf_add_array): Support array contents of type zero. (ctf_add_function): Support arguments and return types of type zero. (ctf_add_typedef): Support typedefs to type zero. (ctf_add_member_offset): Support members of type zero, unless added at unspecified (naturally-aligned) offset.
2020-07-22libctf: restructure error handling to reduce relocationsNick Alcock8-114/+159
Jose Marchesi noted that the traditional-Unix error array in ctf-error.c introduces one reloc per error to initialize the array: 58 so far. We can reduce this to zero using an array of carefully-sized individual members which is used to construct a string table, that is then referenced by the lookup functions: but doing this automatically is a pain. Bruno Haible wrote suitable code years ago: I got permission to reuse it (Bruno says "... which I hereby put in the public domain"); I modified it a tiny bit (similarly to what Ulrich Drepper did in the dsohowto text, but I redid it from scratch), commented it up a bit, and shifted the error table into that form, migrating it into the new file ctf-error.h. This has the advantage that it spotted both typos in the text of the errors in the comments in ctf-api.h and typos in the error defines in the comments in ctf-error.c, and places where the two were simply not in sync. All are now fixed. One new constant exists in ctf-api.h: CTF_NERR, since the old method of working out the number of errors in ctf-error.c was no longer usable, and it seems that the number of CTF errors is something users might reasonably want as well. It should be pretty easy to keep up to date as new errors are introduced. include/ * ctf-api.h (ECTF_*): Improve comments. (ECTF_NERR): New. libctf/ * ctf-error.c: Include <stddef.h>, for offsetof. (_ctf_errlist): Migrate to... (_ctf_errlist_t): ... this. (_ctf_erridx): New, indexes into _ctf_errlist_t. (_ctf_nerr): Remove. (ctf_errmsg): Adjust accordingly. * Makefile.am (BUILT_SOURCES): Note... (ctf-error.h): ... this new rule. * Makefile.in: Regenerate. * mkerrors.sed: New, process ctf-api.h to generate ctf-error.h. * .gitignore: New, ignore ctf-error.h.
2020-07-22include, libctf: typo fixesNick Alcock4-4/+12
include/ * ctf-api.h: Fix typos in comments. libctf/ * ctf-impl.h: Fix typos in comments.
2020-07-22Correct an error in the remote protocol specificationReuben Thomas2-4/+13
The list of commands that a stub must implement was wrong. gdb/ChangeLog: 2020-07-22 Reuben Thomas <rrt@sc3d.org> * gdb.texinfo (Remote Protocol, Overview): Correct the description of which remote protocol commands are mandatory for a stub to implement.
2020-07-22gdb/python: Use reference not pointer in py-registers.cAndrew Burgess2-9/+16
Pedro's review comments arrived after I'd already committed this change: commit f7306dac19c502232f766c3881313857915f330d Date: Tue Jul 7 15:00:30 2020 +0100 gdb/python: Reuse gdb.RegisterDescriptor objects where possible See: https://sourceware.org/pipermail/gdb-patches/2020-July/170726.html There should be no user visible changes after this commit. gdb/ChangeLog: * python/py-registers.c (gdbpy_register_object_data_init): Remove redundant local variable. (gdbpy_get_register_descriptor): Extract descriptor vector as a reference, not pointer, update code accordingly.
2020-07-22Fix problems in CTF handling code exposed by the Coverity static analysis tool.Nick Clifton4-14/+22
readelf * readelf.c (parse_args): Silence potential warnings about a memory resource leak when allocating space for ctf option values. (dump_section_as_ctf): Fix typo checking dump_ctf_strtab_name variable. libctf * ctf-archive.c (ctf_arc_write): Avoid calling close twice on the same file descriptor.
2020-07-22gdb/jit: skip jit symbol lookup if already detected the symbols don't existSimon Marchi3-2/+26
To detect whether an objfile is a JITer, we lookup JIT interface symbols in the objfile. If an objfile does not have these symbols, we conclude that it is not a JITer. An objfile that does not have the symbols will never have them. Therefore, once we do a lookup and find out that the objfile does not have JIT symbols, just set a flag so that we can skip symbol lookup for that objfile the next time we reset JIT breakpoints. gdb/ChangeLog: 2020-07-22 Simon Marchi <simon.marchi@polymtl.ca> Tankut Baris Aktemur <tankut.baris.aktemur@intel.com> * objfiles.h (struct objfile) <skip_jit_symbol_lookup>: New field. * jit.c (jit_breakpoint_re_set_internal): Use the `skip_jit_symbol_lookup` field.
2020-07-22gdb/jit: apply minor cleanup and modernizationSimon Marchi2-26/+40
gdb/ChangeLog: 2020-07-22 Simon Marchi <simon.marchi@polymtl.ca> Tankut Baris Aktemur <tankut.baris.aktemur@intel.com> * jit.c (jit_read_descriptor): Define the descriptor address once, use twice. (jit_breakpoint_deleted): Move the declaration of the loop variable `iter` into the loop header. (jit_breakpoint_re_set_internal): Move the declaration of the local variable `objf_data` to the first point of definition. (jit_event_handler): Move the declaration of local variables `code_entry`, `entry_addr`, and `objf` to their first point of use. Rename `objf` to `jited`.
2020-07-22gdb/jit: remove jiter_objfile_data -> objfile back-linkSimon Marchi3-8/+7
This is no longer needed, remove it. gdb/ChangeLog: 2020-07-22 Simon Marchi <simon.marchi@polymtl.ca> * jit.h (struct jiter_objfile_data) <jiter_objfile_data, objfile>: Remove. * jit.c (get_jiter_objfile_data): Update.
2020-07-22gdb/jit: enable tracking multiple JITer objfilesTankut Baris Aktemur4-109/+126
GDB's JIT handler stores an objfile (and data associated with it) per program space to keep track of JIT breakpoint information. This assumes that there is at most one JITer objfile in the program space. However, there may be multiple. If so, only the first JITer's hook breakpoints would be realized and the JIT events from the other JITers would be missed. This patch removes that assumption, allowing an arbitrary number of objfiles within a program space to be JITers. - The "unique" program_space -> JITer objfile pointer in jit_program_space_data is removed. In fact, jit_program_space_data becomes empty, so it is removed entirely. - jit_breakpoint_deleted is modified, it now has to assume that any objfile in a program space is a potential JITer. It now iterates on all objfiles, checking if they are indeed JITers, and if they are, whether the deleted breakpoint belongs to them. - jit_breakpoint_re_set_internal also has to assume that any objfile in a program space is a potential JITer. It creates (or updates) one jiter_objfile_data structure for each JITer it finds. - Same for jit_inferior_init. It now iterates all objfiles to read the initial JIT object list. gdb/ChangeLog: 2020-07-22 Tankut Baris Aktemur <tankut.baris.aktemur@intel.com> Simon Marchi <simon.marchi@polymtl.ca> * jit.c (struct jit_program_space_data): Remove. (jit_program_space_key): Remove. (jiter_objfile_data::~jiter_objfile_data): Remove program space stuff. (get_jit_program_space_data): Remove. (jit_breakpoint_deleted): Iterate on all of the program space's objfiles. (jit_inferior_init): Likewise. (jit_breakpoint_re_set_internal): Likewise. Also change return type to void. (jit_breakpoint_re_set): Pass current_program_space to jit_breakpoint_re_set_internal. gdb/testsuite/ChangeLog: 2020-07-22 Tankut Baris Aktemur <tankut.baris.aktemur@intel.com> * gdb.base/jit-reader-simple.exp: Add a scenario for a binary that loads two JITers.
2020-07-22gdb/jit: move cached_code_address and jit_breakpoint to jiter_objfile_dataSimon Marchi3-24/+34
This is in preparation for allowing more than one JITer objfile per program space. Once we do that, each JITer objfile will have its own JIT breakpoint (on the __jit_debug_register_code function it provides). The cached_code_address field is just the runtime / relocated address of that symbol. Since they are going to become JITer-objfile-specific and not program-space-specific, move these fields from jit_program_space_data to jiter_objfile_data. gdb/ChangeLog: 2020-07-22 Simon Marchi <simon.marchi@polymtl.ca> * jit.h (struct jiter_objfile_data) <cached_code_address, jit_breakpoint>: Move to here from ... * jit.c (jit_program_space_data): ... here. (jiter_objfile_data::~jiter_objfile_data): Update. (jit_breakpoint_deleted): Update. (jit_breakpoint_re_set_internal): Update.
2020-07-22gdb/jit: apply some simplifications and assertionsSimon Marchi2-17/+23
Following patch "gdb/jit: split jit_objfile_data in two", there are some simplifications we can make. The invariants described there mean that we can assume / assert some things instead of checking them using conditionals. If an instance of jiter_objfile_data exists for a given objfile, it's because the required JIT interface symbols were found. Therefore, in ~jiter_objfile_data, the `register_code` field can't be NULL. It was previously used to differentiate a jit_objfile_data object used for a JITer vs a JITed. We can remove that check. If an instance of jiter_objfile_data exists for a given objfile, it's because it's the sole JITer objfile in the scope of its program space (jit_program_space_data::objfile points to it). At the moment, jit_breakpoint_re_set_internal won't create a second instance of jiter_objfile_data for a given program space. Therefore, it's not necessary to check for `ps_data != NULL` in ~jiter_objfile_data: we know a jit_program_space_data for that program space exists. We also don't need to check for `ps_data->objfile == this->objfile`, because we know the objfile is the sole JITer in this program space. Replace these two conditions with assertions. A pre-condition for calling the jit_read_descriptor function (which is respected in the two call sites) is that the objfile `jiter` _is_ a JITer - it already has a jiter_objfile_data attached to it. When a jiter_objfile_data exists, its `descriptor` field is necessarily set: had the descriptor symbol not been found, jit_breakpoint_re_set_internal would not have created the jiter_objfile_data. Remove the check and early return in jit_read_descriptor. Access objfile's `jiter_data` field directly instead of calling `get_jiter_objfile_data` (which creates the jiter_objfile_data if it doesn't exist yet) and assert that the result is not nullptr. Finally, `jit_event_handler` is always passed a JITer objfile. So, add an assertion to ensure that. gdb/ChangeLog: 2020-07-22 Simon Marchi <simon.marchi@polymtl.ca> * jit.c (jiter_objfile_data::~jiter_objfile_data): Remove some checks. (jit_read_descriptor): Remove NULL check. (jit_event_handler): Add an assertion.
2020-07-22gdb/jit: split jit_objfile_data in twoSimon Marchi4-31/+57
The jit_objfile_data is currently used to hold information about both objfiles that are the result of JIT compilation (JITed) and objfiles that can produce JITed objfiles (JITers). I think that this double use of the type is confusing, and that things would be more obvious if we had one type for each role. This patch splits it into: - jited_objfile_data: for data about an objfile that is the result of a JIT compilation - jiter_objfile_data: for data about an objfile which produces JITed objfiles There are now two JIT-related fields in an objfile, one for each kind. With this change, the following invariants hold: - an objfile has a non-null `jiter_data` field iff it defines the required symbols of the JIT interface - an objfile has a non-null `jited_data` field iff it is the product of JIT compilation (has been produced by some JITer) gdb/ChangeLog: 2020-07-22 Simon Marchi <simon.marchi@polymtl.ca> * jit.h (struct jit_objfile_data): Split into... (struct jiter_objfile_data): ... this ... (struct jited_objfile_data): ... and this. * objfiles.h (struct objfile) <jit_data>: Remove. <jiter_data, jited_data>: New fields. * jit.c (jit_objfile_data::~jit_objfile_data): Rename to ... (jiter_objfile_data::~jiter_objfile_data): ... this. (get_jit_objfile_data): Rename to ... (get_jiter_objfile_data): ... this. (add_objfile_entry): Update. (jit_read_descriptor): Use get_jiter_objfile_data. (jit_find_objf_with_entry_addr): Use objfile's jited_data field. (jit_breakpoint_re_set_internal): Use get_jiter_objfile_data. (jit_inferior_exit_hook): Use objfile's jited_data field.
2020-07-22gdb/jit: link to jit_objfile_data directly from the objfile structSimon Marchi4-61/+72
Remove the use of objfile_data to associate a jit_objfile_data with an objfile. Instead, directly link to a jit_objfile_data from an objfile struct. The goal is to eliminate unnecessary abstraction. The free_objfile_data function naturally becomes the destructor of jit_objfile_data. However, free_objfile_data accesses the objfile to which the data is attached, which the destructor of jit_objfile_data doesn't have access to. To work around this, add a backlink to the owning objfile in jit_objfile_data. This is however temporary, it goes away in a subsequent patch. gdb/ChangeLog: 2020-07-22 Simon Marchi <simon.marchi@polymtl.ca> * jit.h: Forward-declare `struct minimal_symbol`. (struct jit_objfile_data): Migrate to here from jit.c; also add a constructor, destructor, and an objfile* field. * jit.c (jit_objfile_data): Remove. (struct jit_objfile_data): Migrate from here to jit.h. (jit_objfile_data::~jit_objfile_data): New destructor implementation with code moved from free_objfile_data. (free_objfile_data): Delete. (get_jit_objfile_data): Update to use the jit_data field of objfile. (jit_find_objf_with_entry_addr): Ditto. (jit_inferior_exit_hook): Ditto. (_initialize_jit): Remove the call to register_objfile_data_with_cleanup. * objfiles.h (struct objfile) <jit_data>: New field.
2020-07-22gdb/jit: pass the jiter objfile as an argument to jit_event_handlerTankut Baris Aktemur4-15/+34
This is a refactoring that adds a new parameter to the `jit_event_handler` function: the JITer objfile. The goal is to distinguish which JITer triggered the JIT event, in case there are multiple JITers -- a capability that is added in a subsequent patch. gdb/ChangeLog: 2020-07-22 Tankut Baris Aktemur <tankut.baris.aktemur@intel.com> * jit.h: Forward-declare `struct objfile`. (jit_event_handler): Add a second parameter, the JITer objfile. * jit.c (jit_read_descriptor): Change the signature to take the JITer objfile as an argument instead of the jit_program_space_data. (jit_inferior_init): Update the call to jit_read_descriptor. (jit_event_handler): Use the new JITer objfile argument when calling jit_read_descriptor. * breakpoint.c (handle_jit_event): Update the call to jit_event_handler to pass the JITer objfile.
2020-07-22MIPS/GAS/testsuite: Fix JALR relocation tests for IRIX targetsMaciej W. Rozycki26-12/+1857
With IRIX targets the JALR hint relocation is not produced for the o32 ABI, where it is considered a GNU extension. Consequently several tests fail as the output produced by GAS fails to match patterns expecting the relocation to be present where appropriate, even though output produced is indeed correct. As the absence of the relocation is expected, fix the tests by providing respective alternative dump patterns with any JALR relocations removed, removing numerous failures with `*-*-irix*' targets: FAIL: MIPS jal-svr4pic (interaptiv-mr2) FAIL: MIPS jal-svr4pic (micromips) FAIL: MIPS jal-svr4pic (mips1) FAIL: MIPS jal-svr4pic (mips2) FAIL: MIPS jal-svr4pic (mips3) FAIL: MIPS jal-svr4pic (mips4) FAIL: MIPS jal-svr4pic (mips5) FAIL: MIPS jal-svr4pic (mips32) FAIL: MIPS jal-svr4pic (mips32r2) FAIL: MIPS jal-svr4pic (mips32r3) FAIL: MIPS jal-svr4pic (mips32r5) FAIL: MIPS jal-svr4pic (mips32r6) FAIL: MIPS jal-svr4pic (mips64) FAIL: MIPS jal-svr4pic (mips64r2) FAIL: MIPS jal-svr4pic (mips64r3) FAIL: MIPS jal-svr4pic (mips64r5) FAIL: MIPS jal-svr4pic (mips64r6) FAIL: MIPS jal-svr4pic (octeon) FAIL: MIPS jal-svr4pic (octeon2) FAIL: MIPS jal-svr4pic (octeon3) FAIL: MIPS jal-svr4pic (octeonp) FAIL: MIPS jal-svr4pic (r3000) FAIL: MIPS jal-svr4pic (r3900) FAIL: MIPS jal-svr4pic (r4000) FAIL: MIPS jal-svr4pic (r5900) FAIL: MIPS jal-svr4pic (sb1) FAIL: MIPS jal-svr4pic (vr5400) FAIL: MIPS jal-svr4pic (xlr) FAIL: MIPS jal-svr4pic noreorder (interaptiv-mr2) FAIL: MIPS jal-svr4pic noreorder (micromips) FAIL: MIPS jal-svr4pic noreorder (mips1) FAIL: MIPS jal-svr4pic noreorder (mips2) FAIL: MIPS jal-svr4pic noreorder (mips3) FAIL: MIPS jal-svr4pic noreorder (mips4) FAIL: MIPS jal-svr4pic noreorder (mips5) FAIL: MIPS jal-svr4pic noreorder (mips32) FAIL: MIPS jal-svr4pic noreorder (mips32r2) FAIL: MIPS jal-svr4pic noreorder (mips32r3) FAIL: MIPS jal-svr4pic noreorder (mips32r5) FAIL: MIPS jal-svr4pic noreorder (mips32r6) FAIL: MIPS jal-svr4pic noreorder (mips64) FAIL: MIPS jal-svr4pic noreorder (mips64r2) FAIL: MIPS jal-svr4pic noreorder (mips64r3) FAIL: MIPS jal-svr4pic noreorder (mips64r5) FAIL: MIPS jal-svr4pic noreorder (mips64r6) FAIL: MIPS jal-svr4pic noreorder (octeon) FAIL: MIPS jal-svr4pic noreorder (octeon2) FAIL: MIPS jal-svr4pic noreorder (octeon3) FAIL: MIPS jal-svr4pic noreorder (octeonp) FAIL: MIPS jal-svr4pic noreorder (r3000) FAIL: MIPS jal-svr4pic noreorder (r3900) FAIL: MIPS jal-svr4pic noreorder (r4000) FAIL: MIPS jal-svr4pic noreorder (r5900) FAIL: MIPS jal-svr4pic noreorder (sb1) FAIL: MIPS jal-svr4pic noreorder (vr5400) FAIL: MIPS jal-svr4pic noreorder (xlr) FAIL: MIPS R3000 jal-xgot FAIL: MIPS -mabi=32 test 2 (SVR4 PIC) FAIL: gas/mips/jalr2 FAIL: Relax microMIPS branches (pic) FAIL: Relax microMIPS branches (insn32 mode, pic) Strictly speaking no MIPSr6 or microMIPS target is supported by IRIX, but GAS supports such configurations on the basis of uniformity, so provide the relevant patterns too rather than excluding the combinations from testing. gas/ * testsuite/gas/mips/jal-svr4pic-irix.d: New file. * testsuite/gas/mips/mips1@jal-svr4pic-irix.d: New file. * testsuite/gas/mips/mipsr6@jal-svr4pic-irix.d: New file. * testsuite/gas/mips/micromips@jal-svr4pic-irix.d: New file. * testsuite/gas/mips/r3000@jal-svr4pic-irix.d: New file. * testsuite/gas/mips/jal-svr4pic-local-irix.d: New file. * testsuite/gas/mips/mips1@jal-svr4pic-local-irix.d: New file. * testsuite/gas/mips/micromips@jal-svr4pic-local-irix.d: New file. * testsuite/gas/mips/r3000@jal-svr4pic-local-irix.d: New file. * testsuite/gas/mips/jal-svr4pic-noreorder-irix.d: New file. * testsuite/gas/mips/mips1@jal-svr4pic-noreorder-irix.d: New file. * testsuite/gas/mips/mipsr6@jal-svr4pic-noreorder-irix.d: New file. * testsuite/gas/mips/micromips@jal-svr4pic-noreorder-irix.d: New file. * testsuite/gas/mips/r3000@jal-svr4pic-noreorder-irix.d: New file. * testsuite/gas/mips/jal-xgot-irix.d: New file. * testsuite/gas/mips/jalr2-irix.d: New file. * testsuite/gas/mips/micromips-branch-relax-insn32-pic-irix.d: New file. * testsuite/gas/mips/micromips-branch-relax-pic-irix.d: New file. * testsuite/gas/mips/mips-abi32-pic2-irix.d: New file. * testsuite/gas/mips/jal-svr4pic-local.d: Don't exclude `*-*-irix*' targets. Add source file designator. * testsuite/gas/mips/mips1@jal-svr4pic-local.d: Don't exclude `*-*-irix*' targets. * testsuite/gas/mips/r3000@jal-svr4pic-local.d: Likewise. * testsuite/gas/mips/micromips@jal-svr4pic-local.d: Likewise. * testsuite/gas/mips/jalr2.d: Add name designator. * testsuite/gas/mips/mips.exp: Use respective IRIX variants for tests involving the JALR relocation throughout.
2020-07-22MIPS/GAS/testsuite: Use a helper variable for IRIX/non-IRIX test selectionMaciej W. Rozycki2-5/+7
Define a helper variable for IRIX/non-IRIX test selection and use it with the PR 14798 test case. gas/ * testsuite/gas/mips/mips.exp: Use a helper variable for IRIX/non-IRIX test selection.
2020-07-22gdbserver: handle running threads in qXfer:threads:readPedro Alves5-13/+68
On some systems, the gdb.multi/multi-target.exp testcase occasionally fails like so: Running src/gdb/testsuite/gdb.multi/multi-target.exp ... FAIL: gdb.multi/multi-target.exp: info-inferiors: multi_process=on: inferior 1: info connections FAIL: gdb.multi/multi-target.exp: info-inferiors: multi_process=on: inferior 1: info inferiors FAIL: gdb.multi/multi-target.exp: info-inferiors: multi_process=on: inferior 2: info connections FAIL: gdb.multi/multi-target.exp: info-inferiors: multi_process=on: inferior 2: info inferiors FAIL: gdb.multi/multi-target.exp: info-inferiors: multi_process=on: inferior 3: inferior 3 ... many more cascading fails. The problem starts when the testcase runs an inferior against GDBserver: (gdb) run Starting program: build/gdb/testsuite/outputs/gdb.multi/multi-target/multi-target Reading /lib64/ld-linux-x86-64.so.2 from remote target... warning: File transfers from remote targets can be slow. Use "set sysroot" to access files locally instead. Reading /lib64/ld-linux-x86-64.so.2 from remote target... Reading /lib64/ld-2.31.so from remote target... Reading /lib64/.debug/ld-2.31.so from remote target... Reading /usr/lib/debug//lib64/ld-2.31.so from remote target... Reading /usr/lib/debug/lib64//ld-2.31.so from remote target... Reading target:/usr/lib/debug/lib64//ld-2.31.so from remote target... Reading /lib/x86_64-linux-gnu/libpthread.so.0 from remote target... Reading /lib/x86_64-linux-gnu/libc.so.6 from remote target... Reading /lib/x86_64-linux-gnu/libc-2.31.so from remote target... Reading /lib/x86_64-linux-gnu/.debug/libc-2.31.so from remote target... Reading /usr/lib/debug//lib/x86_64-linux-gnu/libc-2.31.so from remote target... Reading /usr/lib/debug//lib/x86_64-linux-gnu/libc-2.31.so from remote target... Remote connection closed ... Note the "Remote connection closed" message. That means GDBserver exited abruptly. I traced it down to the fact that GDB fetches the thread list from GDBserver while the main thread of the process is still running. On my main system where I wrote the testcase, I have not observed the failure because it is slow enough that the thread stops before GDBserver fetches the thread list in the problem scenario which I'll describe below. With some --remote-debug logging from GDBserver side, we see the last packets before the connection closes: ... getpkt ("vCont;c"); [no ack sent] putpkt ("$OK#9a"); [noack mode] getpkt ("Tp10f9a.10f9a"); [no ack sent] putpkt ("$OK#9a"); [noack mode] getpkt ("Hgp0.0"); [no ack sent] putpkt ("$OK#9a"); [noack mode] getpkt ("qXfer:threads:read::0,1000"); [no ack sent] Note the vCont;c , which sets the program running, and then a qXfer:threads:read packet at the end. The problem happens when the thread list refresh (qXfer:threads:read) is sent just while the main thread is running and it still hasn't initialized its libpthread id internally. In that state, the main thread's lwp will remain with the thread_known flag clear. See in find_one_thread: /* If the new thread ID is zero, a final thread ID will be available later. Do not enable thread debugging yet. */ if (ti.ti_tid == 0) return 0; Now, back in server.cc, to handle the qXfer:threads:read, we reach handle_qxfer_threads -> handle_qxfer_threads_proper, and the latter then calls handle_qxfer_threads_worker for each known thread. In handle_qxfer_threads_worker, we call target_thread_handle. This ends up in thread_db_thread_handle, here: if (!lwp->thread_known && !find_one_thread (thread->id)) return false; Since the thread ID isn't known yet, we call find_one_thread. This calls into libthread_db.so, which accesses memory. Because the current thread is running, that fails and we throw an error, here: /* Get information about this thread. */ err = thread_db->td_ta_map_lwp2thr_p (thread_db->thread_agent, lwpid, &th); if (err != TD_OK) error ("Cannot get thread handle for LWP %d: %s", lwpid, thread_db_err_str (err)); The current design is that whenever GDB-facing packets/requests need to accesses memory, server.cc is supposed to prepare the target for the access. See gdb_read_memory / gdb_write_memory. This preparation means pausing threads if in non-stop mode (someday we could lift this requirement, but we will still need to pause to access registers or do other related ptrace accesses like PTRACE_GET_THREAD_AREA). Note that the multi-target.exp testcase forces "maint set target-non-stop on". So the fix here is to prepare the target to access memory when handling qXfer:threads:read too. gdbserver/ChangeLog: * inferiors.cc (switch_to_process): New, moved here from thread-db.cc, and made extern. * inferiors.h (switch_to_process): Declare. * server.cc: Include "gdbsupport/scoped_restore.h". (handle_qxfer_threads_proper): Now returns bool. Prepare to access memory around target calls. (handle_qxfer_threads): Handle errors. * thread-db.cc (switch_to_process): Moved to inferiors.cc.
2020-07-22ld: Properly override the IR definitionH.J. Lu13-6/+167
We change the previous definition in the IR object to undefweak only after all LTO symbols have been read. include/ PR ld/26262 PR ld/26267 * bfdlink.h (bfd_link_info): Add lto_all_symbols_read. ld/ PR ld/26262 PR ld/26267 * ldlang.c (lang_process): Set lto_all_symbols_read after all LTO IR symbols have been read. * plugin.c (plugin_notice): Override the IR definition only if all LTO IR symbols have been read or the new definition is non-weak and the the IR definition is weak * testsuite/ld-plugin/lto.exp: Run PR ld/26262 and ld/26267 tests. * testsuite/ld-plugin/pr26262a.c: New file. * testsuite/ld-plugin/pr26262b.c: Likewise. * testsuite/ld-plugin/pr26262c.c: Likewise. * testsuite/ld-plugin/pr26267.err: Likewise. * testsuite/ld-plugin/pr26267a.c: Likewise. * testsuite/ld-plugin/pr26267b.c: Likewise. * testsuite/ld-plugin/pr26267c.c: Likewise.
2020-07-22bfd: xtensa: pr26246: fix removed_literal_compareMax Filippov2-4/+11
2020-07-22 Max Filippov <jcmvbkbc@gmail.com> bfd/ PR 26246 * elf32-xtensa.c (removed_literal_compare): Use correct pointer type for the first function argument. Rename pointers to reflect that they have distinct types.
2020-07-21Retire the now-unused gdbarch handle_segmentation_fault hook.John Baldwin5-66/+9
* gdbarch.c: Regenerate. * gdbarch.h: Regenerate. * gdbarch.sh (handle_segmentation_fault): Remove method. * infrun.c (handle_segmentation_fault): Remove. (print_signal_received_reason): Remove call to handle_segmentation_fault.
2020-07-21Migrate the sparc64 ADI handle_segmentation_fault hook to report_signal_info.John Baldwin2-6/+14
gdb/ChangeLog: * sparc64-linux-tdep.c (sparc64_linux_handle_segmentation_fault): Rename to sparc64_linux_report_signal_info and add siggnal argument. (sparc64_linux_init_abi): Use sparc64_linux_report_signal_info instead of sparc64_linux_handle_segmentation_fault.
2020-07-21Migrate the x86 MPX handle_segmentation_fault hook to report_signal_info.John Baldwin4-10/+21
gdb/ChangeLog: * amd64-linux-tdep.c (amd64_linux_init_abi_common): Use i386_linux_report_signal_info instead of i386_linux_handle_segmentation_fault. * i386-linux-tdep.c (i386_linux_handle_segmentation_fault): Rename to i386_linux_report_signal_info and add siggnal argument. (i386_linux_init_abi): Use i386_linux_report_signal_info instead of i386_linux_handle_segmentation_fault. * i386-linux-tdep.h (i386_linux_handle_segmentation_fault): Rename to i386_linux_report_signal_info and add siggnal argument.
2020-07-21Report architecture-specific signal information for core files.John Baldwin2-1/+9
When opening a core file, if the process terminated due to a signal, invoke the gdbarch report_signal_info hook to report architecture-specific information about the signal. gdb/ChangeLog: * corelow.c (core_target_open): Invoke gdbarch report_signal_info hook if present.