dyninst.git
3 days agoDocumentation update for 10.2 Release (#788) master 10.2.0 v10.2.0
Tim Haines [Fri, 31 Jul 2020 23:15:54 +0000 (18:15 -0500)]
Documentation update for 10.2 Release (#788)

3 days agoRevert CUDA binaries openning to libdw (#787)
Sasha Nícolas [Fri, 31 Jul 2020 21:41:52 +0000 (16:41 -0500)]
Revert CUDA binaries openning to libdw (#787)

* Fix Variable location parsing

Start using elfutils' libdwfl to open binaries with dwarf data.
This fixes dwarf variable location parsing for relocatable objects.

* Open CUDA binaries using libdw dwarf_begin_elf.
Temporary fix to maintain compatibility with CUDA binaries.

3 days agoUpdates for #780 (#783)
Tim Haines [Fri, 31 Jul 2020 21:24:37 +0000 (16:24 -0500)]
Updates for #780 (#783)

* pcEventMuxer: Fix print specifier in debug logging
    This should have been fixed in 6bd68f38b
* Simplify PCEventMailbox::size
* Make PCEventMailbox::find threadsafe
* Whitespace update
* Add more logging for state handling

3 days agoImprove detection of ghost threads (#784)
Tim Haines [Fri, 31 Jul 2020 17:39:05 +0000 (12:39 -0500)]
Improve detection of ghost threads (#784)

Change plat_handle_ghost_thread to return 'bool' (see #742).

This indicates if the thread is actually a ghost or not. This can happen
because ptrace returned ESRCH (no such process) in
LinuxPtrace::ptrace_int, yet the process is alive. This is a valid state
for ptrace, but ptrace_int doesn't check for this. The ptrace man-page
indicates that this can happen when a process received a STOP signal,
but it hasn't transitioned to the new state yet.

6 days agoFix Variable location parsing (#781)
Sasha Nícolas [Tue, 28 Jul 2020 16:02:19 +0000 (11:02 -0500)]
Fix Variable location parsing (#781)

Start using elfutils' libdwfl to open binaries with dwarf data.
This fixes dwarf variable location parsing for relocatable objects.

9 days agoRemove Aggregate::setModule declaration (#779)
Tim Haines [Sat, 25 Jul 2020 02:09:31 +0000 (21:09 -0500)]
Remove Aggregate::setModule declaration (#779)

This was introduced in c848409ec, but never implemented.

10 days agoFix proccontrol hangs in test_thread_X (#780)
Tim Haines [Fri, 24 Jul 2020 21:31:34 +0000 (16:31 -0500)]
Fix proccontrol hangs in test_thread_X (#780)

* Use std::lock_guard throughout

PCEventMailbox::enqueue
* Check process state before enqueueing
* Add more proccontrol logging in PCEventMailbox
* Move broadcast to the end to reduce spurious wakeups
* Only add events for valid processes

PCEventMuxer::wait_internal
* Handle errors for Process::handleEvents
* Add logging for mailbox size check
* Add more loggin in non-blocking path
* Add logging for 'handle(NULL)' call
* Log successful event completion
* Remove unreachable code
* Remove unused parameter
* Use std::lock_guard

PCEventMailbox::dequeue
* add logging when returning empty event
* Add sanity check for process pointer
* add logging on sucessful event dequeue
* Ignore post-exit events on invalid processes

PCEventMailbox::find
* Use standard check for element values
    This prevents accidental insertion of non-existent keys.
* add logging
* add sanity check for passed process

PCEventMailbox
* Change procCount to map PIDs instead of PCProcess*
    This prevents null pointer issues as well as pointer-reuse in some
    abnormal situations.

10 days agoproccontrol: Handle "ghost" threads (#742)
Tim Haines [Fri, 24 Jul 2020 21:15:37 +0000 (16:15 -0500)]
proccontrol: Handle "ghost" threads (#742)

A "ghost" thread is one which has encountered an error when continuing
from a SIGSTOP. This can come about from the process being exited before
the SIGSTOP is handled.

See https://github.com/dyninst/dyninst/issues/741 for details.

* Set process when handling ghost threads
* Allow for already-destroyed threads in HandleThreadDestroy::handleEvent
    This can happen when handling ghost threads.
* Allow for already-destroyed threads in HandleThreadCleanup::handleEvent.
    This can happen when handling ghost threads.
* Allow already-destroyed threads in ThreadDBDestroyHandler::handleEvent
    This can happen when handling ghost threads.
* Handle destroyed thread in linux_process::plat_adjustSyncType
    This can happen when handling ghost threads.
* Do not create a destroy event for the thread executed from 'main'

3 weeks agoRemove examples (#764)
Tim Haines [Wed, 8 Jul 2020 00:30:22 +0000 (19:30 -0500)]
Remove examples (#764)

These are now in their own repository at https://github.com/dyninst/examples.

3 weeks agoElf extended numbering (#776)
Xiaozhu Meng [Tue, 7 Jul 2020 18:49:08 +0000 (11:49 -0700)]
Elf extended numbering (#776)

Handle extended numbering for total section number, total program header number,
and the section string table index.

1. Use libelf provided functions to handle extended numbering for ELF headers
2. Record .symtab_shndx when present to handle extended numbering for section number of a symbol

5 weeks agoImprove logging in PCEventHandler::handleThreadCreate (#772)
Tim Haines [Fri, 26 Jun 2020 01:50:11 +0000 (20:50 -0500)]
Improve logging in PCEventHandler::handleThreadCreate (#772)

6 weeks agoRetain hint function from CodeSource even if we do not parse the code object. (#768)
Xiaozhu Meng [Fri, 19 Jun 2020 03:18:09 +0000 (20:18 -0700)]
Retain hint function from CodeSource even if we do not parse the code object. (#768)

Such hint functions can be manually provided by the user and should be retained.

2 months agoremove unnecessary assertion for unknown phdr_type (#757)
bbiiggppiigg [Tue, 2 Jun 2020 14:57:43 +0000 (09:57 -0500)]
remove unnecessary assertion for unknown phdr_type (#757)

2 months agoExpand the list of non-returning functions in CodeSource.C. (#748)
Mark W. Krentel [Mon, 1 Jun 2020 23:43:21 +0000 (18:43 -0500)]
Expand the list of non-returning functions in CodeSource.C. (#748)

* Expand the list of non-returning functions in CodeSource.C.

This list comes from scanning the dwarf info in libc.so, etc for
the DW_AT_noreturn attribute, and from scanning header files in
/usr/include for the __noreturn__ attribute.

Fixes #745 and #150.

* Add the noreturn.pl script for generating the list of noreturn
functions for CodeSource.C.

Update the noreturn map in CodeSource.C based on additions to the
noreturn.pl script.  Mainly, add aliases for multiple function names
with the same address.

* Add Tim's updates to the noreturn.pl script.

2 months agoMemory leak fixes (#758)
Xiaozhu Meng [Mon, 1 Jun 2020 22:27:53 +0000 (15:27 -0700)]
Memory leak fixes (#758)

* Delete unsed allocatable interface

* Simplify ParseAPI::Block edge representation: only use one std::set for source edges and one std::set for target edges

* Fix memory leak regarding to IA_IAPI

* Update search for libc

* Fix memory leak in name demangling and code cleanup

* Try to free up memory when upgrading placeholders.

* Delete unused member variables regarding to liveness in parse-block

Co-authored-by: blue42u <anderson.jonathonm@gmail.com>
2 months agoC++ cleanup (#610)
Tim Haines [Sun, 31 May 2020 23:36:07 +0000 (18:36 -0500)]
C++ cleanup (#610)

* Delete old C++11 feature-checking CMake files

* Move C++ ABI check into cmake/c++11.cmake

* Use built-in CMake features for detecting C and C++ language support

* Rename cmake/c++11.cmake -> cmake/language_features.cmake

* Rename cmake/language_features.cmake -> cmake/LanguageStandards.cmake

* Use the LanguageStandards CMake module to set the C and C++ standards

* Add comments for CMake third-party library includes

* Whitespace cleanup in cmake/LanguageStandards.cmake

2 months agoLibxul fixes (#755)
Xiaozhu Meng [Sat, 30 May 2020 21:28:52 +0000 (14:28 -0700)]
Libxul fixes (#755)

* Don't abort for instruction semantic errors.

Define ROSE_ASSERT so that a signal is thrown for instruction
semantic errors instead of doing an assertion abort.

* 1. Clean dead code
2. Fix typo regarding to non-returning functions
3. The moving of edges for block split should be protected with a lock

* Fix block split for inconsistent cases

* Add more debug print

* Add debug print for knownData

* Ignore data symbols in .text sections. These are probably wrong symbol table information.

Co-authored-by: Stan Cox <scox@redhat.com>
2 months agoPotential fixes needed for relocating libraries (#754)
Xiaozhu Meng [Tue, 26 May 2020 20:58:23 +0000 (13:58 -0700)]
Potential fixes needed for relocating libraries (#754)

* Perform library adjustment for function pointers in various sections

* Multiple indirect jumps can share the same jump tables. Fix jump table finalization for this case

3 months agoAdd compiler-specific search directories in getResolvedLibraryPath (#732)
Tim Haines [Tue, 21 Apr 2020 17:10:12 +0000 (12:10 -0500)]
Add compiler-specific search directories in getResolvedLibraryPath (#732)

3 months agoMore parallel parsing optimization and fixes (#729)
Xiaozhu Meng [Sat, 11 Apr 2020 06:29:45 +0000 (23:29 -0700)]
More parallel parsing optimization and fixes (#729)

* Don't clean up the jump tables, the code needs some tuning.

* Refactor Block::getFuncs to not use interval trees, which will cause
mutual exclusion writes. Build a concurrent lookup during function finalization

* Swap to use unique_lock instead of lock_guard.

* (Untested) Shift synchronization to the entry-level locks.

* Add a fast-path to getModTypeCollection, to reduce contention issues.

* Do not assert when cannot trasnslate instruction to symbolic expression on x86_64

* By design, the target block of an edge should not change when the target address is not changed.
This is because there should be a unique block created at a give address. Previously, sink block
does not satisfy this invariant, so I perform an index lookup for edge target. This lookup will
cause significant unnecessary lock contention for the block concurrent hash map.

Fix sink block so that there is one and only one sink block and remove the edge target block
lookup

* Disable jump table finalization (Need to enable it after its performance is investigated)

* Pre-allocate hash table buckets for funcByBlocks map to remove hash table resizing overhead

* Fix jump table finalization

* Enable jump table finalization

* Do not remove incoming edges for the sink block.

* Fix gap searching in gap parsing

* More gap searching fixes

* Open libgcc.a on x86 for rewriting statically linked binaries

* Should convert pstate register to rose register on ARMv8

* Parse 2-PLT style PLT stubs, which are used when Intel-CET is enabled

* Cleanup some error messages

* More debug output cleanup

Co-authored-by: blue42u <anderson.jonathonm@gmail.com>
Co-authored-by: blue42u <blue42u@users.noreply.github.com>
4 months agoAdd search of libgcc.a to x86 and aarch64 (#731)
Sasha Nícolas [Fri, 27 Mar 2020 21:19:56 +0000 (16:19 -0500)]
Add search of libgcc.a to x86 and aarch64 (#731)

and warn user if it's not found.

4 months agoUse register x30 (Link Register) to generate long branch (#720)
Sasha Nícolas [Fri, 27 Mar 2020 21:10:43 +0000 (16:10 -0500)]
Use register x30 (Link Register) to generate long branch (#720)

on platform aarch64.

4 months agoDo not use non-trivial types in varargs (#704)
Tim Haines [Sun, 15 Mar 2020 21:06:19 +0000 (16:06 -0500)]
Do not use non-trivial types in varargs (#704)

How this is handled is implementation-defined.

https://gcc.gnu.org/bugzilla/show_bug.cgi?id=64867

4 months agoRemove undefined behavior from Symtab::Type (#706)
Tim Haines [Tue, 10 Mar 2020 21:39:05 +0000 (16:39 -0500)]
Remove undefined behavior from Symtab::Type (#706)

Calling a member function of a base class before the base class's constructor has completed is undefined behavior.

5 months agoPIE/PIC aarch64 rewrite implementation (#698)
Sasha Nícolas [Wed, 4 Mar 2020 20:55:14 +0000 (14:55 -0600)]
PIE/PIC aarch64 rewrite implementation (#698)

* Implementing fixes for PIE/PIC for rewrite mode on aarch64

Fixes emitPLTCall and emitPLTJump
Fixes emitCall for binary edit
Fixes emitStoreShared, emitStoreRelative, emitLoadShared, and emitLoadRelative

* Fix emitPLTJump and emitPLTCall for zeroah
LDR instruction on Pre index mode behaves differently
in arm1 and zeroah.

* correct search of libc init and fini handlers (__libc_csu_init and __libc_csu_fini)
mirror functions add_handler and doStaticBinarySpecialCases to the other platforms
fill findGlobalConstructorFunc and findGlobalDestructorFunc
add RT_DYNSYM to Region as type
fix update of info column in the section table
update relocation of type R_AARCH64_IRELATIVE
fix use of moveValueToReg and generateAddSubShifted in IPPatch::apply

6 months agoUpdate Examples in dataflowAPI (#700)
Xiaozhu Meng [Wed, 29 Jan 2020 23:21:12 +0000 (17:21 -0600)]
Update Examples in dataflowAPI (#700)

* Update Examples.tex file in dataflowAPI
* Update pdf

Co-authored-by: Tim Haines <thaines.astro@gmail.com>
6 months agoFixes for AbsRegion and jump table index slicing involving global variable (#695)
Xiaozhu Meng [Thu, 23 Jan 2020 21:10:02 +0000 (15:10 -0600)]
Fixes for AbsRegion and jump table index slicing involving global variable (#695)

1. When converting AbsRegion, PC on x86/64 should use post-instruction address

2. During jump table index slicing, we should only read read-only memory locations.
   Note that we still allow reading writable memory locations during jump table reads
   as jump tables may be put in writable sections by compilers

6 months agoParallel DWARF parsing and improved parallel code parsing (#651)
Xiaozhu Meng [Mon, 13 Jan 2020 21:36:40 +0000 (15:36 -0600)]
Parallel DWARF parsing and improved parallel code parsing (#651)

* changes for parallelizing symtabapi

* Tweaks to use OpenMP (still one last reducer left)

* Mark a false race in Type.C.
    std::call_once has a barrier at the end, so anything that happens inside is visible to anything that happens after.

* Replace the Cilk reducer with an OpenMP reduction

* Remove some dead code, and move the reducer into the source file.

* Mark the last race so far, move VG macros to a separate file.

* Annotate the two core locks, negating a lot of the race reports
    Implementation is not great though, I moved mcs_init to be a real function call.
    There might be a better way to do this, will investigate at some point.

* Very awkwardly annotate a parallel hashmap by key. Consider implementing better magic.

* Wrap the callback in `omp critical`, to make it parallel-safe no matter what happens.

* Swap out the vector for a TBB concurrent_queue.

* Remove some unnessesary annotations, using a proper OpenMP handles them.

* Revert the core lock annotations, they don't actually really work.

* Macro-replace the locks with boost equivalents. Revert this commit later once the testing is complete, or refactor it fully out.

* Replace the 1-entry cache with a vector that expands with the number of threads.

* Reuse the DwarfWalker between loop iterations, to save some work

* Use the standard allocator, so that Valgrind can track it properly

* Silence some warnings

* Replace the write with a CAS, letting Valgrind mostly ignore it.

* Strengthen the condition, its good enough for now.

* Re-annotate the hash map similar to an RW lock (which it technically is)

* Nearly fully fix the function-static annotations, using a very small constructor.

* Add libc++ annotations to vgannotations, and shift includes around to make them work

* Actually do the annotations right. I learned things today.

* Tell Helgrind to ignore a few more things

* Disable checking on everything

* A few tweaks to annotation

* Add h-b arcs to the pfq rwlock

* Apparently vectors didn't work like I thought they did. Whoops.

* Elfutils is now more thread-safe, and fix the annotations to keep DRD quiet.

* Make vgannotations.h local to Dyninst, and do something C++ for the lazy inits.

* Make the custom locks first-class C++ types, and compatible with C++17's syntax.

* Replace the lock implementations with more reasonable alternatives.

* Move the annotation to handle the case where std::pair does the write

* Unify all the TBB types under a Dyninst-tagged namespace, to permit refactor

Also fix a few whitespace errors near affected lines.

* Move concurrent_hash_map annotations into the unified class.

* Shift the thread-local stuff into a template class

* Wiggle the parallel loops and fine-grain the locking for a performance boost.

* Use Boost's call_once to try and be a bit more portable

* Put some parallelism into DwarfFrameParser. Fixes blue42u/dyninst#18 and blue42u/dyninst#19

* Use atomics for the reference counting. Fixes blue42u/dyninst#4.

* Add an extra lock to the StringTable, and use it to mediate access to the internals. Fixes blue42u/dyninst#20.

* Add a lock for inlines management, fixes blue42u/dyninst#22.

* Add a lock to the function frame vectors, fixes blue42u/dyninst#21.

* Replace a map+lock with a proper parallel hashmap for performance.

* Replace a mutex'd multi_index_container with a series of concurrent_hash_maps.

* Remove the comments that were left over from Cilkscreen race detection.

...I meant to do this a long time ago...

* Fix a number of minor issues, and one possibly important typo.

* Use RAII-style classes when handling the locks.

* Add a few defines for when Valgrind annotations are turned off.

* Parallelize some stuff in Object, makes the loading of files a little faster.

* Swap out some hash_maps for their concurrent forms, more easy parallelism.

* Actually do the parsing properly, and add a lock where it was needed.

* Adding more parallelism.

* Get rid of unnecessary serial code in finalization and add parallelism for hints initialization

* Removed a lock, and attempts to fix the resulting issues that arose afterwards.

* Tweaks to remove the phase-based approach

* 1. Fix missing parsed edges caused by early resuming frames
2. Always choosing the alphabetically smallest name for a function if there are multiple

* Delete swap_busy

* 1. Handle ud2 instruction, which will raise an undefined opcode exception. Therefore, control flow should not fall through
2. When deleting a bogus function, the reference counts of the blocks in the function should be decremented

* 1. Rewrite createAndRecordFrame to allow concurrent frame creations.
2. Simplify the use of frame status: BAD_LOOKUP means frame does not exists
   and a caller should only create a new frame when the result is BAD_LOOKUP

* 1. Resume functions as soon as a function finds a ret instruction
2. Rewrite parts of the tail call correction in finalization

* Estimate parsing task size by function symbol size
and launch large tasks first

* Delete omp critical in parisng of a fram

* Get rid of unnecessary assert

* Small changes to fix some maybe-races

* Munge the annotations for c_hash_map a little, and hotfix a possible race.

* Silence a number of warnings. Identations a mess but its quieter.

* Rewrite the c_hash_map to expose the accessors as a rwlock.

* Replace lock for delayed frames with concurrent hash map

* Parallelize SymtabCodeSource::init_hints

* Parallelize CodeObject::process_hints

* Fix an infinite loop in the parsing finalization stages.

* 1. Fix parallelization for CodeObject::process_hint(): a local variable declared is moved from outside loop to inside loop
2. Fix debug print crash in Parser.C
3. Some code cleanup

* ParseAPI now initialize hints in parallel. So, if the user of ParseAPI overloads the function for creating
ParseAPI::Function, that code should be thread-safe.

Change the DynCFGFactor in dyninstAPI to use mutex to be thread-safe.

* Lasily preparing range data for functions and blocks.

* Add block ranges and clean some dead code

* Add a CMake flag to enable Valgrind annotations

* Use dyn_c_vector, and disable the parallelism for ELF stuff for now.

* Rough additions of locks in various places to make things work.

* Properly initialize the Module in all constructors.

* Fix compilation

* Get rid unnecessary boost::lock_guard and use entry lookup in loop tree construction

* Use static AArch64 decoder tables. Fixes dyninst/dyninst#630.

Other improvements include faster compile time (for affected files),
~1s less load time, ~7.8MiB smaller binary, and ~200KiB more memory usage.

Performance effects not yet tested.

* Should not delete unused ParseAPI::Function during parsing because CFGFactory will do delete all created functions in its destructor.

* Use exchange instead of store to keep Valgrind happy.

* Several fixes for analyzing .a files

1. Rewrite the OverlappingParseData to correct handle overlapping code regions.
2. In .o files, code starts at address 0, so address 0 can be a valid address.
   So, change indirect call target from address 0 to max address to represent indiret calls
3. Use CodeSource to check address validity, which would allow cross CodeRegions valid address;
   but use CodeRegion for raw code bytes, because using CodeSource may return code bytes
   from other regions that are overlapping.

* Fixes for gap parsing, which uses a different interface to call Parser

* Fix range data related to gap parsing

* Fix loop tree callee construction on Power

* Fix function removing in parsing finalization

* Fix crahses of symtabAPI tests on power

* Fix deadlock in constructing analysis graph for jump table analysis.

* Type refcount refactor, part 1: s/Type*/boost::shared_ptr<Type>/g

* Purge Type::refCount and all related code bits. The shared_ptr's handle it now.

Also add proper SFINAE on that one template, since now typeScalar and Type
have the same size (thank GCC's automatic bitfield construction).

* Add the backwards compatbility layer

* Fixup for a minor issue that should have popped up sooner

* CFGFactory class does not need to inherit boost_guard

* Fix compilation on ARM, and fix part of the backwards-compat layer.

* Adjust cmake file to new elfutils

* libdyninstAPI_RT.so should not link against libgomp, which would
cause crash at program startup time due to calling into uninitialized
rewritten libc.

* Cleanup OpenMP handling in build system

* Fix compilation when USE_OpenMP is set to OFF

* Fix a debug print crash

* Fix infinite recursion caused by missing stack unwind debug info

* Disable installing trampolines in instrumentation

* Stack walk should always have an increasing SP on x86

* Several fixes for parallel code parsing

1. Add a jump table finalization step. The assumption here is that different jump tables
   do not share entries. So, if one jump table runs into another one, we know that the
   entries that are overlapping with the next table are out-of-bound.
2. Remove edges and blocks for created by out-of-bound jump table entries
3. Handle problems of failing to resolve jump tables caused by out-of-bound entries from
   other jump table entries.

Co-authored-by: Jonathon Anderson <17242663+blue42u@users.noreply.github.com>
Co-authored-by: Tim Haines <thaines.astro@gmail.com>
8 months agoPrevent corruption to rax during stack alignment on x86-64 (#670)
Xiaozhu Meng [Mon, 18 Nov 2019 04:59:01 +0000 (22:59 -0600)]
Prevent corruption to rax during stack alignment on x86-64 (#670)

8 months agoAllow same address range to map to different source lines in DWARF (#643)
Sasha Nícolas [Sun, 17 Nov 2019 06:43:23 +0000 (00:43 -0600)]
Allow same address range to map to different source lines in DWARF (#643)

8 months agoParse dwarf variables with abstract origin attribute (#642)
Sasha Nícolas [Sun, 17 Nov 2019 02:28:17 +0000 (20:28 -0600)]
Parse dwarf variables with abstract origin attribute (#642)

8 months agoIgnore additional Eclipse file and spurious .gitignore (#681)
Tim Haines [Sat, 16 Nov 2019 20:32:03 +0000 (14:32 -0600)]
Ignore additional Eclipse file and spurious .gitignore (#681)

The instructionAPI/doc/.gitignore seems to be auto-generated when
building the documentation. It tries to ignore instructionAPI/doc/API
which is already in the git history, so it's best to just ignore it to
prevent its accidental inclusion.

8 months agoFix instrumentation regressions for libc-2.29 on ARM (#653)
Xiaozhu Meng [Sat, 16 Nov 2019 20:22:31 +0000 (14:22 -0600)]
Fix instrumentation regressions for libc-2.29 on ARM (#653)

* Fixes loading pre-instrumentation register values on aarch64
* Fix the handling of trap instruction on ARM for register liveness analysis
* Implement a byte matching heuristic for determining the length of _start
* Implement a spin lock use __atomic_test_and_set on ARM
*   1. Change stop signal from SIGBUS to (SIGRTMIN + 4) in dyninstAPI_RT.
*   2. In dyninstAPI, only do dyninstRT signal check if the signal is indeed (SIGRTMIN + 4)
* Refacotr BPatch and DyninstRT to use breakpoint as the way of communication

8 months agoImplement the check of ThreadDB at BPatch level (#667)
Xiaozhu Meng [Sat, 16 Nov 2019 01:39:08 +0000 (19:39 -0600)]
Implement the check of ThreadDB at BPatch level (#667)

8 months agoAdd explicit ElfUtils dependency for ParseThat and examples (#678)
Tim Haines [Fri, 15 Nov 2019 20:15:26 +0000 (14:15 -0600)]
Add explicit ElfUtils dependency for ParseThat and examples (#678)

When linking the binaries for ParseThat and the examples, the transitive linkage between libsymtabAPI and libelf was not correctly resolved by the linker. Instead, it used the system libelf which may or may not be correct. This was discovered when using a non-system compiler with the --sysroot switch.

8 months agoAdd $INSTALL/lib/elfutils subdirectory to build paths (#680)
Tim Haines [Fri, 15 Nov 2019 04:02:16 +0000 (22:02 -0600)]
Add $INSTALL/lib/elfutils subdirectory to build paths (#680)

8 months agoAllow sterile builds (#641)
Tim Haines [Wed, 13 Nov 2019 19:29:43 +0000 (13:29 -0600)]
Allow sterile builds (#641)

A sterile build requires that all dependencies are already installed on the system and thus cannot be downloaded/built from source by the Dyninst build system.

9 months agoUpdate issue templates
Sasha Nícolas [Thu, 31 Oct 2019 00:49:27 +0000 (19:49 -0500)]
Update issue templates

9 months agoUpdate issue templates
Sasha Nícolas [Thu, 31 Oct 2019 00:44:16 +0000 (19:44 -0500)]
Update issue templates

9 months agoReorder includes to fix hidden build dependencies (#665)
Tim Haines [Wed, 16 Oct 2019 17:45:52 +0000 (12:45 -0500)]
Reorder includes to fix hidden build dependencies (#665)

cmake/shared.cmake includes cmake/cap_def_arch.cmake which conditionally
sets cap_thread_db only if ThreadDB has been included (but does not
include it, itself).

9 months agoDeprecate Blue Gene/Q support (#662)
Tim Haines [Fri, 11 Oct 2019 19:13:44 +0000 (14:13 -0500)]
Deprecate Blue Gene/Q support (#662)

9 months agoDelete duplicate friend declaration of Parser in Block (#649)
Tim Haines [Fri, 11 Oct 2019 18:12:52 +0000 (13:12 -0500)]
Delete duplicate friend declaration of Parser in Block (#649)

Fixes #615

9 months agoRename getType() -> getDataClass() in Section 8.1 of SymtabAPI docs (#661)
Tim Haines [Fri, 11 Oct 2019 02:37:22 +0000 (21:37 -0500)]
Rename getType() -> getDataClass() in Section 8.1 of SymtabAPI docs (#661)

9 months agoFix spelling of getTypedefType in Section 8.1 of SymtabAPI docs (#660)
Tim Haines [Fri, 11 Oct 2019 02:19:27 +0000 (21:19 -0500)]
Fix spelling of getTypedefType in Section 8.1 of SymtabAPI docs (#660)

9 months agoUpdate handling of TBB CMake file for clang (#654)
Tim Haines [Fri, 11 Oct 2019 02:13:37 +0000 (21:13 -0500)]
Update handling of TBB CMake file for clang (#654)

* Update version handling in TBB CMake file
* Fix passing 'compiler' to TBB build system for clang

9 months agoFix typo in declaration of 'create' in Section 8.3 (#659)
Tim Haines [Fri, 11 Oct 2019 01:39:21 +0000 (20:39 -0500)]
Fix typo in declaration of 'create' in Section 8.3 (#659)

9 months agoChange dataTypeDefine -> DataTypedef in DataClass enum documentation (#650)
Tim Haines [Fri, 11 Oct 2019 01:27:59 +0000 (20:27 -0500)]
Change dataTypeDefine -> DataTypedef in DataClass enum documentation (#650)

Fixes #623
* Change dataTypeDefine -> DataTypedef in DataClass enum
* Update PDF

10 months agoUse CMAKE_xx_COMPILER when building external dependencies (#636)
Tim Haines [Fri, 4 Oct 2019 18:41:31 +0000 (13:41 -0500)]
Use CMAKE_xx_COMPILER when building external dependencies (#636)

10 months agoAllow CMake files for dependencies to be included multiple times (#639)
Tim Haines [Sat, 7 Sep 2019 21:54:47 +0000 (16:54 -0500)]
Allow CMake files for dependencies to be included multiple times (#639)

Previously, multiple inclusions would result in the library being looked
up or downloaded/built multiple times. This ensures these actions happen
only once.

10 months agoUse static AArch64 decoder tables. (#633)
Jonathon Anderson [Wed, 4 Sep 2019 21:53:40 +0000 (16:53 -0500)]
Use static AArch64 decoder tables. (#633)

Fixes dyninst/dyninst#630

Other improvements include faster compile time (for affected files), ~1.2s less lazy init time, ~7.8MiB smaller binary, and ~10MiB less heap usage.

* Fixes for the more pedantic issues

* Splice out the operandFactory tables.

* Splice out the nodeBranches tables.

11 months agoDon't use software breakpoints when creating traps for springboards (#637)
Xiaozhu Meng [Mon, 2 Sep 2019 21:51:04 +0000 (16:51 -0500)]
Don't use software breakpoints when creating traps for springboards (#637)

We should only emit trap instructions and record trap mapping for trap springboards, without involving software breakpoints.

11 months agoFix overlapping bug of program header segments on fixPhdr. (#618)
Sasha Nícolas [Thu, 15 Aug 2019 22:47:12 +0000 (17:47 -0500)]
Fix overlapping bug of program header segments on fixPhdr. (#618)

This fix is making the update of the program headers in two passes. First, we need to update the addresses, and then insert the new created segment.

11 months agoUpdates TLS descriptors values in .dynamic section (ARMv8, #614)
Sasha Nícolas [Thu, 15 Aug 2019 21:07:15 +0000 (16:07 -0500)]
Updates TLS descriptors values in .dynamic section (ARMv8, #614)

Update TLS descriptor values in .dynamic section when .got and .plt offsets are modified for ARMv8.

11 months agoUse private writable mmap when opening binaries and debug files (#624)
Jonathon Anderson [Mon, 12 Aug 2019 23:15:35 +0000 (18:15 -0500)]
Use private writable mmap when opening binaries and debug files (#624)

* Open debug files (privately) writable, to allow libelf to decompress sections.
* Fix for SEGV when performing endianness conversions in-place later.

11 months agoConvert snprintf with PRIx64 to std::to_string (#627)
Tim Haines [Thu, 8 Aug 2019 22:21:50 +0000 (17:21 -0500)]
Convert snprintf with PRIx64 to std::to_string (#627)

PRIx64 is from C99 and isn't available with g++ with older libc headers.

11 months agoUse PRIx64 macros for long long results for i686. (#517)
Stan Cox [Mon, 5 Aug 2019 17:27:51 +0000 (13:27 -0400)]
Use PRIx64 macros for long long results for i686. (#517)

* Use PRIx64 macros for long long results for i686.
* Define PRIx64 for _MSC_VER

13 months agoARMv8 initial work on rewriter (#612)
Sasha Nícolas [Tue, 2 Jul 2019 19:30:07 +0000 (14:30 -0500)]
ARMv8 initial work on rewriter (#612)

* Implement AArch64 InterModule Function call
Debug message needs to be removed after finding out
* why X0 is kept being used
* why putting X0 address value back to itself does not work

* fix memory access mistakes, now uses offset mode

* removed all the debug printout for imfc

* add rewriter mode check
delete unwanted functions

* fix break on dynamic mode

* aarch64 broken movePCToReg implementation

* Fix unnecessary multiple calls to buildSysRegMap.

This function should be called only once, but was being called for every
instruction to be decoded. As a result, dyninst would take a long time
to execute. Now to simply run test1_1 on create mode takes 28 seconds,
as opposed to 58 before this fix, and now closer to 20 seconds for x86_64.

* movePCToReg still not working

* fix addressing mode for emitLoadRelative

* LoadShared: snip_ref_shlib_var test passes

* add assert details, remove debug code, and format patch

* inst-aarch64: sprintf -> snprintf, debug comments cleanup

* Implement ARMv8 IMFC and Load/Store Shared (#562)

* Implement AArch64 InterModule Function call
* fix memory access mistakes, now uses offset mode
* removed all the debug printout for imfc
* add rewriter mode check- delete unwanted functions
* fix break on dynamic mode
* aarch64 broken movePCToReg implementation
* movePCToReg still not working
* fix addressing mode for emitLoadRelative
* LoadShared: snip_ref_shlib_var test passes
* add assert details, remove debug code, and format patch
* inst-aarch64: sprintf -> snprintf, debug comments cleanup
* Minor cleanup- Remove commented-out code and debug print statements.

* Minor cleanup

Remove commented-out code and debug print statements.

* PLT: implement emitPLTCall and emitPLTJump

13 months agoDelete .syntastic_cpp_config
Sasha Nícolas [Fri, 28 Jun 2019 18:30:57 +0000 (13:30 -0500)]
Delete .syntastic_cpp_config

13 months agoAdd note on TBB usage when built from source
Tim Haines [Tue, 11 Jun 2019 20:51:45 +0000 (15:51 -0500)]
Add note on TBB usage when built from source

14 months agoMerge pull request #599 from dyninst/bump_version_number v10.1.0
Xiaozhu Meng [Thu, 16 May 2019 18:40:05 +0000 (13:40 -0500)]
Merge pull request #599 from dyninst/bump_version_number

Update version number to 10.1.0

14 months agoFix broken link in README 599/head
Tim [Wed, 15 May 2019 22:18:16 +0000 (17:18 -0500)]
Fix broken link in README

14 months agoAdd example usage of CMAKE_INSTALL_PREFIX
Tim [Wed, 15 May 2019 22:17:56 +0000 (17:17 -0500)]
Add example usage of CMAKE_INSTALL_PREFIX

14 months agoFix formatting in README
Tim [Wed, 15 May 2019 22:17:41 +0000 (17:17 -0500)]
Fix formatting in README

14 months agoFix doc bugs in LibIberty
Tim [Wed, 15 May 2019 21:45:28 +0000 (16:45 -0500)]
Fix doc bugs in LibIberty

14 months agoFix doc bug in Boost.cmake
Tim [Wed, 15 May 2019 21:23:00 +0000 (16:23 -0500)]
Fix doc bug in Boost.cmake

14 months agoMove advanced build instructions and FAQ to wiki
Tim [Wed, 15 May 2019 21:22:42 +0000 (16:22 -0500)]
Move advanced build instructions and FAQ to wiki

14 months agoUpdate CHANGELOD for 10.1
Xiaozhu Meng [Wed, 15 May 2019 21:29:25 +0000 (16:29 -0500)]
Update CHANGELOD for 10.1

14 months agoUpdate version number to 10.1.0
Xiaozhu Meng [Fri, 10 May 2019 18:58:34 +0000 (13:58 -0500)]
Update version number to 10.1.0

14 months agoTBB spack fixes (#595)
Tim Haines [Wed, 15 May 2019 20:01:03 +0000 (15:01 -0500)]
TBB spack fixes (#595)

* Fix typos and formatting in TBB CMake files
* Set minimum version of TBB to 2018.6
    This is what the Spack package is using.
* Set the source version of TBB to 2019.5
    This is the most recent version.
* In TBB, split the dotted-decimal version to make the download version
* Correctly handle minor version in FindTBB

14 months agoUpdate LibIberty to new build system (#601)
Tim Haines [Wed, 15 May 2019 20:00:32 +0000 (15:00 -0500)]
Update LibIberty to new build system (#601)

* Update LibIberty to new build system
* Include LibIberty from base CMakeLists.txt
* Correctly use USE_GNU_DEMANGLER in cap_arch_def
* Remove USE_GNU_DEMANGER from options.cmake
     This is now handled in cmake/LibIberty.cmake.

14 months agoMerge pull request #596 from dyninst/fix-sw-stepper
Xiaozhu Meng [Tue, 14 May 2019 19:10:02 +0000 (14:10 -0500)]
Merge pull request #596 from dyninst/fix-sw-stepper

Fix DwarfFrameParser, decodeDwarfExpression and DwarfResult

14 months agoMerge pull request #600 from dyninst/boost_1_70_fix
Xiaozhu Meng [Mon, 13 May 2019 21:27:35 +0000 (16:27 -0500)]
Merge pull request #600 from dyninst/boost_1_70_fix

Compilation fix for boost 1.70

14 months agoCompilation fix for boost 1.70 600/head
Xiaozhu Meng [Mon, 13 May 2019 18:14:19 +0000 (13:14 -0500)]
Compilation fix for boost 1.70

14 months agoMerge pull request #564 from dyninst/patch_cfg
Xiaozhu Meng [Sun, 12 May 2019 02:18:47 +0000 (21:18 -0500)]
Merge pull request #564 from dyninst/patch_cfg

Fix bad interactions between patchAPI and parseAPI

14 months agoAugment BPatch_effectiveAddressExpr to accept a second parameter, which 564/head
Xiaozhu Meng [Mon, 11 Mar 2019 00:22:37 +0000 (19:22 -0500)]
Augment BPatch_effectiveAddressExpr to accept a second parameter, which
represents the number of bytes to access if reading/writing with this
snippet.

API compatibility is maintained by setting the default value of the
seoncd parameter to 8 (bytes)

14 months agoRight now, the BPatch_deref and BPatch_regExpr do not specify the size.
Xiaozhu Meng [Wed, 6 Mar 2019 17:19:04 +0000 (11:19 -0600)]
Right now, the BPatch_deref and BPatch_regExpr do not specify the size.
Currently the default is 32-bit. Change the default to 64-bit

14 months agoWhen splitting a block using CFGModifier::split, we need to record the
Xiaozhu Meng [Tue, 5 Mar 2019 15:24:11 +0000 (09:24 -0600)]
When splitting a block using CFGModifier::split, we need to record the
new block in parse_data

14 months agoMerge pull request #592 from dyninst/pp_springboard
Xiaozhu Meng [Sun, 12 May 2019 00:20:42 +0000 (19:20 -0500)]
Merge pull request #592 from dyninst/pp_springboard

More fixes for parallel parsing, spring boards, and ARM

14 months agoDisable incomplete implementation for RA compensation for stack 592/head
Xiaozhu Meng [Sat, 11 May 2019 23:00:57 +0000 (18:00 -0500)]
Disable incomplete implementation for RA compensation for stack
unwinding

14 months agoBump minimum CMake version to 3.4.0 (#598)
Tim Haines [Fri, 10 May 2019 23:50:10 +0000 (18:50 -0500)]
Bump minimum CMake version to 3.4.0 (#598)

This is needed for FindBoost and is already in the Spack recipe

14 months agoAdd ARM effective address calculation (#594)
Xiaozhu Meng [Fri, 10 May 2019 23:48:59 +0000 (18:48 -0500)]
Add ARM effective address calculation (#594)

14 months agoBPatch_effectiveAddress truncates mem addresses on Power (#593)
Xiaozhu Meng [Fri, 10 May 2019 23:46:59 +0000 (18:46 -0500)]
BPatch_effectiveAddress truncates mem addresses on Power (#593)

In certain circumstances, BPatch_effectiveAddress would generate code that truncated
memory addresses to the bottom 32bits. The result is that instrimentation would see only
the bottom 32bits of any memory address. Before this patch, the issue occurred when instrumentation was applied to load/store instructions where the address was located in registers r3-r11 (exclusive). Ideally this function should just be straight removed in future releases (only used by emitASLoad).

14 months agoFix jump table analysis for ROSE Registers (#576)
Xiaozhu Meng [Fri, 10 May 2019 23:45:27 +0000 (18:45 -0500)]
Fix jump table analysis for ROSE Registers (#576)

Remove assertions in code from translating Dyninst::MachRegister to ROSE Register. In addition, passing the error code back to jump table analysis.

14 months agoUpdate README to reflect new build system (#597)
Tim Haines [Fri, 10 May 2019 17:10:02 +0000 (12:10 -0500)]
Update README to reflect new build system (#597)

14 months agoAdd initial support for decoding AMD FMA4 and XOP instructions (#575)
Xiaozhu Meng [Fri, 10 May 2019 17:09:26 +0000 (12:09 -0500)]
Add initial support for decoding AMD FMA4 and XOP instructions (#575)

* Add initial support for decoding AMD FMA4 instruction, including:

e_vfmaddsd, e_vfmaddss, e_vfmsubpd, e_vfmsubsd, e_vfnmaddpd,
e_vfnmaddsd,

* Add initial support for decoding XOP instructions:

e_vpcomd, e_vpmacsdd, e_vpcmov, e_vpshad

* Add x86 instruction decoding support for vpperm, movbe, vpperm

14 months agoFix DwarfFrameParser, decodeDwarfExpression and DwarfResult 596/head
Sasha @leela [Thu, 9 May 2019 21:19:44 +0000 (16:19 -0500)]
Fix DwarfFrameParser, decodeDwarfExpression and DwarfResult

After porting Dyninst to use libdw, DwarfFrameParser missed dealing
with important Dwarf operations that would decode rules for findind
registers values. These rules were not properly decoded by Dyninst
decodeDwarfExpression, neither were being dealt by DwarFrameParser.
This fix properly retrieves libdw Dwarf operations and decodes them,
making it possible to DebugStepper work, which wasn't even before the
port, when lidwarf was being used on Dyninst 9.3.

Basically, Dwarf frame info can be a simple dwarf expression, representing
a value or a memory address, a location description, or a location list.
Libdw gives the consumer an array of dwarf operations that describes how
to find the value they're looking for, as opposed to libdwarf who gives
the consumer many out parameters that lead to different ways to find a
value. This important change made DwarfFrameParser work only partially
after the port. And this fix came to implement the cases that were not
being considered.

14 months agoFix compilation of thread_db_process (#571)
Sasha Nícolas [Wed, 8 May 2019 23:03:32 +0000 (18:03 -0500)]
Fix compilation of thread_db_process (#571)

On a machine without libthread_db.so, the placeholder class had missing member functions and the contructors were calling wrong base constructors.

14 months agoSupport parsing cubin in dyninst-10.0 (#556)
Keren Zhou [Tue, 7 May 2019 22:22:40 +0000 (17:22 -0500)]
Support parsing cubin in dyninst-10.0 (#556)

14 months agoOnly demangle names starting with "_Z" according to the Itanium C++ ABI
Xiaozhu Meng [Tue, 7 May 2019 19:45:46 +0000 (14:45 -0500)]
Only demangle names starting with "_Z" according to the Itanium C++ ABI

14 months agoIn ProccontrolAPI, adding reading & writing mutatee's memory with procfs.
Xiaozhu Meng [Tue, 7 May 2019 16:43:49 +0000 (11:43 -0500)]
In ProccontrolAPI, adding reading & writing mutatee's memory with procfs.
We fall back to use ptrace if procfs read & write fail.

This change is for fixing icache coherence issue for ARM dynamic instrumentaiton.
ARM architecture does not guarantee icache-dcache coherence. And writes through
ptrace does not seem to invalidate icache contents and caused SIGILLs

15 months agoFixing TBB dependencies during build. (#570)
Sasha Nícolas [Thu, 2 May 2019 21:18:00 +0000 (16:18 -0500)]
Fixing TBB dependencies during build. (#570)

Explicitly establish dependencies on TBB.

15 months agoElfutils cleanup (#591)
Tim Haines [Thu, 2 May 2019 20:54:12 +0000 (15:54 -0500)]
Elfutils cleanup (#591)

fixes #557
fixes #547
fixes #561

- Consolidate all elfutils options into cmake/ElfUtils.cmake
- Allow user to supply installation hint directories
- Allow user to specify minimum version
- Use user-specified minimum version when building from source instead of 'elfutils-latest.tar.gz'
- Unify system paths when searching for libelf and libdw (fixes #557)
- Correctly install headers/libs when building from source (fixes #547)
- Exports variables for use in Testsuite (fixes #561)
- Clean up formatting

15 months agoTBB Cleanup (#584)
Tim Haines [Thu, 2 May 2019 20:52:11 +0000 (15:52 -0500)]
TBB Cleanup (#584)

- Remove FindTBB submodule
- Consolidate all TBB stuff into cmake/ThreadingBuildingBlocks.cmake
- Explicitly die on non-UNIX platforms when building from source (previously, it did nothing)
- Minimum TBB version is 2018.0 (I'm not sure this is necessary or sufficient)
- Export include/library directories into the CMake cache for consumption by Testsuite
- Libraries and headers are exported to CMAKE_INSTALL_PREFIX when building from source
- Correctly handles broken TBB install (intel/tbb#98)
- Explicitly die on non-UNIX platforms when building from source (previously, it did nothing)
- Minimum TBB version is 2018.0 (I'm not sure this is necessary or sufficient)
- Export include/library directories into the CMake cache for consumption by Testsuite
- Default version to build from source is 2019_U5
- Libraries and headers are exported to CMAKE_INSTALL_PREFIX when building from source
- Correctly handles broken TBB install (intel/tbb#98)

15 months agoBoost cleanup (#578)
Tim Haines [Thu, 2 May 2019 20:49:01 +0000 (15:49 -0500)]
Boost cleanup (#578)

Substantially changes how we handle Boost builds in Dyninst.

Fixes #563

- Tagged build layouts are now fully supported
- Boost is exported to the same install structure as Dyninst (fixes #563)
- All cmake variables that control Boost's build options are now available for the user to change via cache variables (e.g., -DBoost_USE_MULTITHREADED)
- Substantial error handling has been added
- Consolidates all Boost-related activities into cmake/Boost.cmake
- Makes Boost-1.61 the new minimum version (needed for Filesystem)
- Builds Boost-1.69 when building from source

15 months agosimple working hybrid example of patchAPI (#588)
Ian A Mason [Mon, 29 Apr 2019 22:23:15 +0000 (15:23 -0700)]
simple working hybrid example of patchAPI  (#588)

* simple working hybrid example of patchAPI (using dyninstAPI to create the PatchMgr and PatchObject).

* TLC plus some remarks about running the rewritten program.

15 months agoFix PCWdiget implementation on ARMv8
Xiaozhu Meng [Tue, 23 Apr 2019 21:32:03 +0000 (16:32 -0500)]
Fix PCWdiget implementation on ARMv8

15 months agoMove architecture dependent code in PCWidget.C to three separate architecture specifi...
Xiaozhu Meng [Tue, 23 Apr 2019 19:17:23 +0000 (14:17 -0500)]
Move architecture dependent code in PCWidget.C to three separate architecture specific source files.

15 months agoFor jump table analysis, control flow edges can be created in different orders,
Xiaozhu Meng [Tue, 23 Apr 2019 14:02:39 +0000 (09:02 -0500)]
For jump table analysis, control flow edges can be created in different orders,
which lead to non-deterministic slicing and non-determinisitc jump table analysis.

Therefore, we need to sort source edges in slicing based on the edge's source block
address and edge type to ensure deterministic slicing.

15 months ago1. Replace springboards prioriy "OffLimits" and "Required" with "FuncEntry" and ...
Xiaozhu Meng [Thu, 18 Apr 2019 16:16:06 +0000 (11:16 -0500)]
1. Replace springboards prioriy "OffLimits" and "Required" with "FuncEntry" and "IndirBlockEntry".

Only "FuncEntry" springboards are required because control flow enter instrumentation
through function calls (we relocate the whole function even if only a part of the
function is instrumented).

"IndirBlockEntry" springboards are important for re-directing control flow from
jump tables back to instrumentation. But, it is not as important as "FuncEntry".

2. Jumps to code in another secion should be treated as tail calls.

15 months agoIn dynamic instrumentation, springboards are installed immediately after
Xiaozhu Meng [Sun, 14 Apr 2019 22:00:48 +0000 (17:00 -0500)]
In dynamic instrumentation, springboards are installed immediately after
users insert a snippet. The user can continue to insert more snippets to
the same function, which will trigger Dyninst to perform the additional
relocation. So, we need to overwrite existing springboard for newly added
instrumentations.

In other words, we need to overwrite existing springboards if the existing
ones were installed in previous relocations.