gccgoimporter

Imports

Imports #

"bytes"
"debug/elf"
"errors"
"fmt"
"internal/xcoff"
"io"
"strconv"
"strings"
"bufio"
"go/types"
"os"
"os/exec"
"path/filepath"
"strings"
"bytes"
"debug/elf"
"fmt"
"go/types"
"internal/xcoff"
"io"
"os"
"path/filepath"
"strings"
"errors"
"fmt"
"go/constant"
"go/token"
"go/types"
"io"
"strconv"
"strings"
"text/scanner"
"unicode/utf8"

Constants & Variables

aixbigafMagic const #

const aixbigafMagic = "

arDateOff const #

Offsets and sizes for fields in a standard archive header.

const arDateOff = *ast.BinaryExpr

arDateSize const #

Offsets and sizes for fields in a standard archive header.

const arDateSize = 12

arFmagOff const #

Offsets and sizes for fields in a standard archive header.

const arFmagOff = *ast.BinaryExpr

arFmagSize const #

Offsets and sizes for fields in a standard archive header.

const arFmagSize = 2

arGIDOff const #

Offsets and sizes for fields in a standard archive header.

const arGIDOff = *ast.BinaryExpr

arGIDSize const #

Offsets and sizes for fields in a standard archive header.

const arGIDSize = 6

arHdrSize const #

Offsets and sizes for fields in a standard archive header.

const arHdrSize = *ast.BinaryExpr

arModeOff const #

Offsets and sizes for fields in a standard archive header.

const arModeOff = *ast.BinaryExpr

arModeSize const #

Offsets and sizes for fields in a standard archive header.

const arModeSize = 8

arNameOff const #

Offsets and sizes for fields in a standard archive header.

const arNameOff = 0

arNameSize const #

Offsets and sizes for fields in a standard archive header.

const arNameSize = 16

arSizeOff const #

Offsets and sizes for fields in a standard archive header.

const arSizeOff = *ast.BinaryExpr

arSizeSize const #

Offsets and sizes for fields in a standard archive header.

const arSizeSize = 10

arUIDOff const #

Offsets and sizes for fields in a standard archive header.

const arUIDOff = *ast.BinaryExpr

arUIDSize const #

Offsets and sizes for fields in a standard archive header.

const arUIDSize = 6

archiveMagic const #

const archiveMagic = "!

arfmag const #

The contents of the fmag field of a standard archive header.

const arfmag = "`\n"

armag const #

Magic strings for different archive file formats.

const armag = "!\n"

armagb const #

Magic strings for different archive file formats.

const armagb = "\n"

armagt const #

Magic strings for different archive file formats.

const armagt = "!\n"

gccgoBuiltinANY const #

const gccgoBuiltinANY = 22

gccgoBuiltinBOOL const #

const gccgoBuiltinBOOL = 15

gccgoBuiltinBYTE const #

const gccgoBuiltinBYTE = 20

gccgoBuiltinCOMPLEX128 const #

const gccgoBuiltinCOMPLEX128 = 18

gccgoBuiltinCOMPLEX64 const #

const gccgoBuiltinCOMPLEX64 = 17

gccgoBuiltinERROR const #

const gccgoBuiltinERROR = 19

gccgoBuiltinFLOAT32 const #

const gccgoBuiltinFLOAT32 = 9

gccgoBuiltinFLOAT64 const #

const gccgoBuiltinFLOAT64 = 10

gccgoBuiltinINT const #

const gccgoBuiltinINT = 11

gccgoBuiltinINT16 const #

const gccgoBuiltinINT16 = 2

gccgoBuiltinINT32 const #

const gccgoBuiltinINT32 = 3

gccgoBuiltinINT64 const #

const gccgoBuiltinINT64 = 4

gccgoBuiltinINT8 const #

From gofrontend/go/export.h Note that these values are negative in the gofrontend and have been made positive in the gccgoimporter.

const gccgoBuiltinINT8 = 1

gccgoBuiltinRUNE const #

const gccgoBuiltinRUNE = 21

gccgoBuiltinSTRING const #

const gccgoBuiltinSTRING = 16

gccgoBuiltinUINT const #

const gccgoBuiltinUINT = 12

gccgoBuiltinUINT16 const #

