2014-09-22 18 views
7

Per esempio:Come definire una funzione su un puntatore struct in assembly?

// dummy.go 
type dummy struct { 
    p uintptr 
} 

func (d dummy) Get(i int) uint64 
//func (d *dummy) Get(i int) uint64 //no way to define *dummy in assembly 

func (d dummy) Get può essere definito come:

// dummy_amd64.s 
#include "textflag.h" 
TEXT ·dummy·Get(SB),NOSPLIT,$0 
    MOVQ $42, 24(SP) 
    RET 

ho provato

TEXT "".(*dummy).Get+0(SB),4,$0-24 //output from 6g -S 
TEXT ""·(*dummy)·Get+0(SB),4,$0 
TEXT ·*dummy·Get(SB),NOSPLIT,$0 
//and 
TEXT ·(*dummy)·Get(SB),NOSPLIT,$0 

Tutti loro mi dà lo stesso errore:

syntax error, last name: "".

Sono sicuro che mi manca qualcosa di ovvio ma non riesco a capirlo.

+2

cercare di definire la funzione nel linguaggio di programmazione che si sta utilizzando (andare, per quanto vedo) e di smontare il file oggetto. Quindi vedi il nome della funzione "reale". Per esempio in C++ "myClass :: myFunc (int, int)" può essere chiamato _Z7myClassF6myFuncII in assembler. –

+0

@MartinRosenau Purtroppo copiare/incollare l'output non funziona, ho dimenticato di includerlo nella domanda. – OneOfOne

+0

Ho trovato nada in grepping le clausole 'TEXT' nello stdlib. Vale la pena un post golgang - chiedo se è anche possibile. – twotwotwo

risposta

3

Questo non è in realtà possibile con la toolchain corrente. Il contesto è spiegato in issue 4978

Si noti che c'è lo a simple patch per abilitare questa funzione, ma solo poche persone lo stanno utilizzando.

si potrebbe scrivere una normale funzione di montaggio (non vale a dire il metodo), e mettere in atto una chiamata nel metodo Go, a questa funzione di montaggio. Ma la chiamata extra non verrà ottimizzata dal compilatore.

Una possibile soluzione a questo problema potrebbe essere quella di implementare un supporto per consentire funzioni di montaggio per essere inline nel codice Go - che porterebbe più benefici. La mia comprensione è che è stata discussa in passato, ma non è ancora pianificata.

+0

È un bel problema, ho cercato su Google poche ore e non sono riuscito a trovare il problema. – OneOfOne

Problemi correlati