mirror of
https://github.com/vlang/v.git
synced 2023-08-10 21:13:21 +03:00
native: don't generate duplicate strings (#16281)
This commit is contained in:
parent
0fa6f60fac
commit
075c025999
@ -823,20 +823,27 @@ pub fn (mut g Gen) generate_simple_elf_header() {
|
||||
}
|
||||
|
||||
pub fn (mut g Gen) elf_string_table() {
|
||||
mut generated := map[string]int{}
|
||||
|
||||
for _, s in g.strs {
|
||||
pos := generated[s.str] or { g.buf.len }
|
||||
|
||||
match s.typ {
|
||||
.abs64 {
|
||||
// g.write64_at(native.segment_start + g.buf.len, int(g.str_pos[i]))
|
||||
g.write64_at(s.pos, g.buf.len)
|
||||
g.write64_at(s.pos, pos)
|
||||
}
|
||||
.rel32 {
|
||||
g.write32_at(s.pos, g.buf.len - s.pos - 4)
|
||||
g.write32_at(s.pos, pos - s.pos - 4)
|
||||
}
|
||||
else {
|
||||
g.n_error('unsupported string reloc type')
|
||||
}
|
||||
}
|
||||
g.write_string(s.str)
|
||||
|
||||
if s.str !in generated {
|
||||
generated[s.str] = pos
|
||||
g.write_string(s.str)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -478,22 +478,30 @@ fn (mut g Gen) write_symbol(s Symbol) {
|
||||
fn (mut g Gen) sym_string_table() int {
|
||||
begin := g.buf.len
|
||||
g.zeroes(1)
|
||||
|
||||
mut generated := map[string]int{}
|
||||
|
||||
for _, s in g.strs {
|
||||
pos := g.buf.len - s.pos - 4
|
||||
pos := generated[s.str] or { g.buf.len }
|
||||
|
||||
match s.typ {
|
||||
.rel32 {
|
||||
g.write32_at(s.pos, pos)
|
||||
g.write32_at(s.pos, pos - s.pos - 4)
|
||||
}
|
||||
else {
|
||||
if g.pref.os == .windows {
|
||||
// that should be .rel32, not windows-specific
|
||||
g.write32_at(s.pos, pos)
|
||||
g.write32_at(s.pos, pos - s.pos - 4)
|
||||
} else {
|
||||
g.write64_at(s.pos, g.buf.len + native.base_addr)
|
||||
g.write64_at(s.pos, pos + native.base_addr)
|
||||
}
|
||||
}
|
||||
}
|
||||
g.write_string(s.str)
|
||||
|
||||
if s.str !in generated {
|
||||
generated[s.str] = pos
|
||||
g.write_string(s.str)
|
||||
}
|
||||
}
|
||||
return g.buf.len - begin
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user