Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
HugeYuan
delve
提交
2ed77e54
D
delve
项目概览
HugeYuan
/
delve
与 Fork 源项目一致
从无法访问的项目Fork
通知
2
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
D
delve
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
2ed77e54
编写于
8月 05, 2014
作者:
D
Derek Parker
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Refactor: Simplify frame parser
上级
c22b6a8a
变更
1
显示空白变更内容
内联
并排
Showing
1 changed file
with
27 addition
and
72 deletion
+27
-72
dwarf/frame/frame_parser.go
dwarf/frame/frame_parser.go
+27
-72
未找到文件。
dwarf/frame/frame_parser.go
浏览文件 @
2ed77e54
...
...
@@ -41,106 +41,61 @@ func cieEntry(data []byte) bool {
}
func
parseLength
(
ctx
*
parseContext
)
parsefunc
{
var
fn
parsefunc
var
data
=
ctx
.
Buf
.
Next
(
8
)
ctx
.
Length
=
binary
.
LittleEndian
.
Uint32
(
ctx
.
Buf
.
Next
(
4
))
cieid
:=
ctx
.
Buf
.
Next
(
4
)
ctx
.
Length
=
binary
.
LittleEndian
.
Uint32
(
data
[
:
4
])
-
4
// take off the length of the CIE id / CIE pointer.
if
cieEntry
(
cieid
)
{
if
cieEntry
(
data
[
4
:
]
)
{
ctx
.
Common
=
&
CommonInformationEntry
{
Length
:
ctx
.
Length
}
fn
=
parseVersion
}
else
{
ctx
.
Frame
=
&
FrameDescriptionEntry
{
Length
:
ctx
.
Length
,
CIE
:
ctx
.
Common
,
AddressRange
:
&
addrange
{}}
fn
=
parseInitialLocation
return
parseCIE
}
// Take off the length of the CIE id / CIE pointer.
ctx
.
Length
-=
4
return
fn
ctx
.
Frame
=
&
FrameDescriptionEntry
{
Length
:
ctx
.
Length
,
CIE
:
ctx
.
Common
,
AddressRange
:
&
addrange
{}}
return
parseFDE
}
func
parseInitialLocation
(
ctx
*
parseContext
)
parsefunc
{
ctx
.
Frame
.
AddressRange
.
begin
=
binary
.
LittleEndian
.
Uint64
(
ctx
.
Buf
.
Next
(
8
))
func
parseFDE
(
ctx
*
parseContext
)
parsefunc
{
r
:=
ctx
.
Buf
.
Next
(
int
(
ctx
.
Length
))
ctx
.
Frame
.
AddressRange
.
begin
=
binary
.
LittleEndian
.
Uint64
(
r
[
:
8
])
ctx
.
Frame
.
AddressRange
.
end
=
binary
.
LittleEndian
.
Uint64
(
r
[
8
:
16
])
// Insert into the tree after setting address range begin
// otherwise compares won't work.
ctx
.
Entries
.
Put
(
ctx
.
Frame
)
ctx
.
Length
-=
8
return
parseAddressRange
}
func
parseAddressRange
(
ctx
*
parseContext
)
parsefunc
{
ctx
.
Frame
.
AddressRange
.
end
=
binary
.
LittleEndian
.
Uint64
(
ctx
.
Buf
.
Next
(
8
))
ctx
.
Length
-=
8
return
parseFrameInstructions
}
func
parseFrameInstructions
(
ctx
*
parseContext
)
parsefunc
{
// The rest of this entry consists of the instructions
// so we can just grab all of the data from the buffer
// cursor to length.
ctx
.
Frame
.
Instructions
=
ctx
.
Buf
.
Next
(
int
(
ctx
.
Length
))
ctx
.
Frame
.
Instructions
=
r
[
16
:
]
ctx
.
Length
=
0
return
parseLength
}
func
parseVersion
(
ctx
*
parseContext
)
parsefunc
{
version
,
err
:=
ctx
.
Buf
.
ReadByte
()
if
err
!=
nil
{
panic
(
err
)
}
ctx
.
Common
.
Version
=
version
ctx
.
Length
-=
1
func
parseCIE
(
ctx
*
parseContext
)
parsefunc
{
data
:=
ctx
.
Buf
.
Next
(
int
(
ctx
.
Length
))
buf
:=
bytes
.
NewBuffer
(
data
)
// parse version
ctx
.
Common
.
Version
=
data
[
0
]
return
parseA
ugmentation
}
// parse a
ugmentation
ctx
.
Common
.
Augmentation
,
_
=
util
.
ParseString
(
buf
)
func
parseAugmentation
(
ctx
*
parseContext
)
parsefunc
{
var
str
,
c
=
util
.
ParseString
(
ctx
.
B
uf
)
// parse code alignment factor
ctx
.
Common
.
CodeAlignmentFactor
,
_
=
util
.
DecodeULEB128
(
b
uf
)
ctx
.
Common
.
Augmentation
=
st
r
ctx
.
Length
-=
c
// parse data alignment facto
r
ctx
.
Common
.
DataAlignmentFactor
,
_
=
util
.
DecodeSLEB128
(
buf
)
return
parseCodeAlignmentFactor
}
func
parseCodeAlignmentFactor
(
ctx
*
parseContext
)
parsefunc
{
var
caf
,
c
=
util
.
DecodeULEB128
(
ctx
.
Buf
)
ctx
.
Common
.
CodeAlignmentFactor
=
caf
ctx
.
Length
-=
c
return
parseDataAlignmentFactor
}
func
parseDataAlignmentFactor
(
ctx
*
parseContext
)
parsefunc
{
var
daf
,
c
=
util
.
DecodeSLEB128
(
ctx
.
Buf
)
ctx
.
Common
.
DataAlignmentFactor
=
daf
ctx
.
Length
-=
c
return
parseReturnAddressRegister
}
func
parseReturnAddressRegister
(
ctx
*
parseContext
)
parsefunc
{
reg
,
c
:=
util
.
DecodeULEB128
(
ctx
.
Buf
)
ctx
.
Common
.
ReturnAddressRegister
=
reg
ctx
.
Length
-=
c
return
parseInitialInstructions
}
// parse return address register
ctx
.
Common
.
ReturnAddressRegister
,
_
=
util
.
DecodeULEB128
(
buf
)
func
parseInitialInstructions
(
ctx
*
parseContext
)
parsefunc
{
// parse initial instructions
// The rest of this entry consists of the instructions
// so we can just grab all of the data from the buffer
// cursor to length.
ctx
.
Common
.
InitialInstructions
=
ctx
.
Buf
.
Next
(
int
(
ctx
.
Length
))
ctx
.
Common
.
InitialInstructions
=
buf
.
Bytes
()
//
ctx.Buf.Next(int(ctx.Length))
ctx
.
Length
=
0
return
parseLength
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录