aboutsummaryrefslogtreecommitdiff
path: root/infra/base-images/base-runner/gocoverage/llvm-cov-rel/llvm-profraw-relative.go
diff options
context:
space:
mode:
Diffstat (limited to 'infra/base-images/base-runner/gocoverage/llvm-cov-rel/llvm-profraw-relative.go')
-rw-r--r--infra/base-images/base-runner/gocoverage/llvm-cov-rel/llvm-profraw-relative.go192
1 files changed, 0 insertions, 192 deletions
diff --git a/infra/base-images/base-runner/gocoverage/llvm-cov-rel/llvm-profraw-relative.go b/infra/base-images/base-runner/gocoverage/llvm-cov-rel/llvm-profraw-relative.go
deleted file mode 100644
index 6106e520c..000000000
--- a/infra/base-images/base-runner/gocoverage/llvm-cov-rel/llvm-profraw-relative.go
+++ /dev/null
@@ -1,192 +0,0 @@
-package main
-
-import (
- "debug/elf"
- "encoding/binary"
- "flag"
- "fmt"
- "io"
- "io/ioutil"
- "log"
-)
-
-type ProfrawHeaderVersion7 struct {
- ProfrawHeaderGeneric
- BinaryIdsSize uint64
- DataSize uint64
- PaddingBytesBeforeCounters uint64
- CountersSize uint64
- PaddingBytesAfterCounters uint64
- NamesSize uint64
- CountersDelta uint64
- NamesDelta uint64
- ValueKindLast uint64
-}
-
-type ProfrawHeaderGeneric struct {
- Magic uint64
- Version uint64
-}
-
-type ProfrawData struct {
- NameRef uint64
- FuncHash uint64
- CounterPtr uint64
- FunctionPointer uint64
- Values uint64
- NumCounters uint32
- NumValueSites []uint16
-}
-
-const PROFRAW_HEADER_GENERIC_LEN = 16
-const PROFRAW_HEADER_7_LEN = 88
-
-func parseProfrawHeaderGeneric(data []byte) (ProfrawHeaderGeneric, error) {
- r := ProfrawHeaderGeneric{}
- if len(data) < PROFRAW_HEADER_GENERIC_LEN {
- return r, io.EOF
- }
- r.Magic = binary.LittleEndian.Uint64(data[:8])
- r.Version = binary.LittleEndian.Uint64(data[8:16])
- if r.Magic != 0xff6c70726f667281 {
- return r, fmt.Errorf("Invalid magic %x", r.Magic)
- }
- return r, nil
-}
-
-func relativizeAddress(data []byte, offset int, databegin uint64, sectPrfCnts uint64, sectPrfData uint64) {
- value := binary.LittleEndian.Uint64(data[offset : offset+8])
- if value >= sectPrfCnts && value < sectPrfData {
- // If the value is an address in the right section,
- // Make it relative.
- value = value - databegin
- binary.LittleEndian.PutUint64(data[offset:offset+8], value)
- }
-
-}
-
-func profrawDataLen(ipvklast uint64) int {
- return 44 + 2*(int(ipvklast)+1)
-}
-
-func relativizeProfraw(data []byte, sectPrfCnts uint64, sectPrfData uint64) (error, []byte) {
- h := ProfrawHeaderVersion7{}
- var err error
- h.ProfrawHeaderGeneric, err = parseProfrawHeaderGeneric(data)
- if err != nil {
- return err, data
- }
- if h.Version == 5 {
- // Upgrade from 5 to 7 by adding a zero binaryids in the header.
- binary.LittleEndian.PutUint64(data[8:16], 7)
- h.Version = 7
- data2 := make([]byte, len(data)+8)
- copy(data2, data[0:16])
- copy(data2[24:], data[16:])
- data = data2
- }
- if h.Version < 7 {
- return fmt.Errorf("Invalid version for profraw file: %v", h.Version), data
- }
- // At one point clang-14 will update to 8, and more work will be needed.
- if len(data) < PROFRAW_HEADER_7_LEN {
- return io.EOF, data
- }
- h.BinaryIdsSize = binary.LittleEndian.Uint64(data[16:24])
- h.DataSize = binary.LittleEndian.Uint64(data[24:32])
- h.PaddingBytesBeforeCounters = binary.LittleEndian.Uint64(data[32:40])
- h.CountersSize = binary.LittleEndian.Uint64(data[40:48])
- h.PaddingBytesAfterCounters = binary.LittleEndian.Uint64(data[48:56])
- h.NamesSize = binary.LittleEndian.Uint64(data[56:64])
- h.CountersDelta = binary.LittleEndian.Uint64(data[64:72])
- h.NamesDelta = binary.LittleEndian.Uint64(data[72:80])
- h.ValueKindLast = binary.LittleEndian.Uint64(data[80:88])
-
- if h.BinaryIdsSize%8 != 0 {
- // adds padding for binary ids
- // cf commit b9f547e8e51182d32f1912f97a3e53f4899ea6be https://reviews.llvm.org/D110365
- padlen := 8 - (h.BinaryIdsSize % 8)
- data2 := make([]byte, len(data)+int(padlen))
- copy(data2, data[0:88+h.BinaryIdsSize])
- copy(data2[88+h.BinaryIdsSize+padlen:], data[88+h.BinaryIdsSize:])
- data = data2
- h.BinaryIdsSize += padlen
- binary.LittleEndian.PutUint64(data[16:24], h.BinaryIdsSize)
- }
-
- if h.CountersDelta != sectPrfCnts-sectPrfData {
- // Rust linking adds an offset ? not seen in readelf.
- sectPrfData = h.CountersDelta - sectPrfCnts + sectPrfData
- sectPrfCnts = h.CountersDelta
- }
- dataref := sectPrfData
- relativizeAddress(data, 64, dataref, sectPrfCnts, sectPrfData)
-
- offset := PROFRAW_HEADER_7_LEN + int(h.BinaryIdsSize)
- for i := uint64(0); i < h.DataSize; i++ {
- if len(data) < offset+profrawDataLen(h.ValueKindLast) {
- return io.EOF, data
- }
- d := ProfrawData{}
- d.NameRef = binary.LittleEndian.Uint64(data[offset : offset+8])
- d.FuncHash = binary.LittleEndian.Uint64(data[offset+8 : offset+16])
- d.CounterPtr = binary.LittleEndian.Uint64(data[offset+16 : offset+24])
- d.FunctionPointer = binary.LittleEndian.Uint64(data[offset+24 : offset+32])
- d.Values = binary.LittleEndian.Uint64(data[offset+32 : offset+40])
- d.NumCounters = binary.LittleEndian.Uint32(data[offset+40 : offset+44])
- d.NumValueSites = make([]uint16, h.ValueKindLast+1)
- for j := 0; j <= int(h.ValueKindLast); j++ {
- d.NumValueSites[j] = binary.LittleEndian.Uint16(data[offset+44+2*j : offset+46+2*j])
- }
-
- relativizeAddress(data, offset+16, dataref, sectPrfCnts, sectPrfData)
- // We need this because of CountersDelta -= sizeof(*SrcData); in __llvm_profile_merge_from_buffer.
- dataref += uint64(profrawDataLen(h.ValueKindLast))
-
- offset += profrawDataLen(h.ValueKindLast)
- }
- return nil, data
-}
-
-func main() {
- flag.Parse()
-
- if len(flag.Args()) != 3 {
- log.Fatalf("needs exactly three arguments : binary, profraw, output")
- }
-
- // First find llvm profile sections addresses in the elf.
- f, err := elf.Open(flag.Args()[0])
- if err != nil {
- log.Fatalf("failed to read elf: %v", err)
- }
- sectPrfCnts := uint64(0)
- sectPrfData := uint64(0)
- for i := range f.Sections {
- if f.Sections[i].Name == "__llvm_prf_cnts" {
- sectPrfCnts = f.Sections[i].Addr
- } else if f.Sections[i].Name == "__llvm_prf_data" {
- sectPrfData = f.Sections[i].Addr
- // Maybe rather sectPrfCntsEnd as f.Sections[i].Addr + f.Sections[i].Size for __llvm_prf_cnts.
- }
- }
- if sectPrfCnts == 0 || sectPrfData == 0 {
- log.Fatalf("Elf has not __llvm_prf_cnts and __llvm_prf_data sections")
- }
-
- // Process profraw file.
- data, err := ioutil.ReadFile(flag.Args()[1])
- if err != nil {
- log.Fatalf("failed to read file: %v", err)
- }
- err, data = relativizeProfraw(data, sectPrfCnts, sectPrfData)
- if err != nil {
- log.Fatalf("failed to process file: %v", err)
- }
-
- // Write output file.
- err = ioutil.WriteFile(flag.Args()[2], data, 0644)
- if err != nil {
- log.Fatalf("failed to write file: %v", err)
- }
-}