func checkPkgFiles(files []*ast.File) { type bailout struct{} conf := types.Config{ FakeImportC: true, Error: func(err error) { if !*allErrors && errorCount >= 10 { panic(bailout{}) } report(err) }, Sizes: sizes, } if *gccgo { var inst gccgoimporter.GccgoInstallation inst.InitFromDriver("gccgo") conf.Import = inst.GetImporter(nil, nil) } defer func() { switch p := recover().(type) { case nil, bailout: // normal return or early exit default: // re-panic panic(p) } }() const path = "pkg" // any non-empty string will do for now conf.Check(path, fset, files, nil) }
func init() { incpaths := []string{"/"} // importer for default gccgo var inst gccgoimporter.GccgoInstallation inst.InitFromDriver("gccgo") register("gccgo", inst.GetImporter(incpaths, initmap)) }
func (compiler *compiler) compile(filenames []string, importpath string) (m *Module, err error) { buildctx, err := llgobuild.ContextFromTriple(compiler.TargetTriple) if err != nil { return nil, err } initmap := make(map[*types.Package]gccgoimporter.InitData) var importer types.Importer if compiler.GccgoPath == "" { paths := append(append([]string{}, compiler.ImportPaths...), ".") importer = gccgoimporter.GetImporter(paths, initmap) } else { var inst gccgoimporter.GccgoInstallation err = inst.InitFromDriver(compiler.GccgoPath) if err != nil { return nil, err } importer = inst.GetImporter(compiler.ImportPaths, initmap) } impcfg := &loader.Config{ Fset: token.NewFileSet(), TypeChecker: types.Config{ Import: importer, Sizes: compiler.llvmtypes, }, Build: &buildctx.Context, } // Must use parseFiles, so we retain comments; // this is important for annotation processing. astFiles, err := parseFiles(impcfg.Fset, filenames) if err != nil { return nil, err } // If no import path is specified, then set the import // path to be the same as the package's name. if importpath == "" { importpath = astFiles[0].Name.String() } impcfg.CreateFromFiles(importpath, astFiles...) iprog, err := impcfg.Load() if err != nil { return nil, err } program := ssa.Create(iprog, ssa.BareInits) mainPkginfo := iprog.InitialPackages()[0] mainPkg := program.CreatePackage(mainPkginfo) // Create a Module, which contains the LLVM module. modulename := importpath compiler.module = &Module{Module: llvm.NewModule(modulename), Path: modulename} compiler.module.SetTarget(compiler.TargetTriple) compiler.module.SetDataLayout(compiler.dataLayout) // Create a new translation unit. unit := newUnit(compiler, mainPkg) // Create the runtime interface. compiler.runtime, err = newRuntimeInterface(compiler.module.Module, compiler.llvmtypes) if err != nil { return nil, err } mainPkg.Build() // Create a struct responsible for mapping static types to LLVM types, // and to runtime/dynamic type values. compiler.types = NewTypeMap( mainPkg, compiler.llvmtypes, compiler.module.Module, compiler.runtime, MethodResolver(unit), ) if compiler.GenerateDebug { compiler.debug = debug.NewDIBuilder( types.Sizes(compiler.llvmtypes), compiler.module.Module, impcfg.Fset, compiler.DebugPrefixMaps, ) defer compiler.debug.Destroy() defer compiler.debug.Finalize() } unit.translatePackage(mainPkg) compiler.processAnnotations(unit, mainPkginfo) if importpath == "main" { if err = compiler.createInitMainFunction(mainPkg, initmap); err != nil { return nil, fmt.Errorf("failed to create __go_init_main: %v", err) } } else { compiler.module.ExportData = compiler.buildExportData(mainPkg, initmap) } return compiler.module, nil }