llcppsymg:remove leading underscores

This commit is contained in:
luoliwoshang
2024-10-10 12:21:20 +08:00
parent 60aa74257f
commit 7bd3b29a11
4 changed files with 16 additions and 14 deletions

View File

@@ -46,10 +46,10 @@ Before: Class: INIReader, Method: HasValue After: (*Reader).HasValue
=== Test Case: C++ Class with Methods === === Test Case: C++ Class with Methods ===
Parsed Symbols: Parsed Symbols:
Symbol Map GoName: (*Reader).Init__1, ProtoName In HeaderFile: INIReader::INIReader(const char *, int), MangledName: _ZN9INIReaderC1EPKci Symbol Map GoName: (*Reader).Init__1, ProtoName In HeaderFile: INIReader::INIReader(const char *, int), MangledName: ZN9INIReaderC1EPKci
Symbol Map GoName: (*Reader).Init, ProtoName In HeaderFile: INIReader::INIReader(const int &), MangledName: _ZN9INIReaderC1ERKi Symbol Map GoName: (*Reader).Init, ProtoName In HeaderFile: INIReader::INIReader(const int &), MangledName: ZN9INIReaderC1ERKi
Symbol Map GoName: (*Reader).Dispose, ProtoName In HeaderFile: INIReader::~INIReader(), MangledName: _ZN9INIReaderD1Ev Symbol Map GoName: (*Reader).Dispose, ProtoName In HeaderFile: INIReader::~INIReader(), MangledName: ZN9INIReaderD1Ev
Symbol Map GoName: (*Reader).ParseError, ProtoName In HeaderFile: INIReader::ParseError(), MangledName: _ZNK9INIReader10ParseErrorEv Symbol Map GoName: (*Reader).ParseError, ProtoName In HeaderFile: INIReader::ParseError(), MangledName: ZNK9INIReader10ParseErrorEv
=== Test Case: C Functions === === Test Case: C Functions ===
Parsed Symbols: Parsed Symbols:

View File

@@ -1,23 +1,23 @@
#stdout #stdout
=== Test Case: inireader === === Test Case: inireader ===
[{ [{
"mangle": "_ZN9INIReaderC1EPKc", "mangle": "ZN9INIReaderC1EPKc",
"c++": "INIReader::INIReader(const char *)", "c++": "INIReader::INIReader(const char *)",
"go": "(*Reader).Init" "go": "(*Reader).Init"
}, { }, {
"mangle": "_ZN9INIReaderC1EPKcl", "mangle": "ZN9INIReaderC1EPKcl",
"c++": "INIReader::INIReader(const char *, long)", "c++": "INIReader::INIReader(const char *, long)",
"go": "(*Reader).Init__1" "go": "(*Reader).Init__1"
}, { }, {
"mangle": "_ZN9INIReaderD1Ev", "mangle": "ZN9INIReaderD1Ev",
"c++": "INIReader::~INIReader()", "c++": "INIReader::~INIReader()",
"go": "(*Reader).Dispose" "go": "(*Reader).Dispose"
}, { }, {
"mangle": "_ZNK9INIReader10ParseErrorEv", "mangle": "ZNK9INIReader10ParseErrorEv",
"c++": "INIReader::ParseError()", "c++": "INIReader::ParseError()",
"go": "(*Reader).ModifyedParseError" "go": "(*Reader).ParseError"
}, { }, {
"mangle": "_ZNK9INIReader3GetEPKcS1_S1_", "mangle": "ZNK9INIReader3GetEPKcS1_S1_",
"c++": "INIReader::Get(const char *, const char *, const char *)", "c++": "INIReader::Get(const char *, const char *, const char *)",
"go": "(*Reader).Get" "go": "(*Reader).Get"
}] }]

View File

@@ -132,10 +132,12 @@ func (p *SymbolProcessor) collectFuncInfo(cursor clang.Cursor) {
symbol := cursor.Mangling() symbol := cursor.Mangling()
defer symbol.Dispose() defer symbol.Dispose()
// Remove all leading underscores from C++ symbol names
// On Linux, C++ symbols typically have one leading underscore
// On macOS, C++ symbols may have two leading underscores
// We remove all leading underscores to handle both cases consistently
symbolName := c.GoString(symbol.CStr()) symbolName := c.GoString(symbol.CStr())
if len(symbolName) >= 1 && symbolName[0] == '_' { symbolName = strings.TrimLeft(symbolName, "_")
symbolName = symbolName[1:]
}
p.SymbolMap[symbolName] = &SymbolInfo{ p.SymbolMap[symbolName] = &SymbolInfo{
GoName: p.genGoName(cursor), GoName: p.genGoName(cursor),
ProtoName: p.genProtoName(cursor), ProtoName: p.genProtoName(cursor),

View File

@@ -88,7 +88,7 @@ func ParseDylibSymbols(lib string) ([]*nm.Symbol, error) {
func GetCommonSymbols(dylibSymbols []*nm.Symbol, headerSymbols map[string]*parse.SymbolInfo) []*types.SymbolInfo { func GetCommonSymbols(dylibSymbols []*nm.Symbol, headerSymbols map[string]*parse.SymbolInfo) []*types.SymbolInfo {
var commonSymbols []*types.SymbolInfo var commonSymbols []*types.SymbolInfo
for _, dylibSym := range dylibSymbols { for _, dylibSym := range dylibSymbols {
symName := strings.TrimPrefix(dylibSym.Name, "_") symName := strings.TrimLeft(dylibSym.Name, "_")
if symInfo, ok := headerSymbols[symName]; ok { if symInfo, ok := headerSymbols[symName]; ok {
symbolInfo := &types.SymbolInfo{ symbolInfo := &types.SymbolInfo{
Mangle: symName, Mangle: symName,