dyninst.git
2 years ago1. Fix x86-64 codegen for binary operators with 64-bit imm values
Xiaozhu Meng [Fri, 26 Oct 2018 17:06:36 +0000 (12:06 -0500)]
1. Fix x86-64 codegen for binary operators with 64-bit imm values

2. When decoding floating point instructions on x86-64, the address size
override prefix means 64-bit address size rather than 16-bit

3. Fix a linking problem of examples

4. Do not use negative values when reading jump tables

2 years agoAdding USE_OpenMP to cmake files;
Sasha Nicolas [Thu, 25 Oct 2018 21:42:30 +0000 (16:42 -0500)]
Adding USE_OpenMP to cmake files;
Adding MD5 to verify downloaded file;
Removing compiler restriction.

2 years agoMerge pull request #488 from dyninst/new-parallel-parsing
Xiaozhu Meng [Thu, 25 Oct 2018 20:38:02 +0000 (15:38 -0500)]
Merge pull request #488 from dyninst/new-parallel-parsing

Merge parallel code parsing

2 years agoMerge branch 'master' into new-parallel-parsing 488/head
Xiaozhu Meng [Thu, 25 Oct 2018 20:35:09 +0000 (15:35 -0500)]
Merge branch 'master' into new-parallel-parsing

Rmove setting function ret status during finalizing

Conflicts:
cmake/packages.cmake
examples/CMakeLists.txt
instructionAPI/src/power_opcode_tables.C

2 years ago1. Fix inconsistent block splits
Xiaozhu Meng [Thu, 25 Oct 2018 14:06:21 +0000 (09:06 -0500)]
1. Fix inconsistent block splits

2. Fix non-returning function analysis for PLT stubs, where a PLT stub
   may first be set to RETURN and then set to NORETURN.

3. When parsing call fallthrough edge, the corresponding call edge may
   still point to sink (not handled yet), which causes the code to
   believe it is an indirect call. So, change the code to look up callee
   by using the callee entry address.

2 years agoMerge pull request #496 from LER0ever/code.rongyi.io/LER0ever/Dyninst/build-fixes
Xiaozhu Meng [Wed, 24 Oct 2018 18:55:50 +0000 (13:55 -0500)]
Merge pull request #496 from LER0ever/code.rongyi.io/LER0ever/Dyninst/build-fixes

Build fixes for parallel building and xdr-related issues

2 years agoMerge pull request #498 from dyninst/power_vector
Xiaozhu Meng [Wed, 24 Oct 2018 15:08:11 +0000 (10:08 -0500)]
Merge pull request #498 from dyninst/power_vector

Vector instruction support on Power and recycled opcode

2 years agoFinish most of the Power 8 VSX instruction decoding 498/head
Xiaozhu Meng [Wed, 24 Oct 2018 12:55:26 +0000 (07:55 -0500)]
Finish most of the Power 8 VSX instruction decoding

2 years agoModifying cmake configuration to compile and install TBB.
Sasha Nicolas [Wed, 24 Oct 2018 01:36:57 +0000 (20:36 -0500)]
Modifying cmake configuration to compile and install TBB.

2 years ago10/23
Yuhan Xie [Tue, 23 Oct 2018 20:23:08 +0000 (15:23 -0500)]
10/23
Chapter 6

new:
    keyword CY, 21th bit
    keyword ST, 16th bit
    keyword SIX, 17-20
    keyword DRM, 18-20
    keyword RM, 19-20
    (ST and SIX always show up together)
    keyword PS, 22th bit

Summary of Changable fields:
UIM:
11-15:
   4-906 vctuxs,
   4-970 vctsxs,

  12-15:
     4-524 vspltb
     4-525 vextractub
     4-589 vextractuh
     4-653 vextractuw
     4-717 vextractd
     4-781 vinsertb
     4-845 vinserth
     4-909 vinsertw
     4-973 vinsertd

4-588 vsplth 13-15

4-652 vspltw 14-15

Rc bit:
  for opcode 4: always 21th bit

6-bit(26-31) ext opcode for opcode 4:
   32-47, 59-63

2 years agoMerge branch 'master' into new-parallel-parsing
Xiaozhu Meng [Sun, 21 Oct 2018 22:57:45 +0000 (17:57 -0500)]
Merge branch 'master' into new-parallel-parsing

2 years agoAdding multiple items for Power 8 instruction decoding
Xiaozhu Meng [Fri, 19 Oct 2018 16:21:40 +0000 (11:21 -0500)]
Adding multiple items for Power 8 instruction decoding

1. VSR registers
2. Decoding for several operand fields
3. Decoding for extended op 60

2 years agoRemove an edge check that caused significant slowdown
Xiaozhu Meng [Thu, 18 Oct 2018 21:55:26 +0000 (16:55 -0500)]
Remove an edge check that caused significant slowdown

2 years ago10/18 Opcode from Chapter 6
Yuhan Xie [Thu, 18 Oct 2018 20:43:46 +0000 (15:43 -0500)]
10/18 Opcode from Chapter 6

Summary of Changable fields:
  UIM:
  12-15:
4-524 vspltb
4-525 vextractub
4-589 vextractuh
4-653 vextractuw
4-717 vextractd
4-781 vinsertb
4-845 vinserth
4-909 vinsertw
4-973 vinsertd
13-15:
4-588 vsplth
    14-15:
4-652 vspltw

  Rc bit:
for opcode 4: always 21th bit

ext opcode for opcode 4:
    26-31: 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 59, 60, 61, 62, 63

new:
  Keyword SIM, 11-15 bits
    Keyword SHB, 22-25 bits
