I think instructionAPI (or maybe parseAPI) is broken in master branch
on ARM (aarch64). I'm seeing two problems. The small one is a spew
of error messages, "Instruction processing threw exception for
instruction: ldr X17, [X16 + 3c0]". The bigger one is raising an
abort.
I'm running this on leela inside Wisconsin CS. Dyninst master branch
as of today (Sept 12).
commit 69783ea9172db27d3fe14cf3f9d36c3fd84fb66f
Merge: da2da48 3402dc2
Author: Bill Williams <wwilliam47@xxxxxxxxx>
Date: Fri Sep 2 10:59:36 2016 -0500
Merge pull request #164 from dyninst/release9.2/fixes/jenkins-fix
CMake fixes for Cotire and GCC 4.4 compatibility
I have a unit test (parse.cpp) that calls Symtab::openFile() and
parseTypesNow() and then makes a CodeObject and calls parse(). Then,
the program iterates through every ParseAPI::Function, every basic
block and every instruction and prints the line map and inline
sequence for every instruction.
(1) The small problem is: running parse on a small, simple program,
(eg, itself), I get a spew of exceptions:
Instruction processing threw exception for instruction: ldr X17, [X16 + 878]
Instruction processing threw exception for instruction: ldr X17, [X16 + 7e0]
Instruction processing threw exception for instruction: ldr X17, [X16 + 840]
Instruction processing threw exception for instruction: ldr X17, [X16 + 808]
Instruction processing threw exception for instruction: ldr X17, [X16 + 800]
...
These seem to be coming from the PLT section in the binary.
0x800 = 2048, and 0x808 = 2056, etc.
0000000000401480 <_ZNSsC1EPKcRKSaIcE@plt>:
401480: b0000090 adrp x16, 412000 <__FRAME_END__+0xfbb0>
401484: f9440211 ldr x17, [x16,#2048]
401488: 91200210 add x16, x16, #0x800
40148c: d61f0220 br x17
0000000000401490 <__cxa_atexit@plt>:
401490: b0000090 adrp x16, 412000 <__FRAME_END__+0xfbb0>
401494: f9440611 ldr x17, [x16,#2056]
401498: 91202210 add x16, x16, #0x808
40149c: d61f0220 br x17
In this case, my unit test runs to completion, seems to produce valid
output and exits with code 0 (success).
However, the warnings suggest that something internal to instructionAPI
is unknown or unimplemented.
(2) Running parse on a larger, more complicated binary (eg, hpcstruct-bin)
triggers a sig abort.
$ ./parse hpcstruct-bin
Instruction processing threw exception for instruction: ldr X17, [X16 + d20]
Instruction processing threw exception for instruction: ldr X17, [X16 + 7e0]
Instruction processing threw exception for instruction: ldr X17, [X16 + bb0]
Instruction processing threw exception for instruction: ldr X17, [X16 + 640]
parse[19973] 0.00010s [FATAL]: not implemented yet:
parse[19973] 0.00032s [FATAL]:
/home/krentel/newarch/externals/symtabAPI/dyninst/dataflowAPI/rose/semantics/BaseSemantics2.C:695
parse[19973] 0.00103s [FATAL]: virtual
rose::BinaryAnalysis::InstructionSemantics2::BaseSemantics::SValuePtr
rose::BinaryAnalysis::InstructionSemantics2::BaseSemantics::Dispatcher::read(SgAsmExpression*,
size_t, size_t)
parse[19973] 0.00235s [FATAL]: SgAsmBinaryLsl
Aborted (core dumped)
(gdb) bt
#0 0x000003ff970c2d38 in raise () from /lib64/libc.so.6
#1 0x000003ff970c4aa8 in abort () from /lib64/libc.so.6
#2 0x000003ff97ad77d4 in Sawyer::Assert::fail
(mesg=mesg@entry=0x3ff97b759f0 "not implemented yet",
expr=expr@entry=0x0, note="SgAsmBinaryLsl",
filename=filename@entry=0x3ff97b7cec8
"/home/krentel/newarch/externals/symtabAPI/dyninst/dataflowAPI/rose/semantics/BaseSemantics2.C",
linenum=linenum@entry=695,
funcname=funcname@entry=0x3ff97b7ccd8
<rose::BinaryAnalysis::InstructionSemantics2::BaseSemantics::Dispatcher::read(SgAsmExpression*,
unsigned long, unsigned long)::__PRETTY_FUNCTION__> "virtual
rose::BinaryAnalysis::InstructionSemantics2::BaseSemantics::SValuePtr
rose::BinaryAnalysis::InstructionSemantics2::BaseSemantics::Dispatcher::read(SgAsmExpression*,
size_t, size_t)") at
/home/krentel/newarch/externals/symtabAPI/dyninst/dataflowAPI/rose/util/Assert.C:39
#3 0x000003ff97b00d04 in
rose::BinaryAnalysis::InstructionSemantics2::BaseSemantics::Dispatcher::read
(this=0x1b8c8330, e=0x155ffd20, value_nbits=32,
addr_nbits=<optimized out>) at
/home/krentel/newarch/externals/symtabAPI/dyninst/dataflowAPI/rose/semantics/BaseSemantics2.C:695
#4 0x000003ff97b0c924 in
rose::BinaryAnalysis::InstructionSemantics2::ARM64::IP_add_addsub_ext_execute::p
(this=<optimized out>, d=0x1b8c8330,
ops=0x1b8ac8d0, insn=<optimized out>, args=..., raw=2334173216)
at
/home/krentel/newarch/externals/symtabAPI/dyninst/dataflowAPI/rose/semantics/DispatcherARM64.C:216
#5 0x000003ff97b03484 in
rose::BinaryAnalysis::InstructionSemantics2::ARM64::InsnProcessor::process
(this=0x15ff8e50, dispatcher_=...,
insn_=<optimized out>) at
/home/krentel/newarch/externals/symtabAPI/dyninst/dataflowAPI/rose/semantics/DispatcherARM64.C:47
#6 0x000003ff97afeecc in
rose::BinaryAnalysis::InstructionSemantics2::BaseSemantics::Dispatcher::processInstruction
(this=0x1b8c8330, insn=0x15a64890)
at
/home/krentel/newarch/externals/symtabAPI/dyninst/dataflowAPI/rose/semantics/BaseSemantics2.C:460
#7 0x000003ff97a2503c in
Dyninst::DataflowAPI::SymbolicExpansion::expandAarch64
(rose_insn=rose_insn@entry=0x15a64890, ops=...,
insn_dump="add X0, X1, W0 << 2") at
/home/krentel/newarch/externals/symtabAPI/dyninst/dataflowAPI/src/SymbolicExpansion.C:90
#8 0x000003ff97abed38 in Dyninst::DataflowAPI::SymEval::expandInsn
(insn=..., addr=<optimized out>, res=std::map with 1 elements = {...})
at
/home/krentel/newarch/externals/symtabAPI/dyninst/dataflowAPI/src/SymEval.C:505
#9 0x000003ff97abfcc4 in Dyninst::DataflowAPI::SymEval::expand
(res=std::map with 1 elements = {...}, failedInsns=std::set with 0
elements,
applyVisitors=applyVisitors@entry=false) at
/home/krentel/newarch/externals/symtabAPI/dyninst/dataflowAPI/src/SymEval.C:94
#10 0x000003ff97abff74 in Dyninst::DataflowAPI::SymEval::expand
(assignment=..., applyVisitors=applyVisitors@entry=false)
at
/home/krentel/newarch/externals/symtabAPI/dyninst/dataflowAPI/src/SymEval.C:75
#11 0x000003ff9798ac30 in JumpTablePred::ExpandAssignment
(this=this@entry=0x3ffc34a97d0, assign=...)
at
/home/krentel/newarch/externals/symtabAPI/dyninst/parseAPI/src/JumpTablePred.C:401
#12 0x000003ff9798e574 in JumpTablePred::addNodeCallback
(this=0x3ffc34a97d0, ap=..., visitedEdges=std::set with 0 elements)
at
/home/krentel/newarch/externals/symtabAPI/dyninst/parseAPI/src/JumpTablePred.C:192
#13 0x000003ff979f1190 in Dyninst::Slicer::updateAndLink
(this=this@entry=0x3ffc34a99c0, g=...,
dir=dir@entry=Dyninst::Slicer::backward, cand=...,
cache=..., p=...) at
/home/krentel/newarch/externals/symtabAPI/dyninst/dataflowAPI/src/slicing.C:398
#14 0x000003ff979f1fe0 in Dyninst::Slicer::sliceInternalAux
(this=this@entry=0x3ffc34a99c0, g=...,
dir=dir@entry=Dyninst::Slicer::backward, p=..., cand=...,
skip=skip@entry=false, visited=std::map with 1 elements = {...},
singleCache=std::map with 2 elements = {...}, cache=std::map with 0
elements)
at
/home/krentel/newarch/externals/symtabAPI/dyninst/dataflowAPI/src/slicing.C:231
#15 0x000003ff979f266c in Dyninst::Slicer::sliceInternalAux
(this=this@entry=0x3ffc34a99c0, g=...,
dir=dir@entry=Dyninst::Slicer::backward, p=..., cand=...,
skip=skip@entry=true, visited=std::map with 1 elements = {...},
singleCache=std::map with 2 elements = {...}, cache=std::map with 0
elements)
at
/home/krentel/newarch/externals/symtabAPI/dyninst/dataflowAPI/src/slicing.C:307
#16 0x000003ff979f2de0 in Dyninst::Slicer::sliceInternal
(this=this@entry=0x3ffc34a99c0, dir=dir@entry=Dyninst::Slicer::backward,
p=...)
at
/home/krentel/newarch/externals/symtabAPI/dyninst/dataflowAPI/src/slicing.C:195
#17 0x000003ff979f321c in Dyninst::Slicer::backwardSlice
(this=this@entry=0x3ffc34a99c0, predicates=...)
at
/home/krentel/newarch/externals/symtabAPI/dyninst/dataflowAPI/src/slicing.C:1394
#18 0x000003ff979aa8d4 in
IndirectControlFlowAnalyzer::NewJumpTableAnalysis
(this=this@entry=0x3ffc34a9ca0, outEdges=std::vector of length 0,
capacity 0)
at
/home/krentel/newarch/externals/symtabAPI/dyninst/parseAPI/src/IndirectAnalyzer.C:45
#19 0x000003ff97984034 in
Dyninst::InsnAdapter::IA_aarch64Details::parseJumpTable (this=<optimized
out>, currFunc=<optimized out>, currBlk=0x1b8c7400,
outEdges=std::vector of length 0, capacity 0) at
/home/krentel/newarch/externals/symtabAPI/dyninst/parseAPI/src/IA_aarch64Details.C:172
#20 0x000003ff9796a6e0 in Dyninst::InsnAdapter::IA_IAPI::parseJumpTable
(this=this@entry=0x1b8c7480, currFunc=currFunc@entry=0x1b4f1d50,
currBlk=0x1b790800,
currBlk@entry=0x1b8c7400, outEdges=std::vector of length
-274768239832, capacity -274768239832 = {...})
at
/home/krentel/newarch/externals/symtabAPI/dyninst/parseAPI/src/IA_IAPI.C:958
#21 0x000003ff9796ffe4 in Dyninst::InsnAdapter::IA_IAPI::getNewEdges
(this=0x1b8c7480, outEdges=std::vector of length 0, capacity 0,
context=0x1b4f1d50,
Python Exception <type 'exceptions.ValueError'> Cannot find type const
std::set<unsigned long, std::less<unsigned long>,
std::allocator<unsigned long> >::_Rep_type:
currBlk=0x1b8c7400, num_insns=56, plt_entries=<optimized out>,
knownTargets=std::set with 11 elements)
at
/home/krentel/newarch/externals/symtabAPI/dyninst/parseAPI/src/IA_IAPI.C:681
#22 0x000003ff9793d3fc in Dyninst::ParseAPI::Parser::ProcessCFInsn
(this=this@entry=0x1a1f3f60, frame=..., cur=cur@entry=0x1b8c7400, ah=...)
at
/home/krentel/newarch/externals/symtabAPI/dyninst/parseAPI/src/ParserDetails.C:425
#23 0x000003ff97943cf0 in Dyninst::ParseAPI::Parser::parse_frame
(this=this@entry=0x1a1f3f60, frame=..., recursive=recursive@entry=true)
at
/home/krentel/newarch/externals/symtabAPI/dyninst/parseAPI/src/Parser.C:1122
#24 0x000003ff979464dc in Dyninst::ParseAPI::Parser::parse_frames
(this=this@entry=0x1a1f3f60, work=std::vector of length 3491, capacity
4096 = {...},
recursive=recursive@entry=true) at
/home/krentel/newarch/externals/symtabAPI/dyninst/parseAPI/src/Parser.C:409
#25 0x000003ff97947c28 in Dyninst::ParseAPI::Parser::parse_vanilla
(this=this@entry=0x1a1f3f60)
at
/home/krentel/newarch/externals/symtabAPI/dyninst/parseAPI/src/Parser.C:282
#26 0x000003ff97947df0 in Dyninst::ParseAPI::Parser::parse
(this=0x1a1f3f60) at
/home/krentel/newarch/externals/symtabAPI/dyninst/parseAPI/src/Parser.C:160
#27 0x0000000000401e48 in main (argc=<optimized out>, argv=<optimized
out>) at parse.cpp:149
----------
My working directory on leela is: /home/krentel/newarch/. It should
be open to someone with an account on leela. I've copied these files
into newarch/Files to save for you.
-r--r--r--. 1 krentel krentel 155320320 Sep 12 18:21 core.19973
-rwxr-xr-x. 1 krentel krentel 19330363 Sep 12 18:20 hpcstruct-bin
-rwxr-xr-x. 1 krentel krentel 472639 Sep 12 18:10 parse
-rw-r--r--. 1 krentel krentel 3530 Sep 12 18:10 parse.cpp
Running parse on itself produces the small problem, running it on
hpcstruct-bin produces the sig abort.
Is there a different branch that I should try for ARM? I thought most
of the arm64 branch was merged into trunk a couple months ago.
--Mark
|