llcppsigfetch:based on language configuration analysis
This commit is contained in:
@@ -51,9 +51,10 @@ var tagMap = map[string]ast.Tag{
|
||||
}
|
||||
|
||||
type Config struct {
|
||||
File string
|
||||
Temp bool
|
||||
Args []string
|
||||
File string
|
||||
Temp bool
|
||||
Args []string
|
||||
IsCpp bool
|
||||
}
|
||||
|
||||
func NewConverter(config *Config) (*Converter, error) {
|
||||
@@ -72,12 +73,16 @@ func NewConverter(config *Config) (*Converter, error) {
|
||||
}
|
||||
|
||||
func CreateTranslationUnit(config *Config) (*clang.Index, *clang.TranslationUnit, error) {
|
||||
if config.Args == nil || len(config.Args) == 0 {
|
||||
config.Args = []string{"-x", "c++", "-std=c++11"}
|
||||
// default use the c/c++ standard of clang; c:gnu17 c++:gnu++17
|
||||
// https://clang.llvm.org/docs/CommandGuide/clang.html
|
||||
defaultArgs := []string{"-x", "c"}
|
||||
if config.IsCpp {
|
||||
defaultArgs = []string{"-x", "c++"}
|
||||
}
|
||||
allArgs := append(defaultArgs, config.Args...)
|
||||
|
||||
cArgs := make([]*c.Char, len(config.Args))
|
||||
for i, arg := range config.Args {
|
||||
cArgs := make([]*c.Char, len(allArgs))
|
||||
for i, arg := range allArgs {
|
||||
cArgs[i] = c.AllocaCStr(arg)
|
||||
}
|
||||
|
||||
@@ -418,6 +423,7 @@ func (ct *Converter) GenerateAnonymousName(cursor clang.Cursor) string {
|
||||
}
|
||||
|
||||
// converts functions, methods, constructors, destructors (including out-of-class decl) to ast.FuncDecl nodes.
|
||||
// todo(zzy): manglename (c++)
|
||||
func (ct *Converter) ProcessFuncDecl(cursor clang.Cursor) *ast.FuncDecl {
|
||||
name := cursor.String()
|
||||
defer name.Dispose()
|
||||
|
||||
@@ -13,8 +13,9 @@ import (
|
||||
func RunTest(testName string, testCases []string) {
|
||||
for i, content := range testCases {
|
||||
converter, err := parse.NewConverter(&parse.Config{
|
||||
File: content,
|
||||
Temp: true,
|
||||
File: content,
|
||||
Temp: true,
|
||||
IsCpp: true,
|
||||
})
|
||||
if err != nil {
|
||||
panic(err)
|
||||
@@ -45,9 +46,16 @@ type GetTypeOptions struct {
|
||||
ExpectTypeKind clang.TypeKind
|
||||
|
||||
// Args contains additional compilation arguments passed to Clang (optional)
|
||||
// Default is []string{"-x", "c++", "-std=c++11"}
|
||||
// *For complex C types, C language args Must be specified, e.g., []string{"-x", "c", "-std=c99"}
|
||||
// These are appended after the default language-specific arguments
|
||||
// Example: []string{"-std=c++11"}
|
||||
Args []string
|
||||
|
||||
// IsCpp indicates whether the code should be treated as C++ (true) or C (false)
|
||||
// This affects the default language arguments passed to Clang:
|
||||
// - For C++: []string{"-x", "c++"}
|
||||
// - For C: []string{"-x", "c"}
|
||||
// *For complex C types, C Must be specified
|
||||
IsCpp bool
|
||||
}
|
||||
|
||||
// GetType returns the clang.Type of the given type code
|
||||
@@ -56,9 +64,10 @@ type GetTypeOptions struct {
|
||||
func GetType(option *GetTypeOptions) (clang.Type, *clang.Index, *clang.TranslationUnit) {
|
||||
code := fmt.Sprintf("%s placeholder;", option.TypeCode)
|
||||
index, unit, err := parse.CreateTranslationUnit(&parse.Config{
|
||||
File: code,
|
||||
Temp: true,
|
||||
Args: option.Args,
|
||||
File: code,
|
||||
Temp: true,
|
||||
Args: option.Args,
|
||||
IsCpp: option.IsCpp,
|
||||
})
|
||||
if err != nil {
|
||||
panic(err)
|
||||
|
||||
@@ -128,6 +128,7 @@ func TestNonBuiltinTypes() {
|
||||
for _, t := range tests {
|
||||
typ, index, unit := test.GetType(&test.GetTypeOptions{
|
||||
TypeCode: t,
|
||||
IsCpp: true,
|
||||
})
|
||||
converter := &parse.Converter{}
|
||||
expr := converter.ProcessType(typ)
|
||||
@@ -167,7 +168,7 @@ func getComplexType(flag ast.TypeFlag) clang.Type {
|
||||
typ, _, _ := test.GetType(&test.GetTypeOptions{
|
||||
TypeCode: code,
|
||||
ExpectTypeKind: clang.TypeComplex,
|
||||
Args: []string{"-x", "c", "-std=c99"},
|
||||
IsCpp: false,
|
||||
})
|
||||
|
||||
return typ
|
||||
|
||||
@@ -10,11 +10,13 @@ import (
|
||||
|
||||
type Context struct {
|
||||
Files map[string]*ast.File
|
||||
IsCpp bool
|
||||
}
|
||||
|
||||
func NewContext() *Context {
|
||||
func NewContext(isCpp bool) *Context {
|
||||
return &Context{
|
||||
Files: make(map[string]*ast.File),
|
||||
IsCpp: isCpp,
|
||||
}
|
||||
}
|
||||
|
||||
@@ -60,8 +62,9 @@ func (p *Context) processFile(path string) error {
|
||||
|
||||
func (p *Context) parseFile(path string) (map[string]*ast.File, error) {
|
||||
converter, err := NewConverter(&Config{
|
||||
File: path,
|
||||
Temp: false,
|
||||
File: path,
|
||||
Temp: false,
|
||||
IsCpp: p.IsCpp,
|
||||
})
|
||||
if err != nil {
|
||||
return nil, errors.New("failed to create converter " + path)
|
||||
|
||||
Reference in New Issue
Block a user