const gccgoBuiltinUINT16 = 6

gccgoBuiltinUINT32 const #

const gccgoBuiltinUINT32 = 7

gccgoBuiltinUINT64 const #

const gccgoBuiltinUINT64 = 8

gccgoBuiltinUINT8 const #

const gccgoBuiltinUINT8 = 5

gccgoBuiltinUINTPTR const #

const gccgoBuiltinUINTPTR = 13

gccgov1Magic const #

const gccgov1Magic = "v1;\n"

gccgov2Magic const #

const gccgov2Magic = "v2;\n"

gccgov3Magic const #

const gccgov3Magic = "v3;\n"

goimporterMagic const #

const goimporterMagic = "\n$$ "

reserved var #

reserved is a singleton type used to fill type map slots that have been reserved (i.e., for which a type number has been parsed) but which don't have their actual type yet. When the type map is updated, the actual type must replace a reserved entry (or we have an internal error). Used for self-verification only - not required for correctness.

var reserved = *ast.CallExpr

Type Aliases

Importer type #

An Importer resolves import paths to Packages. The imports map records packages already known, indexed by package path. An importer must determine the canonical package path and check imports to see if it is already present in the map. If so, the Importer can return the map entry. Otherwise, the importer must load the package data for the given path into a new *Package, record it in imports map, and return the package.

type Importer func(imports map[string]*types.Package, path string, srcDir string, lookup func(string) (io.ReadCloser, error)) (*types.Package, error)

Structs

GccgoInstallation struct #

Information about a specific installation of gccgo.

type GccgoInstallation struct {
GccVersion string
TargetTriple string
LibPaths []string
}

InitData struct #

The gccgo-specific init data for a package.

type InitData struct {
Priority int
Inits []PackageInit
}

PackageInit struct #

A PackageInit describes an imported package that needs initialization.

type PackageInit struct {
Name string
InitFunc string
Priority int
}

fixupRecord struct #

type fixupRecord struct {
toUpdate *types.Named
target types.Type
}

importError struct #

type importError struct {
pos scanner.Position
err error
}

parser struct #

type parser struct {
scanner *scanner.Scanner
version string
tok rune
lit string
pkgpath string
pkgname string
pkg *types.Package
imports map[string]*types.Package
typeList []types.Type
typeData []string
fixups []fixupRecord
initdata InitData
aliases map[int]string
}

seekerReadAt struct #

type seekerReadAt struct {
seeker io.ReadSeeker
}

Functions

Error method #

func (e importError) Error() string

GetImporter function #

func GetImporter(searchpaths []string, initmap map[*types.Package]InitData) Importer

GetImporter method #

Return an importer that searches incpaths followed by the gcc installation's built-in search paths and the current directory.

func (inst *GccgoInstallation) GetImporter(incpaths []string, initmap map[*types.Package]InitData) Importer

InitFromDriver method #

Ask the driver at the given path for information for this GccgoInstallation. The given arguments are passed directly to the call of the driver.

func (inst *GccgoInstallation) InitFromDriver(gccgoPath string, args ...string) (err error)

ReadAt method #

func (sra seekerReadAt) ReadAt(p []byte, off int64) (int, error)

SearchPaths method #

Return the list of export search paths for this GccgoInstallation.

func (inst *GccgoInstallation) SearchPaths() (paths []string)

aixBigArExportData function #

aixBigArExportData returns export data from an AIX big archive.

func aixBigArExportData(archive io.ReadSeeker) (io.ReadSeeker, error)

arExportData function #

arExportData takes an archive file and returns a ReadSeeker for the export data in that file. This assumes that there is only one object in the archive containing export data, which is not quite what gccgo does; gccgo concatenates together all the export data for all the objects in the file. In practice that case does not arise.

func arExportData(archive io.ReadSeeker) (io.ReadSeeker, error)

deref function #

func deref(typ types.Type) types.Type

elfFromAr function #

elfFromAr tries to get export data from an archive member as an ELF file. If there is no export data, this returns nil, nil.

func elfFromAr(member *io.SectionReader) (io.ReadSeeker, error)

error method #

func (p *parser) error(err any)

errorf method #

func (p *parser) errorf(format string, args ...any)

expect method #

