diff options
| author | Alexander Egorenkov <eaibmz@gmail.com> | 2025-06-30 13:47:32 +0200 |
|---|---|---|
| committer | Aleksandr Nogikh <nogikh@google.com> | 2025-06-30 15:01:13 +0000 |
| commit | 43d64aef21fc7bebebfbe0d8cf37c4102197dcae (patch) | |
| tree | a02cfe6c4643114bef74721acd64fa1b71768de8 /pkg/cover/backend | |
| parent | efea65fd7f4d72e186688ba3f58ae5b752611647 (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')
| -rw-r--r-- | pkg/cover/backend/dwarf.go | 14 |
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) |
