From 9350942b20bf1e6e2b182159f5837ba209485972 Mon Sep 17 00:00:00 2001 From: Peter Collingbourne Date: Wed, 31 Dec 2014 00:25:32 +0000 Subject: [PATCH] irgen, driver: modify Compiler.Compile to take a FileSet and Files This change allows clients to generate IR using "files" received from locations other than the file system. The regular file parser is moved to a new library, "driver", which is intended to eventually contain much of the logic from the existing driver. Differential Revision: http://reviews.llvm.org/D6794 llvm-svn: 225026 --- llgo/CMakeLists.txt | 2 +- llgo/cmd/gllgo/gllgo.go | 10 +++++++++- llgo/{irgen => driver}/parser.go | 5 +++-- llgo/irgen/compiler.go | 15 +++++---------- 4 files changed, 18 insertions(+), 14 deletions(-) rename llgo/{irgen => driver}/parser.go (88%) diff --git a/llgo/CMakeLists.txt b/llgo/CMakeLists.txt index 51d20c2263c5..b4ec074f6411 100644 --- a/llgo/CMakeLists.txt +++ b/llgo/CMakeLists.txt @@ -11,6 +11,7 @@ llvm_add_go_executable(llgo llvm.org/llgo/cmd/gllgo ALL DEPENDS build/context.go cmd/gllgo/gllgo.go debug/debug.go + driver/parser.go irgen/annotations.go irgen/attribute.go irgen/builtins.go @@ -23,7 +24,6 @@ llvm_add_go_executable(llgo llvm.org/llgo/cmd/gllgo ALL DEPENDS irgen/indirect.go irgen/interfaces.go irgen/maps.go - irgen/parser.go irgen/predicates.go irgen/println.go irgen/runtime.go diff --git a/llgo/cmd/gllgo/gllgo.go b/llgo/cmd/gllgo/gllgo.go index db25ccf238fe..e58686e57dc0 100644 --- a/llgo/cmd/gllgo/gllgo.go +++ b/llgo/cmd/gllgo/gllgo.go @@ -23,6 +23,7 @@ import ( "errors" "fmt" "go/scanner" + "go/token" "io/ioutil" "log" "os" @@ -31,6 +32,7 @@ import ( "strings" "llvm.org/llgo/debug" + "llvm.org/llgo/driver" "llvm.org/llgo/irgen" "llvm.org/llvm/bindings/go/llvm" ) @@ -580,7 +582,13 @@ func performAction(opts *driverOptions, kind actionKind, inputs []string, output return err } - module, err := compiler.Compile(inputs, opts.pkgpath) + fset := token.NewFileSet() + files, err := driver.ParseFiles(fset, inputs) + if err != nil { + return err + } + + module, err := compiler.Compile(fset, files, opts.pkgpath) if err != nil { return err } diff --git a/llgo/irgen/parser.go b/llgo/driver/parser.go similarity index 88% rename from llgo/irgen/parser.go rename to llgo/driver/parser.go index 143134b13f14..07600f41d441 100644 --- a/llgo/irgen/parser.go +++ b/llgo/driver/parser.go @@ -12,7 +12,7 @@ // //===----------------------------------------------------------------------===// -package irgen +package driver import ( "fmt" @@ -23,11 +23,12 @@ import ( ) func parseFile(fset *token.FileSet, filename string) (*ast.File, error) { + // Retain comments; this is important for annotation processing. mode := parser.DeclarationErrors | parser.ParseComments return parser.ParseFile(fset, filename, nil, mode) } -func parseFiles(fset *token.FileSet, filenames []string) ([]*ast.File, error) { +func ParseFiles(fset *token.FileSet, filenames []string) ([]*ast.File, error) { files := make([]*ast.File, len(filenames)) for i, filename := range filenames { file, err := parseFile(fset, filename) diff --git a/llgo/irgen/compiler.go b/llgo/irgen/compiler.go index f7d16559f295..de496fffe7cb 100644 --- a/llgo/irgen/compiler.go +++ b/llgo/irgen/compiler.go @@ -16,6 +16,7 @@ package irgen import ( "bytes" "fmt" + "go/ast" "go/token" "log" "sort" @@ -102,7 +103,7 @@ func NewCompiler(opts CompilerOptions) (*Compiler, error) { return compiler, nil } -func (c *Compiler) Compile(filenames []string, importpath string) (m *Module, err error) { +func (c *Compiler) Compile(fset *token.FileSet, astFiles []*ast.File, importpath string) (m *Module, err error) { target := llvm.NewTargetData(c.dataLayout) compiler := &compiler{ CompilerOptions: c.opts, @@ -111,7 +112,7 @@ func (c *Compiler) Compile(filenames []string, importpath string) (m *Module, er pnacl: c.pnacl, llvmtypes: NewLLVMTypeMap(llvm.GlobalContext(), target), } - return compiler.compile(filenames, importpath) + return compiler.compile(fset, astFiles, importpath) } type compiler struct { @@ -149,7 +150,7 @@ func (c *compiler) addCommonFunctionAttrs(fn llvm.Value) { } } -func (compiler *compiler) compile(filenames []string, importpath string) (m *Module, err error) { +func (compiler *compiler) compile(fset *token.FileSet, astFiles []*ast.File, importpath string) (m *Module, err error) { buildctx, err := llgobuild.ContextFromTriple(compiler.TargetTriple) if err != nil { return nil, err @@ -170,19 +171,13 @@ func (compiler *compiler) compile(filenames []string, importpath string) (m *Mod } impcfg := &loader.Config{ - Fset: token.NewFileSet(), + Fset: fset, 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 == "" {