func (p *parser) expect(tok rune) string

expectEOL method #

func (p *parser) expectEOL()

expectKeyword method #

func (p *parser) expectKeyword(keyword string)

findExportFile function #

Locate the file from which to read export data. This is intended to replicate the logic in gofrontend.

func findExportFile(searchpaths []string, pkgpath string) (string, error)

getPkg method #

getPkg returns the package for a given path. If the package is not found but we have a package name, create the package and add it to the p.imports map.

func (p *parser) getPkg(pkgpath string, name string) *types.Package

init method #

func (p *parser) init(filename string, src io.Reader, imports map[string]*types.Package)

initScanner method #

func (p *parser) initScanner(filename string, src io.Reader)

lookupBuiltinType function #

func lookupBuiltinType(typ int) types.Type

maybeCreatePackage method #

Create the package if we have parsed both the package path and package name.

func (p *parser) maybeCreatePackage()

next method #

func (p *parser) next()

openExportFile function #

Opens the export data file at the given path. If this is an ELF file, searches for and opens the .go_export section. If this is an archive, reads the export data from the first member, which is assumed to be an ELF file. This is intended to replicate the logic in gofrontend.

func openExportFile(fpath string) (reader io.ReadSeeker, closer io.Closer, err error)

parseArrayOrSliceType method #

ArrayOrSliceType = "[" [ int ] "]" Type .

func (p *parser) parseArrayOrSliceType(pkg *types.Package, nlist []any) types.Type

parseChanType method #

ChanType = "chan" ["<-" | "-<"] Type .

func (p *parser) parseChanType(pkg *types.Package, nlist []any) types.Type

parseConst method #

Const = Name [Type] "=" ConstValue .

func (p *parser) parseConst(pkg *types.Package) *types.Const

parseConstValue method #

ConstValue = string | "false" | "true" | ["-"] (int ["'"] | FloatOrComplex) | Conversion . FloatOrComplex = float ["i" | ("+"|"-") float "i"] .

func (p *parser) parseConstValue(pkg *types.Package) (val constant.Value, typ types.Type)

parseConversion method #

Conversion = "convert" "(" Type "," ConstValue ")" .

func (p *parser) parseConversion(pkg *types.Package) (val constant.Value, typ types.Type)

parseDirective method #

Directive = InitDataDirective | "package" unquotedString [ unquotedString ] [ unquotedString ] ";" | "pkgpath" unquotedString ";" | "prefix" unquotedString ";" | "import" unquotedString unquotedString string ";" | "indirectimport" unquotedString unquotedstring ";" | "func" Func ";" | "type" Type ";" | "var" Var ";" | "const" Const ";" .

func (p *parser) parseDirective()

parseExportedName method #

parseExportedName is like parseQualifiedName, but the package path is resolved to an imported *types.Package. ExportedName = string [string] .

func (p *parser) parseExportedName() (pkg *types.Package, name string)

parseField method #

Field = Name Type [string] .

func (p *parser) parseField(pkg *types.Package) (field *types.Var, tag string)

parseFunc method #

Func = Name FunctionType [InlineBody] .

func (p *parser) parseFunc(pkg *types.Package) *types.Func

parseFunctionType method #

FunctionType = ParamList ResultList .

func (p *parser) parseFunctionType(pkg *types.Package, nlist []any) *types.Signature

parseInitDataDirective method #

InitDataDirective = ( "v1" | "v2" | "v3" ) ";" | "priority" int ";" | "init" { PackageInit } ";" | "checksum" unquotedString ";" .

func (p *parser) parseInitDataDirective()

parseInt method #

func (p *parser) parseInt() int

parseInt64 method #

func (p *parser) parseInt64() int64

parseInterfaceType method #

InterfaceType = "interface" "{" { ("?" Type | Func) ";" } "}" .

func (p *parser) parseInterfaceType(pkg *types.Package, nlist []any) types.Type

parseMapType method #

MapType = "map" "[" Type "]" Type .

func (p *parser) parseMapType(pkg *types.Package, nlist []any) types.Type

parseName method #

Name = QualifiedName | "?" .

func (p *parser) parseName() string

parseNamedType method #

