Have delocate process lines by pulling.
In order to better handle BSS sections, rather than having a single loop over the lines and state flags, pull lines as needed. This means that subfunctions can process sections of the input. Also, stop bothering to move the init_array to the end, it's already put into its own section. Change-Id: I0e62930c65d29baecb39ba0d8bbc21f2da3bde56 Reviewed-on: https://boringssl-review.googlesource.com/15204 Reviewed-by: Adam Langley <agl@google.com>
This commit is contained in:
parent
11f11e6f49
commit
c2dce9c1d5
@ -132,6 +132,25 @@ type threadLocalOffsetFunc struct {
|
|||||||
symbol string
|
symbol string
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type lineSource struct {
|
||||||
|
lines []string
|
||||||
|
lineNo int
|
||||||
|
}
|
||||||
|
|
||||||
|
func (ls *lineSource) Next() (string, bool) {
|
||||||
|
if ls.lineNo == len(ls.lines) {
|
||||||
|
return "", false
|
||||||
|
}
|
||||||
|
|
||||||
|
ret := ls.lines[ls.lineNo]
|
||||||
|
ls.lineNo++
|
||||||
|
return ret, true
|
||||||
|
}
|
||||||
|
|
||||||
|
func (ls *lineSource) Unread() {
|
||||||
|
ls.lineNo--
|
||||||
|
}
|
||||||
|
|
||||||
// transform performs a number of transformations on the given assembly code.
|
// transform performs a number of transformations on the given assembly code.
|
||||||
// See FIPS.md in the current directory for an overview.
|
// See FIPS.md in the current directory for an overview.
|
||||||
func transform(lines []string, symbols map[string]bool) (ret []string) {
|
func transform(lines []string, symbols map[string]bool) (ret []string) {
|
||||||
@ -145,12 +164,6 @@ func transform(lines []string, symbols map[string]bool) (ret []string) {
|
|||||||
// referenced and thus needs to be emitted outside the module.
|
// referenced and thus needs to be emitted outside the module.
|
||||||
ia32capAddrNeeded := false
|
ia32capAddrNeeded := false
|
||||||
|
|
||||||
// extractedText contains lines that have been extracted from the
|
|
||||||
// assembly and need to be moved outside of the module. (This is used
|
|
||||||
// for the .init_array section that specifies constructors.)
|
|
||||||
var extractedText []string
|
|
||||||
extractingText := false
|
|
||||||
|
|
||||||
// bssAccessorsNeeded contains the names of BSS symbols for which
|
// bssAccessorsNeeded contains the names of BSS symbols for which
|
||||||
// accessor functions need to be emitted outside of the module.
|
// accessor functions need to be emitted outside of the module.
|
||||||
var bssAccessorsNeeded []string
|
var bssAccessorsNeeded []string
|
||||||
@ -159,7 +172,14 @@ func transform(lines []string, symbols map[string]bool) (ret []string) {
|
|||||||
// offsets in the thread-local storage.
|
// offsets in the thread-local storage.
|
||||||
threadLocalOffsets := make(map[string]threadLocalOffsetFunc)
|
threadLocalOffsets := make(map[string]threadLocalOffsetFunc)
|
||||||
|
|
||||||
for lineNo, line := range lines {
|
source := &lineSource{lines: lines}
|
||||||
|
|
||||||
|
for {
|
||||||
|
line, ok := source.Next()
|
||||||
|
if !ok {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
|
||||||
// References to OPENSSL_ia32cap_P via the GOT result from C
|
// References to OPENSSL_ia32cap_P via the GOT result from C
|
||||||
// code. The OPENSSL_ia32cap_addr symbol, generated by this
|
// code. The OPENSSL_ia32cap_addr symbol, generated by this
|
||||||
// script, is just like a GOT entry, but at a known offset.
|
// script, is just like a GOT entry, but at a known offset.
|
||||||
@ -260,13 +280,6 @@ func transform(lines []string, symbols map[string]bool) (ret []string) {
|
|||||||
ret = append(ret, line)
|
ret = append(ret, line)
|
||||||
continue
|
continue
|
||||||
|
|
||||||
case ".file":
|
|
||||||
// Do not reorder .file directives. These define
|
|
||||||
// numbered files which are referenced by other debug
|
|
||||||
// directives which may not be reordered.
|
|
||||||
ret = append(ret, line)
|
|
||||||
continue
|
|
||||||
|
|
||||||
case ".comm":
|
case ".comm":
|
||||||
p := strings.Split(parts[1], ",")
|
p := strings.Split(parts[1], ",")
|
||||||
name := p[0]
|
name := p[0]
|
||||||
@ -274,8 +287,6 @@ func transform(lines []string, symbols map[string]bool) (ret []string) {
|
|||||||
ret = append(ret, line)
|
ret = append(ret, line)
|
||||||
|
|
||||||
case ".section":
|
case ".section":
|
||||||
extractingText = false
|
|
||||||
|
|
||||||
p := strings.Split(parts[1], ",")
|
p := strings.Split(parts[1], ",")
|
||||||
section := p[0]
|
section := p[0]
|
||||||
|
|
||||||
@ -293,30 +304,13 @@ func transform(lines []string, symbols map[string]bool) (ret []string) {
|
|||||||
|
|
||||||
switch section {
|
switch section {
|
||||||
case ".data", ".data.rel.ro.local":
|
case ".data", ".data.rel.ro.local":
|
||||||
panic(fmt.Sprintf("bad section %q on line %d", parts[1], lineNo+1))
|
panic(fmt.Sprintf("bad section %q on line %d", parts[1], source.lineNo))
|
||||||
|
|
||||||
case ".init_array":
|
|
||||||
// init_array contains function pointers to
|
|
||||||
// constructor functions. Since these must be
|
|
||||||
// relocated, this section is moved to the end
|
|
||||||
// of the file.
|
|
||||||
extractedText = append(extractedText, line)
|
|
||||||
extractingText = true
|
|
||||||
|
|
||||||
default:
|
default:
|
||||||
ret = append(ret, line)
|
ret = append(ret, line)
|
||||||
}
|
}
|
||||||
|
|
||||||
case ".text":
|
|
||||||
extractingText = false
|
|
||||||
fallthrough
|
|
||||||
|
|
||||||
default:
|
default:
|
||||||
if extractingText {
|
|
||||||
extractedText = append(extractedText, line)
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
if symbol, ok := isSymbolDef(line); ok {
|
if symbol, ok := isSymbolDef(line); ok {
|
||||||
if isGlobal := symbols[symbol]; isGlobal {
|
if isGlobal := symbols[symbol]; isGlobal {
|
||||||
ret = append(ret, localTargetName(symbol)+":")
|
ret = append(ret, localTargetName(symbol)+":")
|
||||||
@ -385,8 +379,6 @@ func transform(lines []string, symbols map[string]bool) (ret []string) {
|
|||||||
ret = append(ret, ".byte 0x"+strconv.FormatUint(uint64(b), 16))
|
ret = append(ret, ".byte 0x"+strconv.FormatUint(uint64(b), 16))
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = append(ret, extractedText...)
|
|
||||||
|
|
||||||
return ret
|
return ret
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user