aboutsummaryrefslogtreecommitdiffstats
path: root/pkg/cover/backend/dwarf.go
diff options
context:
space:
mode:
authorAlexander Egorenkov <eaibmz@gmail.com>2025-06-30 13:47:32 +0200
committerAleksandr Nogikh <nogikh@google.com>2025-06-30 15:01:13 +0000
commit43d64aef21fc7bebebfbe0d8cf37c4102197dcae (patch)
treea02cfe6c4643114bef74721acd64fa1b71768de8 /pkg/cover/backend/dwarf.go
parentefea65fd7f4d72e186688ba3f58ae5b752611647 (diff)
pkg/cover: extract coverage points from binary data for s390x arch
This is a faster way to find all coverage points. Signed-off-by: Alexander Egorenkov <eaibmz@gmail.com>
Diffstat (limited to 'pkg/cover/backend/dwarf.go')
-rw-r--r--pkg/cover/backend/dwarf.go14
1 files changed, 13 insertions, 1 deletions
diff --git a/pkg/cover/backend/dwarf.go b/pkg/cover/backend/dwarf.go
index a11c23c78..f35368f5e 100644
--- a/pkg/cover/backend/dwarf.go
+++ b/pkg/cover/backend/dwarf.go
@@ -82,6 +82,18 @@ var arches = map[string]*Arch{
return pc + 4*off
},
},
+ targets.S390x: {
+ scanSize: 1,
+ callLen: 6,
+ callRelocType: uint64(elf.R_390_PLT32DBL),
+ isCallInsn: func(arch *Arch, insn []byte) bool {
+ return insn[0] == 0xc0 && insn[1] == 0xe5
+ },
+ callTarget: func(arch *Arch, insn []byte, pc uint64) uint64 {
+ off := uint64(int64(int32(binary.BigEndian.Uint32(insn[2:]))))
+ return pc + 2*off
+ },
+ },
}
func makeDWARF(params *dwarfParams) (impl *Impl, err error) {
@@ -114,7 +126,7 @@ func processModule(params *dwarfParams, module *vminfo.KernelModule, info *symbo
var data []byte
var coverPoints [2][]uint64
- if target.Arch != targets.AMD64 && target.Arch != targets.ARM64 {
+ if _, ok := arches[target.Arch]; !ok {
coverPoints, err = objdump(target, module)
} else if module.Name == "" {
data, err = params.readTextData(module)