NamedType = TypeName [ "=" ] Type { Method } . TypeName = ExportedName . Method = "func" "(" Param ")" Name ParamList ResultList [InlineBody] ";" .

func (p *parser) parseNamedType(nlist []any) types.Type

parsePackage method #

Package = { Directive } .

func (p *parser) parsePackage() *types.Package

parsePackageInit method #

PackageInit = unquotedString unquotedString int .

func (p *parser) parsePackageInit() PackageInit

parseParam method #

Param = Name ["..."] Type .

func (p *parser) parseParam(pkg *types.Package) (param *types.Var, isVariadic bool)

parseParamList method #

ParamList = "(" [ { Parameter "," } Parameter ] ")" .

func (p *parser) parseParamList(pkg *types.Package) (*types.Tuple, bool)

parsePointerType method #

PointerType = "*" ("any" | Type) .

func (p *parser) parsePointerType(pkg *types.Package, nlist []any) types.Type

parseQualifiedName method #

func (p *parser) parseQualifiedName() (path string, name string)

parseQualifiedNameStr method #

qualifiedName = [ ["."] unquotedString "." ] unquotedString . The above production uses greedy matching.

func (p *parser) parseQualifiedNameStr(unquotedName string) (pkgpath string, name string)

parseResultList method #

ResultList = Type | ParamList .

func (p *parser) parseResultList(pkg *types.Package) *types.Tuple

parseSavedType method #

parseSavedType parses one saved type definition.

func (p *parser) parseSavedType(pkg *types.Package, i int, nlist []any)

parseString method #

func (p *parser) parseString() string

parseStructType method #

StructType = "struct" "{" { Field } "}" .

func (p *parser) parseStructType(pkg *types.Package, nlist []any) types.Type

parseType method #

Type = "<" "type" ( "-" int | int [ TypeSpec ] ) ">" . parseType updates the type map to t for all type numbers n.

func (p *parser) parseType(pkg *types.Package, n ...any) types.Type

parseTypeAfterAngle method #

(*parser).Type after reading the "<".

func (p *parser) parseTypeAfterAngle(pkg *types.Package, n ...any) (t types.Type, n1 int)

parseTypeExtended method #

parseTypeExtended is identical to parseType, but if the type in question is a saved type, returns the index as well as the type pointer (index returned is zero if we parsed a builtin).

func (p *parser) parseTypeExtended(pkg *types.Package, n ...any) (t types.Type, n1 int)

parseTypeSpec method #

TypeSpec = NamedType | MapType | ChanType | StructType | InterfaceType | PointerType | ArrayOrSliceType | FunctionType .

func (p *parser) parseTypeSpec(pkg *types.Package, nlist []any) types.Type

parseTypes method #

Types = "types" maxp1 exportedp1 (offset length)* .

func (p *parser) parseTypes(pkg *types.Package)

parseUnquotedQualifiedName method #

func (p *parser) parseUnquotedQualifiedName() (path string, name string)

parseUnquotedString method #

unquotedString = { unquotedStringChar } . unquotedStringChar = .

func (p *parser) parseUnquotedString() string

parseVar method #

Var = Name Type .

func (p *parser) parseVar(pkg *types.Package) *types.Var

readMagic function #

readMagic reads the four bytes at the start of a ReadSeeker and returns them as a string.

func readMagic(reader io.ReadSeeker) (string, error)

readerAtFromSeeker function #

readerAtFromSeeker turns an io.ReadSeeker into an io.ReaderAt. This is only safe because there won't be any concurrent seeks while this code is executing.

func readerAtFromSeeker(rs io.ReadSeeker) io.ReaderAt

reserve method #

reserve reserves the type map entry n for future use.

func (p *parser) reserve(n int)

skipInlineBody method #

InlineBody = "" .{NN} Reports whether a body was skipped.

func (p *parser) skipInlineBody()

standardArExportData function #

standardArExportData returns export data from a standard archive.

func standardArExportData(archive io.ReadSeeker) (io.ReadSeeker, error)

update method #

update sets the type map entries for the entries in nlist to t. An entry in nlist can be a type number in p.typeList, used to resolve named types, or it can be a *types.Pointer, used to resolve pointers to named types in case they are referenced by embedded fields.

func (p *parser) update(t types.Type, nlist []any)

Generated with Arrow