Skip to content

Commit eb450cb

Browse files
committed
fix: read filepath from dwarf line
Closes: #67
1 parent 183152e commit eb450cb

File tree

3 files changed

+109
-18
lines changed

3 files changed

+109
-18
lines changed

.github/codecov.yml

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
codecov:
22
allow_pseudo_compare: true
33
allow_coverage_offsets: true
4+
45
coverage:
56
status:
67
patch:
@@ -12,11 +13,6 @@ coverage:
1213
threshold: 5%
1314
target: 70%
1415

15-
ignore:
16-
- "internal/wrapper/*.go"
17-
- "internal/knowninfo/dwarf_info.go"
18-
- "cmd/gsa/*.go"
19-
2016
comment:
2117
layout: "condensed_header, condensed_files, diff, flags, condensed_footer"
2218
behavior: default

internal/knowninfo/dwarf.go

Lines changed: 25 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -73,11 +73,20 @@ func (k *KnownInfo) TryLoadDwarf() bool {
7373

7474
loadCompilerUnit := func(cuEntry *dwarf.Entry, pendingEntry []*dwarf.Entry) {
7575
var pkg *entity.Package
76-
var filePath string
7776

7877
cuLang, _ := cuEntry.Val(dwarf.AttrLanguage).(int64)
7978
cuName, _ := cuEntry.Val(dwarf.AttrName).(string)
8079

80+
lr, err := d.LineReader(cuEntry)
81+
if err != nil {
82+
slog.Warn(fmt.Sprintf("Failed to read DWARF line: %v", err))
83+
return
84+
}
85+
var files []*dwarf.LineFile
86+
if lr != nil {
87+
files = lr.Files()
88+
}
89+
8190
if cuLang == DwLangGo {
8291
// if we have load it with pclntab?
8392
pkg = k.Deps.Trie.Get(cuName)
@@ -86,7 +95,6 @@ func (k *KnownInfo) TryLoadDwarf() bool {
8695
pkg.Name = cuName
8796
}
8897
pkg.DwarfEntry = cuEntry
89-
filePath = "<unknown>"
9098
typ := entity.PackageTypeVendor
9199
if cuName == "main" {
92100
typ = entity.PackageTypeMain
@@ -103,15 +111,6 @@ func (k *KnownInfo) TryLoadDwarf() bool {
103111
pkg.Type = entity.PackageTypeCGO
104112
langPackages[pkgName] = pkg
105113
}
106-
107-
compDirAny := cuEntry.Val(dwarf.AttrCompDir)
108-
if compDirAny == nil {
109-
slog.Warn("Failed to load DWARF: no compDir")
110-
return
111-
}
112-
compDir := compDirAny.(string)
113-
114-
filePath = fmt.Sprintf("%s/%s", compDir, cuName)
115114
}
116115

117116
for _, subEntry := range pendingEntry {
@@ -149,8 +148,9 @@ func (k *KnownInfo) TryLoadDwarf() bool {
149148
}
150149

151150
if len(ranges) == 0 {
152-
// fixme: maybe compiler optimization it?
151+
// fixme: maybe compiler optimize it?
153152
// example: sqlite3 simpleDestroy
153+
slog.Debug(fmt.Sprintf("Failed to load DWARF function size, no range: %s", subEntryName))
154154
continue
155155
}
156156

@@ -166,6 +166,18 @@ func (k *KnownInfo) TryLoadDwarf() bool {
166166
}
167167
}
168168

169+
filename := "<autogenerated>"
170+
if subEntry.Val(dwarf.AttrTrampoline) == nil {
171+
fileIndexAny := subEntry.Val(dwarf.AttrDeclFile)
172+
if fileIndexAny == nil {
173+
slog.Warn(fmt.Sprintf("Failed to load DWARF function file: %s", subEntryName))
174+
continue
175+
}
176+
fileIndex := fileIndexAny.(int64)
177+
file := files[fileIndex]
178+
filename = file.Name
179+
}
180+
169181
fn := &entity.Function{
170182
Name: subEntryName,
171183
Addr: addr,
@@ -175,7 +187,7 @@ func (k *KnownInfo) TryLoadDwarf() bool {
175187
PclnSize: entity.NewEmptyPclnSymbolSize(),
176188
}
177189

178-
added := pkg.AddFuncIfNotExists(filePath, fn)
190+
added := pkg.AddFuncIfNotExists(filename, fn)
179191

180192
if added {
181193
k.KnownAddr.Text.Insert(&entity.Addr{
Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
package knowninfo
2+
3+
import (
4+
"strconv"
5+
"testing"
6+
)
7+
8+
func TestLanguageString(t *testing.T) {
9+
tests := []struct {
10+
input Language
11+
expected string
12+
}{
13+
{DwLangC89, "C89"},
14+
{DwLangC, "C"},
15+
{DwLangAda83, "Ada83"},
16+
{DwLangCPP, "C++"},
17+
{DwLangCobol74, "Cobol74"},
18+
{DwLangCobol85, "Cobol85"},
19+
{DwLangFortran77, "Fortran77"},
20+
{DwLangFortran90, "Fortran90"},
21+
{DwLangPascal83, "Pascal83"},
22+
{DwLangModula2, "Modula2"},
23+
{DwLangJava, "Java"},
24+
{DwLangC99, "C99"},
25+
{DwLangAda95, "Ada95"},
26+
{DwLangFortran95, "Fortran95"},
27+
{DwLangPLI, "PLI"},
28+
{DwLangObjC, "ObjC"},
29+
{DwLangObjCPP, "ObjC++"},
30+
{DwLangUPC, "UPC"},
31+
{DwLangD, "D"},
32+
{DwLangPython, "Python"},
33+
{DwLangOpenCL, "OpenCL"},
34+
{DwLangGo, "Go"},
35+
{DwLangModula3, "Modula3"},
36+
{DwLangHaskell, "Haskell"},
37+
{DwLangCPP03, "C++03"},
38+
{DwLangCPP11, "C++11"},
39+
{DwLangOCaml, "OCaml"},
40+
{DwLangRust, "Rust"},
41+
{DwLangC11, "C11"},
42+
{DwLangSwift, "Swift"},
43+
{DwLangJulia, "Julia"},
44+
{DwLangDylan, "Dylan"},
45+
{DwLangCPP14, "C++14"},
46+
{DwLangFortran03, "Fortran03"},
47+
{DwLangFortran08, "Fortran08"},
48+
{DwLangRenderScript, "RenderScript"},
49+
{DwLangBLISS, "BLISS"},
50+
{DwLangKotlin, "Kotlin"},
51+
{DwLangZig, "Zig"},
52+
{DwLangCrystal, "Crystal"},
53+
{DwLangCPP17, "C++17"},
54+
{DwLangCPP20, "C++20"},
55+
{DwLangC17, "C17"},
56+
{DwLangFortran18, "Fortran18"},
57+
{DwLangAda2005, "Ada2005"},
58+
{DwLangAda2012, "Ada2012"},
59+
{DwLangHIP, "HIP"},
60+
{DwLangAssembly, "Assembly"},
61+
{DwLangCSharp, "C#"},
62+
{DwLangMojo, "Mojo"},
63+
{DwLangGLSL, "GLSL"},
64+
{DwLangGLSLES, "GLSLES"},
65+
{DwLangHLSL, "HLSL"},
66+
{DwLangOpenCLCPP, "OpenCL++"},
67+
{DwLangCPPForOpenCL, "C++ForOpenCL"},
68+
{DwLangSYCL, "SYCL"},
69+
{DwLangRuby, "Ruby"},
70+
{DwLangMove, "Move"},
71+
{DwLangHylo, "Hylo"},
72+
{Language(0x9999), "Language(39321)"}, // Test case for an unknown language constant
73+
}
74+
75+
for _, tt := range tests {
76+
t.Run(strconv.Itoa(int(tt.input)), func(t *testing.T) {
77+
result := LanguageString(tt.input)
78+
if result != tt.expected {
79+
t.Errorf("LanguageString(%v) = %v; want %v", tt.input, result, tt.expected)
80+
}
81+
})
82+
}
83+
}

0 commit comments

Comments
 (0)