third-level opcode: 4-1538-x

2 years agoStart to integrate new power opcodes
Xiaozhu Meng [Thu, 18 Oct 2018 16:57:24 +0000 (11:57 -0500)]
Start to integrate new power opcodes

2 years agoFixing regression in some tests caused by misplaced directive.
Sasha Nicolas [Thu, 18 Oct 2018 01:21:39 +0000 (20:21 -0500)]
Fixing regression in some tests caused by misplaced directive.

2 years agocmake: fix msvc complaints about target dependency 496/head
LER0ever [Wed, 17 Oct 2018 23:34:20 +0000 (18:34 -0500)]
cmake: fix msvc complaints about target dependency

2 years agocmake: add conditional check for whether we are building boost
LER0ever [Wed, 17 Oct 2018 23:10:40 +0000 (18:10 -0500)]
cmake: add conditional check for whether we are building boost

2 years agocmake: add boost to all dyninst libraries and DyninstRT, fixes parallel building
LER0ever [Wed, 17 Oct 2018 22:54:10 +0000 (17:54 -0500)]
cmake: add boost to all dyninst libraries and DyninstRT, fixes parallel building

2 years agoUpdate ABI.C
melsabagh-kw [Tue, 9 Jan 2018 16:40:49 +0000 (11:40 -0500)]
Update ABI.C

ebx is callee-saved and should not be set in `callWritten_`.
(cherry picked from commit 6537dafa476375bbfbaa3b0149cc4d27b59b80f7)

2 years ago1. Fix typos in the Power instruction decoding table and add
Xiaozhu Meng [Wed, 17 Oct 2018 14:31:10 +0000 (09:31 -0500)]
1. Fix typos in the Power instruction decoding table and add
   instruction semantics for rldicl

2. When pushing new parse work elements into the work queue,
   we cannot get the source address of the edge from Block::last(),
   because we currently do not hold an accessor to the block end
   and the block can be split. So, before adding new work elements,
   first acquire an accessor to the block end

2 years agoA block can be split between it is just recorded in the block end
Xiaozhu Meng [Tue, 16 Oct 2018 20:23:53 +0000 (15:23 -0500)]
A block can be split between it is just recorded in the block end
map and adding out-going edge work elements. This means Block::end()
and Block::last() are not reliable when adding parsing work elements.
Change them to use IA_IAPI::getAddr(), which is a local object.

2 years ago10/16 Revision of instructions in Chapter 7
Yuhan Xie [Tue, 16 Oct 2018 19:45:22 +0000 (14:45 -0500)]
10/16 Revision of instructions in Chapter 7

Implementation Notes:
  1. For opcode 57, 58, ext opcode resides in 30-31 bit.
  2. For opcode 61 (111101), the ext opcode resides in 29-31 bit or 30-31 bit,
     depending on whether 30-31 bit is 01. (Manual page 1194)
  3. For the instructions with RMC and R, R is always at the 15th bit.
  4. For opcode 60, the Rc bit is at the 21th bit.

new:
  - Flag bit EX (31th bit), (P634)

left to be entered:
  - stv(P492) & stxv(P507) , with DQ(RA) pattern.
  - In opcode 60, two with XX3 format and 3 arbitrary bits and one with XX4 format.

2 years ago10/16 Revision of instructions in Chapter 7
Yuhan Xie [Tue, 16 Oct 2018 19:44:20 +0000 (14:44 -0500)]
10/16 Revision of instructions in Chapter 7

Implementation Notes:
  1. For opcode 57, 58, ext opcode resides in 30-31 bit.
  2. For opcode 61 (111101), the ext opcode resides in 29-31 bit or 30-31 bit,
     depending on whether 30-31 bit is 01. (Manual page 1194)
  3. For the instructions with RMC and R, R is always at the 15th bit.
  4. For opcode 60, the Rc bit is at the 21th bit.

new:
  - Flag bit EX (31th bit), (P634)

left to be entered:
  - stv(P492) & stxv(P507) , with DQ(RA) pattern.
  - In opcode 60, two with XX3 format and 3 arbitrary bits and one with XX4 format.

2 years agoThe power instruction decoding tables are declared as std::map.
Xiaozhu Meng [Tue, 16 Oct 2018 19:22:43 +0000 (14:22 -0500)]
The power instruction decoding tables are declared as std::map.
Currently, we use the [] operator to access entries in the table.
While the tables are mostly read-only, when we encounter instructions
that are not in the table. The [] operator may create new entries
and cause crashes. Therefore, change all accesses from [] operation
to use find() method.

2 years ago1. Use a new tbb::concurrent_hash_map to record block end.
Xiaozhu Meng [Tue, 16 Oct 2018 19:17:30 +0000 (14:17 -0500)]
1. Use a new tbb::concurrent_hash_map to record block end.
   In addition, when adding out-going edges to a block, we
   first query the block end hash map to get the accessor
   to the block. When splitting the block, we also first
   query the block end hash map to get the access to the block.
   tbb::concurrent_hash_map provides implicit read-write lock
   through the accessor. Therefore, we enforce that adding
   out-going edges are not going to be concurrent with block split.

2. Add a bunch of asserts that check edge consistency. This is
   for debug purpose and will be removed later

2 years agoRemoving function defition without declaration.
Sasha @poman [Tue, 16 Oct 2018 17:09:21 +0000 (12:09 -0500)]
Removing function defition without declaration.

