func (p *Parser) funcAddress() (string, obj.ABI, bool) {
	switch p.peek() {
	case '$', '*':
		// Skip prefix.
		p.next()
	}

	tok := p.next()
	name := tok.String()
	if tok.ScanToken != scanner.Ident || p.atStartOfRegister(name) {
		return "", obj.ABI0, false
	}
	// Parse optional <> (indicates a static symbol) or
	// <ABIxxx> (selecting text symbol with specific ABI).
	noErrMsg := false
	isStatic, abi := p.symRefAttrs(name, noErrMsg)
	if isStatic {
		return "", obj.ABI0, false // This function rejects static symbols.
	}
	tok = p.next()
	if tok.ScanToken == '+' {
		if p.next().ScanToken != scanner.Int {
			return "", obj.ABI0, false
		}
		tok = p.next()
	}
	if tok.ScanToken != '(' {
		return "", obj.ABI0, false
	}
	if reg := p.next(); reg.ScanToken != scanner.Ident || reg.String() != "SB" {
		return "", obj.ABI0, false
	}
	if p.next().ScanToken != ')' || p.peek() != scanner.EOF {
		return "", obj.ABI0, false
	}
	return name, abi, true
}
// funcAddress parses an external function address. This is a
// constrained form of the operand syntax that's always SB-based,
// non-static, and has at most a simple integer offset:
//
//    [$|*]sym[<abi>][+Int](SB)
funcAddress parses an external function address. This is a
constrained form of the operand syntax that's always SB-based,
non-static, and has at most a simple integer offset.


// funcAddress parses an external function address . This is a // constrained form of the operand syntax that ' s always SB - based // non - static and has at most a simple integer offset : // // [ $| * ] sym [ <abi > ] [ + Int ] ( SB )
func (p *Parser) funcAddress() (string, obj.ABI, bool) {
	switch p.peek() {
	case '$', '*':
		p.next()
	}
	tok := p.next()
	name := tok.String()
	if tok.ScanToken != scanner.Ident || p.atStartOfRegister(name) {
		return "", obj.ABI0, false
	}
	noErrMsg := false
	isStatic, abi := p.symRefAttrs(name, noErrMsg)
	if isStatic {
		return "", obj.ABI0, false 
	}
	tok = p.next()
	if tok.ScanToken == '+' {
		if p.next().ScanToken != scanner.Int {
			return "", obj.ABI0, false
		}
		tok = p.next()
	}
	if tok.ScanToken != '(' {
		return "", obj.ABI0, false
	}
	if reg := p.next(); reg.ScanToken != scanner.Ident || reg.String() != "SB" {
		return "", obj.ABI0, false
	}
	if p.next().ScanToken != ')' || p.peek() != scanner.EOF {
		return "", obj.ABI0, false
	}
	return name, abi, true
}
func ( p * Parser ) funcAddress ( ) ( string , obj . ABI , bool ) { switch p . peek ( ) { case '$' , '*' : p . next ( ) } tok := p . next ( ) name := tok . String ( ) if tok . ScanToken != scanner . Ident || p . atStartOfRegister ( name ) { return " " , obj . ABI0 , false } noErrMsg := false isStatic , abi := p . symRefAttrs ( name , noErrMsg ) if isStatic { return " " , obj . ABI0 , false } tok = p . next ( ) if tok . ScanToken == '+' { if p . next ( ) . ScanToken != scanner . Int { return " " , obj . ABI0 , false } tok = p . next ( ) } if tok . ScanToken != '(' { return " " , obj . ABI0 , false } if reg := p . next ( ) ; reg . ScanToken != scanner . Ident || reg . String ( ) != " " { return " " , obj . ABI0 , false } if p . next ( ) . ScanToken != ')' || p . peek ( ) != scanner . EOF { return " " , obj . ABI0 , false } return name , abi , true }
funcAddress parses an external function address.
funcAddress parses an external function address .
// Skip prefix. // Parse optional <> (indicates a static symbol) or // <ABIxxx> (selecting text symbol with specific ABI). // This function rejects static symbols.