q.From.Reg = reg
}
}
- if p.GetFrom3() != nil && p.GetFrom3().Name == obj.NAME_EXTERN {
- ctxt.Diag("don't know how to handle %v with -dynlink", p)
+ from3 := p.GetFrom3()
+ for i := range p.RestArgs {
+ a := &p.RestArgs[i].Addr
+ if a != from3 && a.Name == obj.NAME_EXTERN && !a.Sym.Local() {
+ ctxt.Diag("don't know how to handle %v with -dynlink", p)
+ }
}
var source *obj.Addr
// MOVx sym, Ry becomes $MOV sym@GOT, R15; MOVx (R15), Ry
if p.To.Name == obj.NAME_EXTERN && !p.To.Sym.Local() {
ctxt.Diag("cannot handle NAME_EXTERN on both sides in %v with -dynlink", p)
}
+ if from3 != nil && from3.Name == obj.NAME_EXTERN && !from3.Sym.Local() {
+ ctxt.Diag("cannot handle NAME_EXTERN on multiple operands in %v with -dynlink", p)
+ }
source = &p.From
} else if p.To.Name == obj.NAME_EXTERN && !p.To.Sym.Local() {
+ if from3 != nil && from3.Name == obj.NAME_EXTERN && !from3.Sym.Local() {
+ ctxt.Diag("cannot handle NAME_EXTERN on multiple operands in %v with -dynlink", p)
+ }
source = &p.To
+ } else if from3 != nil && from3.Name == obj.NAME_EXTERN && !from3.Sym.Local() {
+ source = from3
} else {
return
}
p2.As = p.As
p2.From = p.From
p2.To = p.To
- if from3 := p.GetFrom3(); from3 != nil {
- p2.AddRestSource(*from3)
- }
+ p2.RestArgs = p.RestArgs
if p.From.Name == obj.NAME_EXTERN {
p2.From.Reg = reg
p2.From.Name = obj.NAME_NONE
p2.To.Reg = reg
p2.To.Name = obj.NAME_NONE
p2.To.Sym = nil
+ } else if p.GetFrom3() != nil && p.GetFrom3().Name == obj.NAME_EXTERN {
+ from3 = p2.GetFrom3()
+ from3.Reg = reg
+ from3.Name = obj.NAME_NONE
+ from3.Sym = nil
} else {
return
}