2 years agocmake: use latest binutils, restrict libelf to >=0.173
LER0ever [Mon, 15 Oct 2018 02:55:26 +0000 (21:55 -0500)]
cmake: use latest binutils, restrict libelf to >=0.173
older binutils won't recognize Fedora 25 AArch64
older libelf does not have the "dwarf_next_line" function

2 years agoheaders: delete all xdr related code
LER0ever [Mon, 15 Oct 2018 02:54:27 +0000 (21:54 -0500)]
headers: delete all xdr related code

2 years agoNote for implementation added, XX3 formants in opcode 60 revised, new opcodes added
Yuhan Xie [Thu, 11 Oct 2018 23:08:46 +0000 (18:08 -0500)]
Note for implementation added, XX3 formants in opcode 60 revised, new opcodes added

Revised:
  - opcode with XX3 formats: extended opcode are expanded from 21-28 to 21-29,
with last bit treated as 0 and 1 respectively
  - The instructions with Rc bits, included Rc in the extended opcode,
treated the instructions with Rc=0 and Rc=1 as different opcodes.

new:
-xvtstdcdp (P760): DCMX field is chopped into 3 parts. May be a special case in implementation.
-**new Keyword: UIM:
   field 12-15 immediate field (xxextractuw,xxinsertw (P766))
   field 14-15 immediate field (xxspltw (P774))
  //I think UIM should be modified to a certain expression to show what exact bits are for UIM
-new Keyword: SHW:
   field 22-23 specify a shift amount in words
   skipped:
    -xxpermdi (P773), three arbitrary digits
    -xxsel (P773), XX4 form
    -xxsldwi (P774), three arbitrary digits

2 years agoAttempting to remove sink edges causes weird side effects on memory usages.
Xiaozhu Meng [Thu, 11 Oct 2018 14:16:37 +0000 (09:16 -0500)]
Attempting to remove sink edges causes weird side effects on memory usages.
Remove related code.

2 years agoFix typos in fix-point analysis for jump tables and remove sink edges when finding...
Xiaozhu Meng [Wed, 10 Oct 2018 18:54:05 +0000 (13:54 -0500)]
Fix typos in fix-point analysis for jump tables and remove sink edges when finding new edges

2 years agoA few fixes for non-returning function analysis
Xiaozhu Meng [Wed, 10 Oct 2018 15:27:11 +0000 (10:27 -0500)]
A few fixes for non-returning function analysis

1. We determine cycle by only checking the number delayed frames.
   Change it to check whether the set of delayed frames stays the same.
   This change may not be necessary, but it is safer

2. Enforce the correct order for checking function status when
   dealing with tail calls and shared code. The common code is moved
   to a new function Parser::update_function_ret_status.

   The return status starts with UNSET, and increases to RETURN, and maybe NORETURN
   Once it is RETURN or NORETURN, it will not go back to UNSET.

   Therefore, it is crucial for the following if statements to be the right order:
   First check the smaller values, and then check the larger values.

   Consider that if we reverse the order. So the code looks like
   1) if (other_func->retstatus() == RETURN) {
          ....
   2) }  else if (other_func->retstatus() == UNSET) {
          ....
      }

   In such code structure, at line 1), the other_func can be in UNSET, so the check fails.
   Concurrently, the other_func can be immediately set to RETURN, making the check at
   line 2) failing. So, the frame.func is neither delayed, nor updates its return status
   to RETURN, which can lead to wrong NORETURN status.

2 years ago1. Change the DYNINST_DEBUG_PARSING from a flag to a debug log name prefix.
Xiaozhu Meng [Tue, 9 Oct 2018 18:52:28 +0000 (13:52 -0500)]
1. Change the DYNINST_DEBUG_PARSING from a flag to a debug log name prefix.
   In parallel parsing, we need different threads to output to different files

2. Change the jump table analysis to eliminate non-determinisitic behaviors
2.1. Do not rely on the order of node in slice
2.2. Add a fix-point analysis to allow jump table analysis to redo analysis,
     discover new out-going edges due to new in-cominging edges, and continue
     parsing

2 years agoMerge branch 'master' into arm64/feature/relocation 367/head
Sasha Nicolas [Fri, 5 Oct 2018 22:40:31 +0000 (17:40 -0500)]
Merge branch 'master' into arm64/feature/relocation

2 years agoFixing update of defined registers after baseTramp is generated.
Sasha @leela [Fri, 5 Oct 2018 22:33:23 +0000 (17:33 -0500)]
Fixing update of defined registers after baseTramp is generated.

During generation of the baseTramp, registers are marked as defined
in the codeGen object, and after that we need to get this info in
order to verify whether we should perform optimizations or regenerate
the baseTramp.

2 years agobuild: move file copying to install phase
LER0ever [Fri, 5 Oct 2018 22:03:15 +0000 (17:03 -0500)]
build: move file copying to install phase

2 years agogitignore: add cmake shadow build directories
LER0ever [Fri, 5 Oct 2018 22:02:52 +0000 (17:02 -0500)]
gitignore: add cmake shadow build directories

2 years agoMinor fixes to FP Stack Unwinding through Inst Frames
Benjamin Welton [Thu, 4 Oct 2018 21:43:11 +0000 (16:43 -0500)]
Minor fixes to FP Stack Unwinding through Inst Frames

Minor fixes to stack unwinding through instrimentation (applies to First Party stackwalker only).

Added additional comments to the walker to detail how it functions more clearly and what it is looking for to
accept a stack frame.

2 years agoMerge branch 'master' of github.com:dyninst/dyninst
Benjamin Welton [Wed, 3 Oct 2018 22:38:38 +0000 (17:38 -0500)]
Merge branch 'master' of github.com:dyninst/dyninst

