---
title: "Gopls: Support for Go *.s assembly files"
---

Gopls has rudimentary support for LSP operations in Go assembly files.

Go assembly files have a `.s` file name extension. LSP clients need to
be configured to recognize `.s` files as Go assembly files, since this
file name extension is also used for assembly files in other
languages. A good heuristic is that if a file named `*.s` belongs to a
directory containing at least one `*.go` file, then the `.s` file is
Go assembly, and its appropriate language server is gopls.

The following requests are currently supported:

- Definition (`textDocument/definition`): on a reference to a symbol,
  returns the location of its declaration. For example, a Definition
  request on the `sigpanic` symbol in this file in
  GOROOT/src/runtime/asm.s:

  ```asm
  	JMP	·sigpanic<ABIInternal>(SB)
  ```

  returns the location of the function declaration in
  GOROOT/src/runtime/signal_unix.go:

  ```go
  //go:linkname sigpanic
  func sigpanic() {
  ```

- References (`textDocument/references`): finds all references to the
  symbol under the cursor, in both Go and assembly files within the
  same package.

- Hover (`textDocument/hover`): reports the signature and doc comment
  of the symbol's Go declaration.

- DocumentHighlight (`textDocument/documentHighlight`): highlights all
  occurrences of the symbol, control label, or machine register under
  the cursor. Labels and registers are scoped to the enclosing TEXT
  function, and occurrences are classified as reads or writes.
  Register highlighting requires the file name to carry a GOARCH
  suffix (e.g. `foo_amd64.s`) and currently supports x86 (amd64, 386)
  and arm64.

See also issue https://go.dev/issue/71754, which tracks the development of LSP
features in Go assembly files.
