mirror of
https://github.com/capstone-engine/llvm-capstone.git
synced 2025-02-17 16:31:02 +00:00
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
This commit is contained in:
parent
bc405294f0
commit
9350942b20
@ -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
|
||||
|
@ -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
|
||||
}
|
||||
|
@ -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)
|
@ -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 == "" {
|
||||
|
Loading…
x
Reference in New Issue
Block a user