2 years agoModification to x86 emitter to support SW out of inst frames.
Benjamin Welton [Thu, 12 Apr 2018 17:32:31 +0000 (12:32 -0500)]
Modification to x86 emitter to support SW out of inst frames.

This patch contains changes to the emitter to support first party stackwalking out of inst's frames. For inst frames to be walkable, instrimentation frames must be enabled.

The following changes were made to support this:

- Insertion of the previous SP into the stack at a known location (2 slots above the FP).
- Insertion of a special word into the stack such that stackwalker can easily identify that this frame is an inst frame (and to select the correct walker). BEEFDEAD is located at +1 slot away from FP.
- The poping of these values from the stack at frame teardown.
- Fixes to the emitter to use scratch registers where hard coded ones were present before.

Total performance impact of this patch is an extra 5 instruction. 3 on frame creation, 2 on destruction.

2 years agoNew walker to walk out of Instrimentation Frames FP
Benjamin Welton [Thu, 12 Apr 2018 17:58:17 +0000 (12:58 -0500)]
New walker to walk out of Instrimentation Frames FP

This patch contains a new walker that can walk out of inst frames in first party stackwalking mode.

For this to work, the emitter fixes located in pull request #451 must be applied. The walker itself creates
a Stackwalker frame based on the information saved by the emitter.

2 years agoMerge pull request #452 from bwelton/sw_instFrameWalker
Benjamin Welton [Tue, 2 Oct 2018 21:43:38 +0000 (16:43 -0500)]
Merge pull request #452 from bwelton/sw_instFrameWalker

New walker to walk out of Instrumentation Frames first party. Build and test suite passes (x64, ubuntu)

2 years agoOpcode conflict detected, new opcodes added
Yuhan Xie [Tue, 2 Oct 2018 21:26:08 +0000 (16:26 -0500)]
Opcode conflict detected, new opcodes added

p576-690(include but skipped)

skipped:

  -xsrqpi & xsrqpix, P634, two instructions sharing the same opcode, differentiated by EX bit
  -xssqrtsp, P644, xssqrtsp has the exact same opcode with xscmpgtdp (P526)
  -xvcmpgtdp, P668, has exact the same opcode with xsrdpic(P628)
  -xvcmpgtsp, P670, has exact the same opcode with xssqrtdp(P641)
  -xvcvspsxws, P686, has exact the same opcode with xsminjdp(P589)
  -xvcvspuxws, P690, has exact the same opcode with xsmincdp(P587)

new keywords included:
  -P653, included DCMX
  -P636, included RMC, two bit from 21th, always companied with an R bit in the 15th bit.
  -new third level opcode 60-475

2 years agoMerge pull request #460 from bwelton/inst_fix
Benjamin Welton [Tue, 2 Oct 2018 17:05:00 +0000 (12:05 -0500)]
Merge pull request #460 from bwelton/inst_fix

Fix for crashing on relocating at unistrumentable points. Fix checks whether a parameter is NULL or not, if it is NULL it does not perform the instrumentation.

2 years agoMore fixes for removing duplicated edges and wrong edges.
Xiaozhu Meng [Tue, 2 Oct 2018 16:56:01 +0000 (11:56 -0500)]
More fixes for removing duplicated edges and wrong edges.

1. A thread may attempt to parse an address for edges multiple times
   when there are overlapping instructions. Handle this case to ensure
   that each address is parsed for edges once. This fix remove duplicated
   edges.

