aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDmitry Vyukov <dvyukov@google.com>2024-04-15 12:36:25 +0200
committerDmitry Vyukov <dvyukov@google.com>2024-04-15 13:23:33 +0000
commitf887b0490140a0c80dd49d2c549ac57ac2adc2b9 (patch)
tree1517fcc39031508f1701bee8ef4078968c1fbde2
parent80ce88419762e4342971463033802fea7cdb2973 (diff)
prog: don't pad data in exec encoding
With leb128 ints it does not make any sense. Reduces exec sizes a bit more: - exec sizes: 10%:597 50%:1438 90%:7145 + exec sizes: 10%:584 50%:1423 90%:7076
-rw-r--r--executor/executor.cc5
-rw-r--r--prog/decodeexec.go5
-rw-r--r--prog/encodingexec.go13
-rw-r--r--prog/encodingexec_test.go1
4 files changed, 8 insertions, 16 deletions
diff --git a/executor/executor.cc b/executor/executor.cc
index 84a8e0d43..ba2fb4bff 100644
--- a/executor/executor.cc
+++ b/executor/executor.cc
@@ -782,11 +782,10 @@ void execute_one()
case arg_data: {
uint64 size = read_input(&input_pos);
size &= ~(1ull << 63); // readable flag
- uint64 padded = (size + 7) & ~7;
- if (input_pos + padded > input_data + kMaxInput)
+ if (input_pos + size > input_data + kMaxInput)
fail("data arg overflow");
NONFAILING(memcpy(addr, input_pos, size));
- input_pos += padded;
+ input_pos += size;
break;
}
case arg_csum: {
diff --git a/prog/decodeexec.go b/prog/decodeexec.go
index 4574ef845..bd92854e6 100644
--- a/prog/decodeexec.go
+++ b/prog/decodeexec.go
@@ -232,15 +232,14 @@ func (dec *execDecoder) read() uint64 {
}
func (dec *execDecoder) readBlob(size uint64) []byte {
- padded := (size + 7) / 8 * 8
- if uint64(len(dec.data)) < padded {
+ if uint64(len(dec.data)) < size {
dec.setErr(fmt.Errorf("exec program overflow"))
}
if dec.err != nil {
return nil
}
data := dec.data[:size]
- dec.data = dec.data[padded:]
+ dec.data = dec.data[size:]
return data
}
diff --git a/prog/encodingexec.go b/prog/encodingexec.go
index 2c13d452c..8e12d3491 100644
--- a/prog/encodingexec.go
+++ b/prog/encodingexec.go
@@ -283,7 +283,7 @@ func (w *execContext) writeArg(arg Arg) {
case *DataArg:
data := a.Data()
if len(data) == 0 {
- return
+ panic("writing data arg with 0 size")
}
w.write(execArgData)
flags := uint64(len(data))
@@ -291,16 +291,11 @@ func (w *execContext) writeArg(arg Arg) {
flags |= execArgDataReadable
}
w.write(flags)
- padded := len(data)
- if pad := 8 - len(data)%8; pad != 8 {
- padded += pad
- }
- if len(w.buf) < padded {
+ if len(w.buf) < len(data) {
w.eof = true
} else {
- copy(w.buf, data)
- copy(w.buf[len(data):], make([]byte, 8))
- w.buf = w.buf[padded:]
+ n := copy(w.buf, data)
+ w.buf = w.buf[n:]
}
case *UnionArg:
w.writeArg(a.Option)
diff --git a/prog/encodingexec_test.go b/prog/encodingexec_test.go
index 2a8ce30b3..19b7d1761 100644
--- a/prog/encodingexec_test.go
+++ b/prog/encodingexec_test.go
@@ -522,7 +522,6 @@ test() (async, rerun: 10)
want = binary.AppendVarint(want, int64(elem))
case []byte:
want = append(want, elem...)
- want = append(want, make([]byte, ((len(elem)+7) & ^7)-len(elem))...)
default:
t.Fatalf("unexpected elem type %T %#v", e, e)
}