aboutsummaryrefslogtreecommitdiffstats
path: root/pkg/compiler/const_file.go
diff options
context:
space:
mode:
Diffstat (limited to 'pkg/compiler/const_file.go')
-rw-r--r--pkg/compiler/const_file.go37
1 files changed, 25 insertions, 12 deletions
diff --git a/pkg/compiler/const_file.go b/pkg/compiler/const_file.go
index 1968092a4..0220da555 100644
--- a/pkg/compiler/const_file.go
+++ b/pkg/compiler/const_file.go
@@ -26,6 +26,10 @@ type ConstFile struct {
type constVal struct {
name string
vals map[string]uint64 // arch -> value
+ // Set if the value for the arch is weak (come from auto.txt).
+ // Weak values are replaced on mismatch, instead of producing
+ // an error about mismatching values.
+ weak map[string]bool
}
const undefined = "???"
@@ -40,30 +44,38 @@ func NewConstFile() *ConstFile {
func (cf *ConstFile) AddArch(arch string, consts map[string]uint64, undeclared map[string]bool) error {
cf.arches[arch] = true
for name, val := range consts {
- if err := cf.addConst(arch, name, val, true); err != nil {
+ if err := cf.addConst(arch, name, val, true, false); err != nil {
return err
}
}
for name := range undeclared {
- if err := cf.addConst(arch, name, 0, false); err != nil {
+ if err := cf.addConst(arch, name, 0, false, false); err != nil {
return err
}
}
return nil
}
-func (cf *ConstFile) addConst(arch, name string, val uint64, declared bool) error {
+func (cf *ConstFile) addConst(arch, name string, val uint64, declared, weak bool) error {
cv := cf.m[name]
if cv.vals == nil {
cv.name = name
cv.vals = make(map[string]uint64)
- }
- if val0, declared0 := cv.vals[arch]; declared && declared0 && val != val0 {
- return fmt.Errorf("const=%v arch=%v has different values: %v[%v] vs %v[%v]",
- name, arch, val, declared, val0, declared0)
+ cv.weak = make(map[string]bool)
}
if declared {
+ val0, declared0 := cv.vals[arch]
+ if declared0 {
+ if weak {
+ return nil
+ }
+ if !cv.weak[arch] && val != val0 {
+ return fmt.Errorf("const=%v arch=%v has different values: %v[%v] vs %v[%v]",
+ name, arch, val, declared, val0, declared0)
+ }
+ }
cv.vals[arch] = val
+ cv.weak[arch] = weak
}
cf.m[name] = cv
return nil
@@ -196,6 +208,7 @@ func (cf *ConstFile) deserializeFile(data []byte, file, arch string, eh ast.Erro
eh(pos, fmt.Sprintf(msg, args...))
return false
}
+ weak := file == "auto.txt.const"
s := bufio.NewScanner(bytes.NewReader(data))
var arches []string
for ; s.Scan(); pos.Line++ {
@@ -224,7 +237,7 @@ func (cf *ConstFile) deserializeFile(data []byte, file, arch string, eh ast.Erro
}
continue
}
- if !cf.parseConst(arches, name, val, errf) {
+ if !cf.parseConst(arches, name, val, weak, errf) {
return false
}
}
@@ -236,7 +249,7 @@ func (cf *ConstFile) deserializeFile(data []byte, file, arch string, eh ast.Erro
type errft func(msg string, args ...interface{}) bool
-func (cf *ConstFile) parseConst(arches []string, name, line string, errf errft) bool {
+func (cf *ConstFile) parseConst(arches []string, name, line string, weak bool, errf errft) bool {
var dflt map[string]uint64
for _, pair := range strings.Split(line, ",") {
fields := strings.Split(pair, ":")
@@ -274,13 +287,13 @@ func (cf *ConstFile) parseConst(arches []string, name, line string, errf errft)
for _, arch := range fields[:len(fields)-1] {
arch = strings.TrimSpace(arch)
delete(dflt, arch)
- if err := cf.addConst(arch, name, val, defined); err != nil {
+ if err := cf.addConst(arch, name, val, defined, weak); err != nil {
return errf("%v", err)
}
}
}
for arch, val := range dflt {
- if err := cf.addConst(arch, name, val, true); err != nil {
+ if err := cf.addConst(arch, name, val, true, weak); err != nil {
return errf("%v", err)
}
}
@@ -292,7 +305,7 @@ func (cf *ConstFile) parseOldConst(arch, name, line string, errf errft) bool {
if err != nil {
return errf("failed to parse int: %v", err)
}
- if err := cf.addConst(arch, name, val, true); err != nil {
+ if err := cf.addConst(arch, name, val, true, false); err != nil {
return errf("%v", err)
}
return true