2. Fix moving edges during block split, which caused wrong edges.
   The block split during parsing and the consistent block split
   during finalizing should use the same algorithm described below:

     * We move outgoing edges from block A to block B, which is
     * necessary when spliting blocks.
     * The start of block B should be consistent with block A.
     * There are three cases:
     *
     * Case 1: the end of A and B are the same
     *         A :  [     ]
     *         B :     [  ]
     *         In such case, we can directly move the edges from A to B
     *
     * Case 2: block A contains block B
     *         A :  [          ]
     *         B :      [    ]
     *    edge_b :            []
     *         In this case, the outgoing edges of A should not be moved to B.
     *         Instead, we need to follow the fallthrough edge of B to find a
     *         block (edge_b), which ends at same location as A. We then move
     *         outgoing edges of A to edge_b.
     * Case 3: End of A is smaller than the end of B
     *         A : [        ]
     *         B :      [       ]
     *         In this case, the outgoing edges of A should only contain a
     *         fallthrough edge (otherwise, B's end will the same as A).
     *         We remove this fall through edge for now and we will add the
     *         edge back in finalizing.
     *

   The same algorithm description is also documented in function
   Parser::move_edges_consistent_blocks(Block *A, Block *B) in parseAPI/src/Parser.C

2 years agoImplementing BPatch_xor for ARMv8.
Sasha @leela [Fri, 28 Sep 2018 21:47:57 +0000 (16:47 -0500)]
Implementing BPatch_xor for ARMv8.

2 years agoImplementing BPatch_xor for POWER.
Sasha @poman [Fri, 28 Sep 2018 21:32:28 +0000 (16:32 -0500)]
Implementing BPatch_xor for POWER.

2 years ago09/27/2018 New opcodes added
Yuhan Xie [Thu, 27 Sep 2018 21:11:31 +0000 (16:11 -0500)]
09/27/2018 New opcodes added

p523-576(not including p576)

skipped:
nothing

new:
  -third level opcodes: 60-347-(16/17), 63-804-(0), 63-836-(1/2/9/10/17/20/22/25
  -new extended opcodes (opcode 60/61/63), added on 09/25 but was not included in the last log.
  -new keyword included: VRS
  -lxvx: page 492, two entries for this instruction(a slash inside the extened opcode).31-268 & 31-300

2 years ago09/27/2018 New opcodes added
Yuhan Xie [Thu, 27 Sep 2018 21:02:58 +0000 (16:02 -0500)]
09/27/2018 New opcodes added

p523-576(not including p576)

skipped:
nothing

new:
  -third level opcodes: 60-347-(16/17), 63-804-(0), 63-836-(1/2/9/10/17/20/22/25
  -new extended opcodes (opcode 60/61/63), added on 09/25 but was not included in the last log.
  -new keyword included: VRS
  -lxvx: page 492, a slash inside the extened opcode.two entries in the opcode table are included: 31-268 & 31-300

2 years ago09/25
Yuhan Xie [Tue, 25 Sep 2018 22:05:48 +0000 (17:05 -0500)]
09/25

p492-523(not including p523)
skipped: lxv (P492, new keyword DQ; TX not at the last bit),
         lxvx (P492, a slash in the memory map and two numbers are included)
 stxsd (P498, new keyword VRS, stands for VSR[VSR+32].dword[0])
 stxssp (P501, VRS)
 stxv (P507, new keyword DQ)
 xsabsqp (P512, 0 in it)

new keywords included:

-included new keywords "XS", it should be the storing version of "XT")
-included XA, XB (page 512 of manual, using the same pattern as RA, RB but XA and XB are for VSR, and there are AX & BX bits at the end of the instruction)
-included VRA, VRB (page 520 of manual)

Additional:
--xsaddqp and xsaddqpo are sharing the same opcode, treated it as frsp and frsp.(page 520 of manual)

2 years agoMerge branch 'power_vector' of github.com:dyninst/dyninst into power_vector
Yuhan Xie [Tue, 25 Sep 2018 22:03:53 +0000 (17:03 -0500)]
Merge branch 'power_vector' of github.com:dyninst/dyninst into power_vector

2 years ago09/25
Yuhan Xie [Tue, 25 Sep 2018 19:56:35 +0000 (14:56 -0500)]
09/25

p492-523(not including p523)
skipped: lxv (P492, new keyword DQ; TX not at the last bit),
         lxvx (P492, a slash in the memory map and two numbers are included)
 stxsd (P498, new keyword VRS, stands for VSR[VSR+32].dword[0])
 stxssp (P501, VRS)
 stxv (P507, new keyword DQ)
 xsabsqp (P512, 0 in it)

new keywords included:

-included new keywords "XS", it should be the storing version of "XT")
-included XA, XB (page 512 of manual, using the same pattern as RA, RB but XA and XB are for VSR, and there are AX & BX bits at the end of the instruction)
-included VRA, VRB (page 520 of manual)

Additional:
--xsaddqp and xsaddqpo are sharing the same opcode, treated it as frsp and frsp.(page 520 of manual)

2 years agoP492-523
Yuhan Xie [Tue, 25 Sep 2018 19:56:35 +0000 (14:56 -0500)]
P492-523

2 years agoSeparate debug info file issue fixed.
Sasha Nicolas [Mon, 24 Sep 2018 22:59:03 +0000 (17:59 -0500)]
Separate debug info file issue fixed.
A DwarfFrameParser object was not being created in the case of separate
debug info file, because libdw does not create Dwarf handles to files
that contain only .eh_frame section without .debug_*. This was causing
AST variable node to assert because the local variables did not get
location list, since .eh_frame reference was never saved for lookup.
The solution was to create a DwarfFrameParser saving not only a possible
Dwarf handle but also an Elf reference, since the .eh_frame section will
be in the main stripped binary, while the Dwarf handle will point to
the separate debug file.

2 years agoContinue to fix non-deterministic behaviors of parallel parsing
Xiaozhu Meng [Sun, 23 Sep 2018 15:03:59 +0000 (10:03 -0500)]
Continue to fix non-deterministic behaviors of parallel parsing

1. Force two rules to simplify the interactions between threads
1.A. Each basic block should be parsed and created only by one thread.
1.B. Each edge should be parsed and created only by one thread. To do
     this, we add edges source address into the ParseWorkElem. We also
     need to adjust non-returning function analysis because only one
     of shared functions will continue parsing and have the return
     status. All other functions should be delayed and wait for the
     winning function to finish parsing

These two rules ensure that we do not need a large critical section
 when we look for the correct source block of an edge during parsing
(See 2 for more detail)

2. When parsing an edge, the source block of the edge could have
   been split by the same thread. We need to follow the fallthrough
   edge to find the correct Block object that contains the edge.

   The two rules above ensure that the source block would not be
   split by a different thread, thus we do not need to build a
   large critical for when following the fall-through edges.

3. At finalizing time, fix the block spliting implementiation
   caused by functions sharing code. During parallel parsing,
   there is no range lookup because building a range lookup
   would cause mutual exclusion for threads. So, during parallel
   parsing, we only split blocks within a thread. For functions
   sharing code, this means overlapping blocks in separate functions.

2 years agoMerge branch 'master' into arm64/feature/relocation
Sasha @leela [Thu, 20 Sep 2018 23:24:43 +0000 (18:24 -0500)]
Merge branch 'master' into arm64/feature/relocation

2 years agoadded power operations, stopped on pg491 of the manual page, lxvll
Yuhan Xie [Thu, 20 Sep 2018 21:31:31 +0000 (16:31 -0500)]
added power operations, stopped on pg491 of the manual page, lxvll

2 years agoTemplate for adding instructions
Benjamin Welton [Thu, 20 Sep 2018 19:54:53 +0000 (14:54 -0500)]
Template for adding instructions

2 years agoFix TOC location identificaiton for PowerPC
Xiaozhu Meng [Tue, 18 Sep 2018 20:45:58 +0000 (15:45 -0500)]
Fix TOC location identificaiton for PowerPC

2 years ago1. Need to invalidate the cache before finalizing a function
Xiaozhu Meng [Tue, 18 Sep 2018 16:43:08 +0000 (11:43 -0500)]
1. Need to invalidate the cache before finalizing a function

2. Block range lookup is not ready to use during parsing. When we
   delay parsing jumps, the block that contains the indirect jump
   may be split when we actually parse the indirect jump. We need
   to follow fall thourgh edge to find the latest block that has
   the indirect jump

3. When decoding instructions during jump table analysis, we should
   use CodeRegion to get raw bytes, which handles overlapping regions
   correctly. Overlapping regions can happen for .a file

2 years agoHandle non-deterministic CFG edges.
Xiaozhu Meng [Fri, 14 Sep 2018 21:20:21 +0000 (16:20 -0500)]
Handle non-deterministic CFG edges.

1. During spliting blocks, only move edges when we created a new block.

2. The tail call heuristic says if the block is a function entry and the
   entry blocks contains only one jump instruction, the jump should be a
   tail call. This gives non-deterministic results when the entry is shared
   with other functions and one other functions parse the block first. Fix
   this in function finalizing

2 years ago1. Do not promote individual flag bits such as ZF to the full flag register
Xiaozhu Meng [Fri, 14 Sep 2018 19:23:58 +0000 (14:23 -0500)]
1. Do not promote individual flag bits such as ZF to the full flag register
   when converting InstructionAPI::Instruction to Assignment. Jump table
   analysis checks zero flags.

2. When parsing a jump table, we use symbol table to trim out of range jump
   targets to remove bogus targets. When functions share code, we need to pick
   the symbol range that contains the indirect jump to do the trimming.

2 years agoFix typo: missed an "else" before an if statement
Xiaozhu Meng [Fri, 14 Sep 2018 16:44:16 +0000 (11:44 -0500)]
Fix typo: missed an "else" before an if statement

2 years agoTwo more fixes for parallel parsing
Xiaozhu Meng [Thu, 13 Sep 2018 18:18:41 +0000 (13:18 -0500)]
Two more fixes for parallel parsing

1. There is one reference to Block source edges that lacks locking

2. Only the function frame that creates a block should parse the block

2 years ago1. Re-implement the power preabmle identification code, instead of checking format...
Xiaozhu Meng [Wed, 12 Sep 2018 20:39:25 +0000 (15:39 -0500)]
1. Re-implement the power preabmle identification code, instead of checking format string,
   we directly check the first 2 bytes

2. Fix instruction mnemonic output on power 8

3. Call Function::finalize() to re-calculate function data

2 years agoParallel code parsing needs to record the function that creates a block.
Xiaozhu Meng [Tue, 11 Sep 2018 21:00:29 +0000 (16:00 -0500)]
Parallel code parsing needs to record the function that creates a block.

Adjust parse_block in dyninstAPI to this code change.

2 years agoMerge branch 'master' into new-parallel-parsing. Also make changes to
Xiaozhu Meng [Tue, 11 Sep 2018 17:58:11 +0000 (12:58 -0500)]
Merge branch 'master' into new-parallel-parsing. Also make changes to
fix compilation

2 years agoFix non-deterministic parallel parsing on POWER 8. The problems are 377/head
Xiaozhu Meng [Mon, 10 Sep 2018 21:58:15 +0000 (16:58 -0500)]
Fix non-deterministic parallel parsing on POWER 8. The problems are
mostly related to the new ABI, where each function has two entries.

1. Tail call heuristics need to find the function with a normal
   function name
2. A function having two entries cause many ParseAPI::Function to
   share code. This exposes issues in our non-returning function
   analysis.

   2.A. The two ParseAPI::Function should have the same return status.
        I just let one ParseAPI::Function delayed by the other.
   2.B. No longer use UNKNOWN status. UNKNOWN should just be RETURN
        as we do not know the control flow, so we should assume the
        function may return.

2 years agoadded arithExpr xor
van Hauser [Sat, 24 Mar 2018 12:46:06 +0000 (13:46 +0100)]
added arithExpr xor
(cherry picked from commit eee4b0740bb24e07581af453392220808ac0524c)

2 years agoMerge pull request #485 from dyninst/power8_instrumentation_fix
Xiaozhu Meng [Fri, 7 Sep 2018 16:26:45 +0000 (11:26 -0500)]
Merge pull request #485 from dyninst/power8_instrumentation_fix

Power8 instrumentation fix

2 years agoRemove debugging printf statement 485/head
Xiaozhu Meng [Fri, 7 Sep 2018 16:03:51 +0000 (11:03 -0500)]
Remove debugging printf statement

2 years agoThe fixes for power preamble should not be enabled on other platforms
Xiaozhu Meng [Fri, 7 Sep 2018 15:57:49 +0000 (10:57 -0500)]
The fixes for power preamble should not be enabled on other platforms
and suppress unncessary warning output

2 years agoSetting the default value of pointers encoding
Sasha Nicolas [Thu, 6 Sep 2018 22:14:20 +0000 (17:14 -0500)]
Setting the default value of pointers encoding
in a Frame Description Entry (FDE) to be DW_EH_PE_absptr.

2 years agoFix power rewriter mode
Xiaozhu Meng [Thu, 6 Sep 2018 18:55:58 +0000 (13:55 -0500)]
Fix power rewriter mode

1. there is no longer .opd section in Power 8 binaries. We used to derived TOC for each
   function based on .opd section. Such code is outdated.
2. Fix genearting calls to PLT on power. If the caller and the callee are not in the
   same object, we need a PLT call.
3. Fix getting the same scratch registers

2 years agoFix for test1_30:
Sasha Nicolas [Wed, 5 Sep 2018 17:51:41 +0000 (12:51 -0500)]
Fix for test1_30:
this test would show PASSED but in reality the return value of the
functions getAddressRanges either in BPatch_image or BPatch_module was
false, meaning the ranges weren't being found correctly.
It turns out that the comparison between filenames was wrong.
For this fix, StringTableEntry needed to be changed in other to store the filename
without the path, and thus allow StringTable boost::multi_index_container
to be indexed by "filename" and not only by "/path/filename".

2 years agoTwo more fixes for instrumentation on power. Now all tests in create and attach modes...
Xiaozhu Meng [Wed, 5 Sep 2018 17:49:52 +0000 (12:49 -0500)]
Two more fixes for instrumentation on power. Now all tests in create and attach modes are passing.

1. call site instrumentation point should return the real function rather than the targ function
2. loop tree node should not include targ functions as callee

2 years agoMore fixes for power instrumentation
Xiaozhu Meng [Wed, 5 Sep 2018 13:24:37 +0000 (08:24 -0500)]
More fixes for power instrumentation

1. Do not relocate the power preamble by skipping the first two instructions,
   instead of comparing addresses
2. RelocGraph indexes RelocBlock by block starting address rather than
   block_instance pointers
3. Function entry springboard is now using OffLimits springboard priority,
   as it should have a higher priority than block entry springboard.

2 years ago1. Copy Ben's fix for code gen on power
Xiaozhu Meng [Mon, 3 Sep 2018 17:09:45 +0000 (12:09 -0500)]
1. Copy Ben's fix for code gen on power
2. Make sure we skip the function preamble when genearting springboard
3. Reloc block now can be empty, so should not assert

2 years agoStart to make instrumentation on Power8 work.
Xiaozhu Meng [Thu, 30 Aug 2018 18:42:26 +0000 (13:42 -0500)]
Start to make instrumentation on Power8 work.

The first issue is about the new power ABI, where each function has two entries.
The inter-procedural entry has the function name and the intra-procedural entry
does not, and so is named as targXXXX. We do two things here:
1. We should not relocate targXXXX as it is essentially the same function as the inter-procedural one.
2. The inter-procedural entry contains two preamble to set up the value of r2 (TOC). We should
   not relocate these two instructions. So, when creating a RelocBlock for such entry, we skip
   the first two instructions.

The second issue is about generating long branches. This is related to springboard
and generating function call instrumentation (as function call on power is branch).
For calls, Ben introduces the uses of TAR register to store the target address. The
power manual says TAR register is reserved for system software. We will need to
revisit the use of TAR register. For long springboard, right now we cannot create an
instPoint to do liveness. So, long springboards are now done by traps.

2 years agoPower8 does not necessary have the .opd section
Xiaozhu Meng [Tue, 28 Aug 2018 14:50:15 +0000 (09:50 -0500)]
Power8 does not necessary have the .opd section

2 years agoFix typos for compilation
Xiaozhu Meng [Tue, 28 Aug 2018 03:01:21 +0000 (22:01 -0500)]
Fix typos for compilation

2 years agoAutomatically build boost_atomic
Xiaozhu Meng [Mon, 27 Aug 2018 23:40:24 +0000 (18:40 -0500)]
Automatically build boost_atomic

2 years agoThe instruction semantics code for push should consider different
Xiaozhu Meng [Mon, 27 Aug 2018 15:29:57 +0000 (10:29 -0500)]
The instruction semantics code for push should consider different
register sizes

2 years agoShould prefer CU level line info parsing over object level line info
Xiaozhu Meng [Fri, 24 Aug 2018 20:31:45 +0000 (15:31 -0500)]
Should prefer CU level line info parsing over object level line info
parsing when there is a seperate debug info file

2 years agoWhen the ".debug_info" section is not present, we do object level line
Xiaozhu Meng [Fri, 24 Aug 2018 16:45:22 +0000 (11:45 -0500)]
When the ".debug_info" section is not present, we do object level line
infomation parsing. However, when we iterate every module in the object,
we will re-parse the line information for the whole object. We should
just parse once and share the parsing results in different modules.

2 years agoFix wrong register operands in x86-64 instruction decoding
Xiaozhu Meng [Thu, 23 Aug 2018 15:51:29 +0000 (10:51 -0500)]
Fix wrong register operands in x86-64 instruction decoding

2 years agoAfter carefully comparing the parsing output of runs with different
Xiaozhu Meng [Thu, 23 Aug 2018 14:57:58 +0000 (09:57 -0500)]
After carefully comparing the parsing output of runs with different
numbers of threads and examining the debug logs, there are many issues:

1. During parallel parsing, we split a block when the block has an
incoming edge within the block range. However, we do not split a block
if the edge jumps into the block range of a block from another function.
So, at finalizing time, we should split such overlapped blocks. An
alternative here is to split a block from another function at parsing
time, which requires a global range lookup and will cause mutual
exclusion in parallel parsing.

2. The jump table analysis is not working properly for many reasons...
2.A. When generating Absloc, we should not bind SP or FP when stack
     analysis is not enabled. Otherwise, the default value for binding
     SP and FP is 0, causing wrong abstract locations.

2.B. Slicing should no longer use SingleContextOrInterproc because
     SingleContextOrInterproc relies on a complete function boundary,
     which is not the case when the jump table analysis invokes slicing.
     Slicing should just traverse all source edges and let the slicing
     predicate determine whether or not to follow interprocedural edges.

2.C. Slicing should treat tail calls as function calls rather than normal jumps.

2.D The jump table analysis needs to traverse the CFG from function entry.
    For blocks shared by multiple functions, the outgoing edges may be changed
    during the jump table analysis. So, we should make a copy of the outgoing
    edges before traversing and the copy operation should have locking. Here,
    an alternative is to lock the block during traversing, but I feel this
    alternative may cause too much lock contention.

2.E We should ignore CATCH edges because they do not represent real
    control flow.

2.F We should distinguish zero extend and sign extend memory reads.

2 years agoMerge pull request #463 from dyninst/vector_categories
Xiaozhu Meng [Wed, 22 Aug 2018 14:24:34 +0000 (09:24 -0500)]
Merge pull request #463 from dyninst/vector_categories

Vector categories merge into master

2 years ago1. The FULL register size must have value 0 due to the way we calculate 463/head
Xiaozhu Meng [Wed, 22 Aug 2018 00:59:44 +0000 (19:59 -0500)]
1. The FULL register size must have value 0 due to the way we calculate
base registers.
2. Update liveness for the value changes

2 years agoShould not trigger finalizing during slicing
Xiaozhu Meng [Tue, 14 Aug 2018 20:56:55 +0000 (15:56 -0500)]
Should not trigger finalizing during slicing

2 years agoThe register map should also be in TLS
Xiaozhu Meng [Mon, 6 Aug 2018 17:55:02 +0000 (12:55 -0500)]
The register map should also be in TLS

2 years agoFix undeterministic tail call identification results exposed in parallel code parsing
Xiaozhu Meng [Sun, 5 Aug 2018 18:15:33 +0000 (13:15 -0500)]
Fix undeterministic tail call identification results exposed in parallel code parsing

The tail call identification algorithm contains two related heuristics:
(1) A jump to a block within the same function is not a tail call
(2) A jump to a known entry point is a tail call

For (1), whether or not the jump target is within the current function depends on
the parsing order of other functions, especially the callee functions. To have a
consistent tail call identification results, I add a tail call cleaning phase in
the parsing finalizing phase. Because we already know the complete function
boundary at function finalizing time, we can rectify the bogus tail calls and
removed the functions caused by those bogus tail calls.

For (2), if a known entry point is created by a bogus tail call, (2) will lead to
more bogus tail calls. This is exposed by a special case. Suppose function A
contains multiple jumps to block B. Block B has no incoming edges from any other
function, nor does it has a symbol associated. So, B should be part of A. One of
the jump in A (denoted as J1) will be marked as tail call because it tears down
the stack frame before the jump, while other jumps (denoted as non-J1) will not
be marked as tail calls. If J1 is parsed before non-J1, block B will be marked as
a tail call entry, and all non-J1 will be marked as tail calls because they jump
to ``a known entry''. Function A will thus not contain B, and the rectify method
mentioned in the previous parapgraph will not work. So, I change to only mark a
jump as a tail call when the target is a hint.

2 years ago1. Replace std::atomic with boost::atomic so that gcc 4.8.5 can still compile dyninst
Xiaozhu Meng [Mon, 30 Jul 2018 18:49:44 +0000 (13:49 -0500)]
1. Replace std::atomic with boost::atomic so that gcc 4.8.5 can still compile dyninst
2. Only put pointers to thread local so that newer compilers can also compile __thread

2 years agoRemoving extra implementation of save/restore register.
Sasha @leela [Wed, 25 Jul 2018 21:21:30 +0000 (16:21 -0500)]
Removing extra implementation of save/restore register.
The goal is to eliminate fully EmitterAARCH64SaveRegs and EmitterAARCH64RestoreRegs,
but they are still being used at other parts.
This commit removes from these classes the function to save and restore register
and adapts insnCodeGen to do the work.

2 years agoadd debugging support to LineInformation
John Mellor-Crummey [Tue, 17 Oct 2017 17:22:44 +0000 (12:22 -0500)]
add debugging support to LineInformation

2 years agoadd debugging support to Symtab interface
John Mellor-Crummey [Tue, 17 Oct 2017 17:19:37 +0000 (12:19 -0500)]
add debugging support to Symtab interface

use new IBSTree dumping functionality to dump function and
module ranges.

2 years agoadd debugging support to IBSTree.h
John Mellor-Crummey [Tue, 17 Oct 2017 16:48:10 +0000 (11:48 -0500)]
add debugging support to IBSTree.h

2 years agocorrect dwarf debug printing
John Mellor-Crummey [Wed, 18 Oct 2017 15:48:34 +0000 (10:48 -0500)]
correct dwarf debug printing

in dwarfWalker::setFuncFromLowest, set the current function
before calling dwarf_printf so that curFunc() in the
dwarf_printf sees the function just found

(cherry picked from commit a786739e5369b79ff6823cf742042c9f2d874765)

2 years agoupdate line map reader based on dwarf_next_lines
John Mellor-Crummey [Sat, 30 Jun 2018 17:58:19 +0000 (12:58 -0500)]
update line map reader based on dwarf_next_lines

integrate changes in master's parseLineMapInfoForCU that
avoid missing line map entries into new line map parser
based on elfutils 0.173 that uses dwarf_next_lines for
binaries that lack a .debug_info section