Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions lldb/include/lldb/Core/Mangled.h
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@ class Mangled {
eManglingSchemeNone = 0,
eManglingSchemeMSVC,
eManglingSchemeItanium,
eManglingSchemeOxCaml,
eManglingSchemeRustV0,
eManglingSchemeD
};
Expand Down
20 changes: 20 additions & 0 deletions lldb/source/Core/Mangled.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,9 @@ Mangled::ManglingScheme Mangled::GetManglingScheme(llvm::StringRef const name) {
if (name.startswith("?"))
return Mangled::eManglingSchemeMSVC;

if (name.startswith("_Caml") || name.startswith("__Caml"))
return Mangled::eManglingSchemeOxCaml;

if (name.startswith("_R"))
return Mangled::eManglingSchemeRustV0;

Expand Down Expand Up @@ -167,6 +170,19 @@ static char *GetItaniumDemangledStr(const char *M) {
return demangled_cstr;
}

static char *GetOxCamlDemangledStr(const char *M) {
char *demangled_cstr = llvm::oxcamlDemangle(M);

if (Log *log = GetLog(LLDBLog::Demangle)) {
if (demangled_cstr && demangled_cstr[0])
LLDB_LOG(log, "demangled oxcaml: {0} -> \"{1}\"", M, demangled_cstr);
else
LLDB_LOG(log, "demangled oxcaml: {0} -> error: failed to demangle", M);
}

return demangled_cstr;
}

static char *GetRustV0DemangledStr(const char *M) {
char *demangled_cstr = llvm::rustDemangle(M);

Expand Down Expand Up @@ -242,6 +258,7 @@ bool Mangled::GetRichManglingInfo(RichManglingContext &context,
}
}

case eManglingSchemeOxCaml:
case eManglingSchemeRustV0:
case eManglingSchemeD:
// Rich demangling scheme is not supported
Expand Down Expand Up @@ -275,6 +292,9 @@ ConstString Mangled::GetDemangledName() const {
demangled_name = GetItaniumDemangledStr(mangled_name);
break;
}
case eManglingSchemeOxCaml:
demangled_name = GetOxCamlDemangledStr(mangled_name);
break;
case eManglingSchemeRustV0:
demangled_name = GetRustV0DemangledStr(mangled_name);
break;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2429,7 +2429,7 @@ DWARFASTParserClang::ParseFunctionFromDWARF(CompileUnit &comp_unit,
// "main" as its name is never mangled.
func_name.SetValue(ConstructDemangledNameFromDWARF(die), false);
} else
func_name.SetValue(ConstString(name), false);
func_name.SetValue(ConstString(name));

FunctionSP func_sp;
std::unique_ptr<Declaration> decl_up;
Expand Down
12 changes: 11 additions & 1 deletion lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1338,7 +1338,17 @@ size_t SymbolFileDWARF::ParseBlocksRecursive(
comp_unit.GetSupportFiles().GetFileSpecAtIndex(call_file),
call_line, call_column);

block->SetInlinedFunctionInfo(name, mangled_name, decl_up.get(),
// If mangled_name is NULL but name is mangled (e.g., OxCaml symbols),
// swap them so the Mangled class can handle demangling correctly
const char *use_name = name;
const char *use_mangled = mangled_name;
if (mangled_name == nullptr && name != nullptr &&
Mangled::GetManglingScheme(name) != Mangled::eManglingSchemeNone) {
use_mangled = name;
use_name = nullptr;
}

block->SetInlinedFunctionInfo(use_name, use_mangled, decl_up.get(),
call_up.get());
}

Expand Down
1 change: 1 addition & 0 deletions lldb/source/Symbol/Symtab.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -255,6 +255,7 @@ static bool lldb_skip_name(llvm::StringRef mangled,

// No filters for this scheme yet. Include all names in indexing.
case Mangled::eManglingSchemeMSVC:
case Mangled::eManglingSchemeOxCaml:
case Mangled::eManglingSchemeRustV0:
case Mangled::eManglingSchemeD:
return false;
Expand Down
3 changes: 3 additions & 0 deletions llvm/include/llvm/Demangle/Demangle.h
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,9 @@ char *microsoftDemangle(const char *mangled_name, size_t *n_read, char *buf,
size_t *n_buf, int *status,
MSDemangleFlags Flags = MSDF_None);

// Demangles an OxCaml mangled symbol
char *oxcamlDemangle(const char *MangledName);

// Demangles a Rust v0 mangled symbol.
char *rustDemangle(const char *MangledName);

Expand Down
1 change: 1 addition & 0 deletions llvm/lib/Demangle/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ add_llvm_component_library(LLVMDemangle
ItaniumDemangle.cpp
MicrosoftDemangle.cpp
MicrosoftDemangleNodes.cpp
OxCamlDemangle.cpp
RustDemangle.cpp
DLangDemangle.cpp

Expand Down
6 changes: 6 additions & 0 deletions llvm/lib/Demangle/Demangle.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,10 @@ static bool isItaniumEncoding(const char *S) {
return std::strncmp(S, "_Z", 2) == 0 || std::strncmp(S, "___Z", 4) == 0;
}

static bool isOxCamlEncoding(const char *S) {
return std::strncmp(S, "_Caml", 5) == 0 || std::strncmp(S, "__Caml", 6) == 0;
}

static bool isRustEncoding(const char *S) { return S[0] == '_' && S[1] == 'R'; }

static bool isDLangEncoding(const std::string &MangledName) {
Expand Down Expand Up @@ -54,6 +58,8 @@ bool llvm::nonMicrosoftDemangle(const char *MangledName, std::string &Result) {
Demangled = rustDemangle(MangledName);
else if (isDLangEncoding(MangledName))
Demangled = dlangDemangle(MangledName);
else if (isOxCamlEncoding(MangledName))
Demangled = oxcamlDemangle(MangledName);

if (!Demangled)
return false;
Expand Down
Loading