dyninst.git
12 hours agoAdd initial support for analyzing AMDGPU binaries (#900) master
bbiiggppiigg [Tue, 24 Nov 2020 05:28:27 +0000 (05:28 +0000)]
Add initial support for analyzing AMDGPU binaries (#900)

* remove unnecessary assertion for unknown phdr_type

* add initial stubs for amdgpu support

* add formatters for amdgpu

* add opcode table and register definition

* added support for register vector

* add untracked files

* commit stubs for xiaozhu to see

* initial cfg traversal done

* remove unused register-pair related files

* remove symbol patching since the 256 byte function header is no longer there

* Do not assert in getBaseRegister

* fix instruction length detection and decoding logic

* now decode will only decode operands for branch instructions

* added basic support for amdgpu in rose

* merged upstream

* fix a bug where we decode the vdst as ssrc

* improve the logic for computing len of instructions that might make use of literals, such that we no longer need to pass the buffer all over the place

* fix undefined behavior for std::transform

* Remove empty code blocks/Unreachable code/Unneeded
Comment out dead code
Restore sym_debug_parsing to default value 0

* Added meaningful name and comments to function prototype of getAMDGPURoseRegisters
Remove duplicate public modifiers in class declaration.

* remove unnecessary include of boost/format.hpp

* remove all amdgpu related stuff in dataflowAPI, and patched indirect analyzer so it skips for amdgpu

* renaming Arch_amdgpu to Arch_amdgpu_vega

* make changes to use namespace amdgpu_vega instead of amdgpu

* change the naming of c_NonReturnInsn to c_GPUKernelExitInsn as suggested

Co-authored-by: Xiaozhu Meng <mxz297@gmail.com>
17 hours agoMake libiberty detection more flexible (#922)
Tim Haines [Tue, 24 Nov 2020 00:21:10 +0000 (18:21 -0600)]
Make libiberty detection more flexible (#922)

Some platforms don't install libiberty in a subdirectory (e.g., /usr/include/libiberty), so account for that.

4 days agoAPI-breaking changes for 11.0 release (#920)
Tim Haines [Fri, 20 Nov 2020 04:12:08 +0000 (22:12 -0600)]
API-breaking changes for 11.0 release (#920)

* Remove deprecated BPatch_snippet::getCost* (#832)
    These were deprecated by 52f3437 in 2010.

* Remove deprecated BPatch_process::enableDumpPatchedImage (#831)
    This was deprecated by 4d83371 in 2011.

* Remove AddressSpace::getAddressWidth from public API (#797)
    This was originally part of https://github.com/dyninst/dyninst/pull/317.

* Fix memory leak of AddressSpace::patcher_ (#795)
    This was originally part of https://github.com/dyninst/dyninst/pull/317.
    This is an API-breaking change since AddressSpace is exported through
    the BPatch interface.

* Remove deprecated insnCodeGen::generate (#836)
    dyninstAPI/src/codegen-power.C: Removed by 5274e3b in 2011.
    dyninstAPI/src/codegen-aarch64.C: Removed by 0cbe684 in 2015.
    dyninstAPI/src/codegen-x86.C: git can't figure out when this was removed.

* Remove BPatch_addressSpace::findFunctionByAddr (#837)
    This was deprecated by 7f20129 in 2010. Users should instead use either
    BPatch_addressSpace::findFunctionByEntry or
    BPatch_addressSpace::findFunctionsByAddr.

* Remove deprecated BPatch_regExpr (#838)
    This was deprecated by 4d15de8 in 2008.

* Remove serialization (#805)
    Remove all code guarded by SERIALIZATION_DISABLED
    Remove code protected by cap_serialization
    Remove serialize-bin
    Remove serialization classes and their uses
    Simplify Symtab::getObject
        Because serialization doesn't exist, their is only one codepath here now.

* Remove CFGFactor::destroy_all (#881)
    This removes the possiblity of object reuse and its associated undefined
    behavior. This was originally part of #317.

7 days agoImprove single thread's backward slicing speed by 40% (#917)
Keren Zhou [Tue, 17 Nov 2020 02:06:25 +0000 (20:06 -0600)]
Improve single thread's backward slicing speed by 40% (#917)

3 weeks agoAdd note about minimum elfutils version (#912)
Tim Haines [Sun, 1 Nov 2020 01:35:56 +0000 (20:35 -0500)]
Add note about minimum elfutils version (#912)

We need elfutils >=0.178 for parallel DWARF parsing because libdw isn't thread-safe before then.

3 weeks agoCorrectly set up libiberty to be consumed by build system (#901)
Tim Haines [Fri, 30 Oct 2020 01:11:32 +0000 (20:11 -0500)]
Correctly set up libiberty to be consumed by build system (#901)

4 weeks agoFix memory leaks in emitElf (#895)
Tim Haines [Fri, 23 Oct 2020 06:38:15 +0000 (01:38 -0500)]
Fix memory leaks in emitElf (#895)

This was originally part of #317

4 weeks agoSymElf: fix memory leak of cached demangled names
James A. Kupsch [Fri, 16 Oct 2020 16:13:56 +0000 (11:13 -0500)]
SymElf:  fix memory leak of cached demangled names

* the existing cache in SymElf did not free the char* string in each
  cache entry

4 weeks agoproperly check for empty string in parseStabString
James A. Kupsch [Fri, 16 Oct 2020 16:12:15 +0000 (11:12 -0500)]
properly check for empty string in parseStabString

* fix bug in code that checked for empty std::string by checking the
  first char of the string being null

4 weeks agofix duplicate Windows demangle code
James A. Kupsch [Fri, 16 Oct 2020 16:01:49 +0000 (11:01 -0500)]
fix duplicate Windows demangle code

* remove the 2 duplicate cplus_demangle and stripAtSuffix functions
  to the common library in ntKludges.C

* change signature of cplus_demangle name param to be const char*

4 weeks agomake symbol name demangling consistent (#872, #717)
James A. Kupsch [Tue, 29 Sep 2020 05:05:45 +0000 (00:05 -0500)]
make symbol name demangling consistent (#872, #717)

* make all pretty and typed names consistent on linux and freebsd.
  the pretty name is the value returned by 'c++filt -i -p <sym>' and the
  typed name is the value returned by 'c++file -i <sym>'.  In addition
  C++ mangled and nonmangled symbols both have and symbol versioning or
  stabs suffix removed (previously nonmangled symbols included this
  suffix), also for C++ mangled symbols the pretty name now includes any
  present function cloning suffix (previously not included)

* use libiberty's cplus_demangle to generate pretty and typed names
  from the mangled names instead of abi::__cxa_demangle to get the typed
  name and parsing the result to get the pretty name

* remove USE_GNU_DEMANGLE cmake variable as libiberty is now required
  on non-windows platforms

* use common function symbol_demangle to implement both pretty and typed
  names using cplus_demangle and removing suffixes (versioning and
  stabs), and add function cloning suffixes back to the pretty name
  so it is consistent with the mangled and types names.

* added a last result caching version of symbol_demangle,
  symbol_demangle_with_cache used by P_cplus_demangle (matching current
  behavior)

* change P_cplus_demangle interface to take and return a std::string
  instead of a char*

* update SymtabAPI documentation improve the definitions of mangled,
  pretty and typed name for correctness and to match current behavior

* removed demangleSymbol and demangleSymbols methods and other functions
  that are unused or have no effect.

* remove native compiler support (pgcc) from P_cplus_demangle and all
  other uses

5 weeks agoMerge pull request #891 from kupsch/remove-muldivfuncs
kupsch [Mon, 19 Oct 2020 14:21:45 +0000 (09:21 -0500)]
Merge pull request #891 from kupsch/remove-muldivfuncs

code cleanup integer funcs to * and / by constants

5 weeks agoRemove old InstrucIter class references (#890)
Tim Haines [Fri, 16 Oct 2020 22:55:34 +0000 (17:55 -0500)]
Remove old InstrucIter class references (#890)

The definition and usage of this class was removed by dee8900ad in 2011.

5 weeks agocode cleanup integer funcs to * and / by constants 891/head
James A. Kupsch [Fri, 16 Oct 2020 20:34:01 +0000 (15:34 -0500)]
code cleanup integer funcs to * and / by constants

* remove functions to multiply and divide by 1000 and 1000000 using
  adds, subtracts and shifts.  Not used, not needed.

5 weeks agoEnsure data is copied in memoryTracker::realloc (#886)
Tim Haines [Wed, 14 Oct 2020 01:51:31 +0000 (20:51 -0500)]
Ensure data is copied in memoryTracker::realloc (#886)

This bug was introduced by #876.

6 weeks agoInclude <iostream> in CodeTracker.C (#887)
Tim Haines [Mon, 12 Oct 2020 00:29:12 +0000 (19:29 -0500)]
Include <iostream> in CodeTracker.C (#887)

This only showed up in gcc-10. I'm assuming they fixed some transitive includes in libstdc++.

6 weeks agoclean up BoundFactCalculator constructor (#884)
Tim Haines [Fri, 9 Oct 2020 20:14:34 +0000 (15:14 -0500)]
clean up BoundFactCalculator constructor (#884)

* Default initialize BoundFactsCalculator::orderStamp
* Whitespace cleanup

6 weeks agoCodeSource destructor cleanup (#883)
Tim Haines [Wed, 7 Oct 2020 03:44:49 +0000 (22:44 -0500)]
CodeSource destructor cleanup (#883)

* removeRegion should take a pointer
    This makes the interface types consistent.
* Move destruction of CodeSource::_regions to ~CodeSource
* Put 'removeRegion' in CodeSource
* Code cleanup
* Whitespace cleanup
* Move dtor implementation to source file

6 weeks agoFix memory leaks in BinaryEdit::openResolvedLibraryName (#879)
Tim Haines [Tue, 6 Oct 2020 18:59:52 +0000 (13:59 -0500)]
Fix memory leaks in BinaryEdit::openResolvedLibraryName (#879)

* Improve memory handling and simplify compatibility checks
* Use range-for loops
* Use emplacement for retMap
* Clean up string handling
* Simplify return paths
    This also improves the error messages.
* Fix memory leaks in static executable case
* Cleanup whitespace
* Omit BinaryEdits for incompatible archives of static binaries

7 weeks agoRequire standards-compliant c++11 ABI (#882)
Tim Haines [Tue, 6 Oct 2020 04:24:11 +0000 (23:24 -0500)]
Require standards-compliant c++11 ABI (#882)

7 weeks agoAdd lookup by name in block_instance::callee (#875)
Tim Haines [Mon, 5 Oct 2020 18:32:25 +0000 (13:32 -0500)]
Add lookup by name in block_instance::callee (#875)

* Refactor callee lookup by name into separate function
* Add callee lookup by name if lookup by PLT address fails
* Code cleanup (c++11-ify)
* Get rid of fbtvector
    It's just a copy of fbt.
* Cleanup comments

7 weeks agoRemove unused lineDict class (#880)
Tim Haines [Mon, 5 Oct 2020 04:17:27 +0000 (23:17 -0500)]
Remove unused lineDict class (#880)

This was originally part of #317.

7 weeks agocleanup memoryTracker memory handling (#876)
Tim Haines [Sun, 4 Oct 2020 23:23:31 +0000 (18:23 -0500)]
cleanup memoryTracker memory handling (#876)

* Use a unique_ptr to manage object
* Use inline initializer for public members
     This makes the constructors simpler.
* Whitespace cleanup
* Use new/delete to fix realloc

7 weeks agoProvide correct default constructor for parse_func class (#878)
Tim Haines [Sun, 4 Oct 2020 03:08:25 +0000 (22:08 -0500)]
Provide correct default constructor for parse_func class (#878)

* Provide correct default constructor for parse_func
    This fixes a memory corruption bug when destroying default-
    constructed objects of this class.

* Clean up dead functions

7 weeks agoAdd arch address for intel gen9 gpus (#874)
Keren Zhou [Fri, 2 Oct 2020 03:48:53 +0000 (22:48 -0500)]
Add arch address for intel gen9 gpus (#874)

7 weeks agoCorrectly destruct AddressSpace objects (#871)
Tim Haines [Fri, 2 Oct 2020 01:53:57 +0000 (20:53 -0500)]
Correctly destruct AddressSpace objects (#871)

* Call deleteAddressSpace from ~AddressSpace
    This was originally part of #317.

* Code cleanup

7 weeks agoUpdate documentation for ParseAPI::CodeObject::CodeObject (#870)
Tim Haines [Wed, 30 Sep 2020 23:13:09 +0000 (18:13 -0500)]
Update documentation for ParseAPI::CodeObject::CodeObject (#870)

* Update documentation for ParseAPI::CodeObject::CodeObject
    Make an explicit note that the CodeSource is not owned by the
    CodeObject. This clarifies the ownership semantics.

7 weeks agoRemove binaryEdit::deleteBinaryEdit (#866)
Tim Haines [Tue, 29 Sep 2020 20:09:25 +0000 (15:09 -0500)]
Remove binaryEdit::deleteBinaryEdit (#866)

This moves the same functionality into the destructor and prevents possible memory corruption when its usage would promote in-place object reuse. Originally part of #317.

8 weeks agoRemove include cycle in dyntypes.h (#868)
Tim Haines [Tue, 29 Sep 2020 03:04:01 +0000 (22:04 -0500)]
Remove include cycle in dyntypes.h (#868)

This prevented using concurrent data structures in dyntypes.

8 weeks agoNvidia GPU slicing and support for opening Intel GPU binaries (#865)
Xiaozhu Meng [Mon, 28 Sep 2020 18:41:30 +0000 (11:41 -0700)]
Nvidia GPU slicing and support for opening Intel GPU binaries (#865)

* Add cuda registers and ops

* Make appendOperand available to external usage

* Add cuda register size (>=sm_50)

* Refactor slicing to use Block::getInsns to get instructions inside a basic block

* Add a placeholder for pc on cuda and remove a few asserts

* Not decode cuda instructions

* Fix register naming bug

* Change constant to 500 to find more dependencies

* Remove slicing constraint

* Add an interface to use external AssignmentConverter for Slicing

* Add support to share instruction cache between different slices

* Adding predicates fields to Operand classes

* Add predicate registers and methods to get predicate registers

* Add barrier registers

* Initial implementation of slicing support for predicated instructions

* Add missed code for copy predicate information in Operand class's copy constructor and equal operator

* Comment logs

* Add Turing registers

* Fix reg prefix

* added support for intel gen9 gpu

* Remove tab and logs

* Add support for intel gpu instructions

* Add slicing size limit factor

* 1. Avoid using Block pointer as key to a cache. Use block start address
2. Change the default value of bound size limit factor
3. Changes to suppress warning regarding to intel gpu
4. Other code cleanup

Co-authored-by: Jokeren <robinho364@gmail.com>
Co-authored-by: Aaron Cherian <aarontcopal2@jlselogin2.ftm.alcf.anl.gov>
2 months agoRequire c++11 thread_local support (#860)
Tim Haines [Wed, 23 Sep 2020 02:41:18 +0000 (21:41 -0500)]
Require c++11 thread_local support (#860)

* Require c++11 thread_local support
* Change TLS_VAR usage to dyn_tls

2 months agoFix undefined behavior in usage of std::transform (#862)
Tim Haines [Tue, 22 Sep 2020 22:51:39 +0000 (17:51 -0500)]
Fix undefined behavior in usage of std::transform (#862)

Starting in C++11, it is undefined behavior to have the destination
iterator be contained within the input range.

2 months agoCleanup dyn_hash_{set,map} (#861)
Tim Haines [Tue, 22 Sep 2020 21:22:19 +0000 (16:22 -0500)]
Cleanup dyn_hash_{set,map} (#861)

* Require std::unordered_{map,set} for dyn_hash_{map,set}
    This also converts the dyn_hash_* macros to alias templates for better
    type safety and error messages.
* Remove custom hashers for enums
* Use typed enums for IA32Regs, entryID, and prefixEntryID
    This ensures that the std::hash implementation that uses
    std::underlying_type will reflect the old custom hashers.

2 months agoRemove bluegene support (#847)
Tim Haines [Tue, 22 Sep 2020 18:17:31 +0000 (13:17 -0500)]
Remove bluegene support (#847)

* Remove Bluegene support
* Remove IBM_BPATCH_COMPAT usage

2 months agoRemove vxworks support (#859)
Tim Haines [Tue, 22 Sep 2020 02:54:02 +0000 (21:54 -0500)]
Remove vxworks support (#859)

Support for VxWorks was added by 02bc600 in March 2010, and the code broken by 0bc3980 in November 2011. It has also never been part of the CMake build system (ca. 2013).

2 months agoReplace pdvector with std::vector (#856)
Tim Haines [Mon, 21 Sep 2020 21:44:49 +0000 (16:44 -0500)]
Replace pdvector with std::vector (#856)

2 months agoRemove vectorSet (#857)
Tim Haines [Mon, 21 Sep 2020 21:15:03 +0000 (16:15 -0500)]
Remove vectorSet (#857)

This was an unused internal container. No user code is affected by this.

2 months agoparseThat: remove autotools build files (#858)
Tim Haines [Mon, 21 Sep 2020 20:49:26 +0000 (15:49 -0500)]
parseThat: remove autotools build files (#858)

It has been building with CMake since 2016, so we don't need a second
option.

2 months agoReplace BPatch_vector internal implementation with std::vector (#844)
Tim Haines [Mon, 21 Sep 2020 20:23:15 +0000 (15:23 -0500)]
Replace BPatch_vector internal implementation with std::vector (#844)

* Replace BPatch_vector internal implementation with std::vector
    This keeps the BPatch_vector type, but only as an alias to std::vector.
* Remove '#pragma implementation'
* Remove friend declaration from BPatch_frame

2 months agoSome necessary changes for overlapping text regions (#855)
Xiaozhu Meng [Mon, 21 Sep 2020 19:58:59 +0000 (12:58 -0700)]
Some necessary changes for overlapping text regions (#855)

Dyninst doesn't fully support binaries that contain text regions
with overlapping address ranges, e.g. CUBINs. This patch adds
necessary but not complete support for this case.

Co-authored-by: John Mellor-Crummey <johnmc@rice.edu>
2 months agoRemove vestiges of sparc (#850)
Tim Haines [Wed, 16 Sep 2020 01:58:17 +0000 (20:58 -0500)]
Remove vestiges of sparc (#850)

2 months agoRemove vestiges of AIX (#849)
Tim Haines [Tue, 15 Sep 2020 22:10:48 +0000 (17:10 -0500)]
Remove vestiges of AIX (#849)

2 months agoInstructionAPI docs: Update InsnCategory values returned from Instruction::getCategor...
Tim Haines [Tue, 15 Sep 2020 21:07:46 +0000 (16:07 -0500)]
InstructionAPI docs: Update InsnCategory values returned from Instruction::getCategory (#851)

2 months agoV10.2.1 release updates (#842) v10.2.1
Tim Haines [Thu, 10 Sep 2020 03:28:02 +0000 (22:28 -0500)]
V10.2.1 release updates (#842)

* Update CHANGELOG for v10.2.1 release
* Update version number for v10.2.1 release

2 months agoRemove exception specifications (#841)
Tim Haines [Thu, 10 Sep 2020 00:57:04 +0000 (19:57 -0500)]
Remove exception specifications (#841)

They were deprecated in c++11 and removed in c++17.

2 months agoFix memory leak in singleton_object_pool (#835)
Tim Haines [Tue, 8 Sep 2020 18:34:06 +0000 (13:34 -0500)]
Fix memory leak in singleton_object_pool (#835)

Two memory leak fixes related singleton_object_pool.

    1. The singleon_object_pool currently only destructs objects but does not deallocate memory space. This leak applies to all architectures.

    2. On ppc and arm, instruction decoder does not use smart pointers to manage InstructionAPI::Instruction constructed by a singleon_object_pool, and thus cause memory leaks.

2 months agoFix power instruction decoding regression 835/head
Xiaozhu Meng [Sun, 6 Sep 2020 19:44:41 +0000 (14:44 -0500)]
Fix power instruction decoding regression

2 months agoFix aarch64 instruction decoding regression
Xiaozhu Meng [Sun, 6 Sep 2020 19:06:13 +0000 (12:06 -0700)]
Fix aarch64 instruction decoding regression

2 months agoFix memory leak in singleton_object_pool
Xiaozhu Meng [Sat, 5 Sep 2020 20:42:11 +0000 (13:42 -0700)]
Fix memory leak in singleton_object_pool

2 months agoRemove unused Doxygen files from instructionAPI (#829)
Tim Haines [Sun, 30 Aug 2020 04:52:59 +0000 (23:52 -0500)]
Remove unused Doxygen files from instructionAPI (#829)

2 months agoRemove deprecated members of BPatch_flowGraph (#828)
Tim Haines [Sun, 30 Aug 2020 04:40:57 +0000 (23:40 -0500)]
Remove deprecated members of BPatch_flowGraph (#828)

This was deprecated in 71c302f in 2005. The code was commented out instead of being removed.

2 months agoUndeprecate mapped_object::getBaseAddress (#827)
Tim Haines [Sun, 30 Aug 2020 04:34:26 +0000 (23:34 -0500)]
Undeprecate mapped_object::getBaseAddress (#827)

This was deprecated in 8442d36 in 2005. No reason was given, and it's being used in dyninstAPI/src/dynProcess.C:669.

2 months agoRemove unused symtabAPI/doc/symtab-text.txt (#826)
Tim Haines [Sun, 30 Aug 2020 04:25:29 +0000 (23:25 -0500)]
Remove unused symtabAPI/doc/symtab-text.txt (#826)

This is no longer part of symtab's documentation. It was last updated in 2014.

2 months agoMake ~DynObject virtual (#813)
Tim Haines [Sun, 30 Aug 2020 04:08:23 +0000 (23:08 -0500)]
Make ~DynObject virtual (#813)

This is base class for dyninstAPI/mapped_object, so it should have a
virtual destructor.

2 months agoRemove cotire (#816)
Tim Haines [Sun, 30 Aug 2020 00:05:35 +0000 (19:05 -0500)]
Remove cotire (#816)

Versions 9.3.x used cotire, but have no knob to turn it off. Cotire has
no real use for one-time builds and can break parallel builds with both
static and shared libs.

2 months agoFix cmake configuration with -pie (#817)
Stan Cox [Sat, 29 Aug 2020 22:12:32 +0000 (18:12 -0400)]
Fix cmake configuration with -pie (#817)

Remove DYNINST_RT_CMAKE_C_FLAGS which causes a mismatch when configuring dyninstAPI_RT with -pie

3 months agoFix memory leak in SymEval::expandInsn (#793)
Tim Haines [Tue, 25 Aug 2020 04:14:24 +0000 (23:14 -0500)]
Fix memory leak in SymEval::expandInsn (#793)

This was originally part of https://github.com/dyninst/dyninst/pull/317

3 months agoRemove usage of miniTramp class (#801)
Tim Haines [Fri, 21 Aug 2020 08:22:26 +0000 (03:22 -0500)]
Remove usage of miniTramp class (#801)

It was removed by 0bc3980d1 in 2011.

3 months agoFix aliasing bug of Region::buffer on copy (#791)
Tim Haines [Thu, 20 Aug 2020 19:37:51 +0000 (14:37 -0500)]
Fix aliasing bug of Region::buffer on copy (#791)

The buffer is just a scratch space for doing work, and should not be
shared between Region objects.

3 months agoAdd include for Elf_X in emitElf.h (#790)
Tim Haines [Thu, 20 Aug 2020 08:32:59 +0000 (03:32 -0500)]
Add include for Elf_X in emitElf.h (#790)

This is transitively included (somehow), but it's best to include it
directly both for completeness and for IDEs.

3 months agoClean up some includes (#796)
Tim Haines [Sun, 16 Aug 2020 20:48:44 +0000 (15:48 -0500)]
Clean up some includes (#796)

This was originally part of https://github.com/dyninst/dyninst/pull/317

3 months agoCleanup memory handling when emitting Elf for static libraries (#789)
Tim Haines [Sun, 16 Aug 2020 05:17:45 +0000 (00:17 -0500)]
Cleanup memory handling when emitting Elf for static libraries (#789)

This was originally part of https://github.com/dyninst/dyninst/pull/317

3 months agoUpdate Dyninst version in shared.cmake (#799) v10.2.0
Tim Haines [Fri, 14 Aug 2020 06:48:46 +0000 (01:48 -0500)]
Update Dyninst version in shared.cmake (#799)

3 months agoUpdate CHANGELOG for 10.2 release (#798)
Tim Haines [Fri, 14 Aug 2020 06:48:24 +0000 (01:48 -0500)]
Update CHANGELOG for 10.2 release (#798)

3 months agoDocumentation update for 10.2 Release (#788)
Tim Haines [Fri, 31 Jul 2020 23:15:54 +0000 (18:15 -0500)]
Documentation update for 10.2 Release (#788)

3 months 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 months 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 months 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.

3 months 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.

4 months 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.

4 months 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.

4 months 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'

4 months 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.

4 months 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

4 months 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)

5 months 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.

5 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)

5 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.

5 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>
5 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

5 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>
5 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

7 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)

7 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>
7 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.

7 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.

8 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

8 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.

8 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

9 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>
10 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

10 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>
12 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)

12 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)

12 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)

12 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.

12 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

12 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)

12 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.

12 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)