Skip to content

Commit 72f74b7

Browse files
authored
dwarf_extractor.cpp: Enable limited support for C++ (#3540)
While band-aid fixes like this is not plausible IMO, some people prefer to have some debug info even if it's partial/limited/broken. This commit partially (re)enables C++ processing. On the other hand, do not bother to process variables because it's known incompatible with C++.
1 parent fa8a80a commit 72f74b7

1 file changed

Lines changed: 67 additions & 50 deletions

File tree

core/iwasm/compilation/debug/dwarf_extractor.cpp

Lines changed: 67 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -305,13 +305,22 @@ lldb_function_to_function_dbi(const AOTCompContext *comp_ctx,
305305
* https://github.com/bytecodealliance/wasm-micro-runtime/issues/3163
306306
*/
307307
LanguageType language_type = function.GetLanguage();
308+
bool cplusplus = false;
308309
switch (language_type) {
309310
case eLanguageTypeC89:
310311
case eLanguageTypeC:
311312
case eLanguageTypeC99:
312313
case eLanguageTypeC11:
313314
case eLanguageTypeC17:
314315
break;
316+
case eLanguageTypeC_plus_plus:
317+
case eLanguageTypeC_plus_plus_03:
318+
case eLanguageTypeC_plus_plus_11:
319+
case eLanguageTypeC_plus_plus_14:
320+
case eLanguageTypeC_plus_plus_17:
321+
case eLanguageTypeC_plus_plus_20:
322+
cplusplus = true;
323+
break;
315324
default:
316325
LOG_WARNING("func %s has unsupported language_type 0x%x",
317326
function_name, (int)language_type);
@@ -325,28 +334,32 @@ lldb_function_to_function_dbi(const AOTCompContext *comp_ctx,
325334
LLVMMetadataRef File = comp_ctx->debug_file; /* a fallback */
326335

327336
LLVMMetadataRef ParamTypes[num_function_args + 1];
328-
329-
ParamTypes[0] = lldb_type_to_type_dbi(comp_ctx, return_type);
330-
331-
for (uint32_t function_arg_idx = 0; function_arg_idx < num_function_args;
332-
++function_arg_idx) {
333-
SBType function_arg_type =
334-
function_args.GetTypeAtIndex(function_arg_idx);
335-
336-
if (function_arg_type.IsValid()) {
337-
ParamTypes[function_arg_idx + 1] =
338-
lldb_type_to_type_dbi(comp_ctx, function_arg_type);
339-
if (ParamTypes[function_arg_idx + 1] == NULL) {
340-
LOG_WARNING(
341-
"func %s arg %" PRIu32
342-
" has a type not implemented by lldb_type_to_type_dbi",
343-
function_name, function_arg_idx);
344-
}
345-
}
346-
else {
347-
LOG_WARNING("func %s arg %" PRIu32 ": GetTypeAtIndex failed",
337+
size_t num_param_types = 0;
338+
339+
if (!cplusplus) {
340+
num_param_types = num_function_args + 1;
341+
ParamTypes[0] = lldb_type_to_type_dbi(comp_ctx, return_type);
342+
343+
for (uint32_t function_arg_idx = 0;
344+
function_arg_idx < num_function_args; ++function_arg_idx) {
345+
SBType function_arg_type =
346+
function_args.GetTypeAtIndex(function_arg_idx);
347+
348+
if (function_arg_type.IsValid()) {
349+
ParamTypes[function_arg_idx + 1] =
350+
lldb_type_to_type_dbi(comp_ctx, function_arg_type);
351+
if (ParamTypes[function_arg_idx + 1] == NULL) {
352+
LOG_WARNING(
353+
"func %s arg %" PRIu32
354+
" has a type not implemented by lldb_type_to_type_dbi",
348355
function_name, function_arg_idx);
349-
ParamTypes[function_arg_idx + 1] = NULL;
356+
}
357+
}
358+
else {
359+
LOG_WARNING("func %s arg %" PRIu32 ": GetTypeAtIndex failed",
360+
function_name, function_arg_idx);
361+
ParamTypes[function_arg_idx + 1] = NULL;
362+
}
350363
}
351364
}
352365

@@ -366,7 +379,7 @@ lldb_function_to_function_dbi(const AOTCompContext *comp_ctx,
366379
}
367380

368381
LLVMMetadataRef FunctionTy = LLVMDIBuilderCreateSubroutineType(
369-
DIB, File, ParamTypes, num_function_args + 1, LLVMDIFlagZero);
382+
DIB, File, ParamTypes, num_param_types, LLVMDIFlagZero);
370383

371384
auto line_entry = sc.GetLineEntry();
372385
LLVMMetadataRef ReplaceableFunctionMetadata =
@@ -386,13 +399,6 @@ lldb_function_to_function_dbi(const AOTCompContext *comp_ctx,
386399

387400
LLVMMetadataRef ParamExpression =
388401
LLVMDIBuilderCreateExpression(DIB, NULL, 0);
389-
auto variable_list =
390-
function.GetBlock().GetVariables(extractor->target, true, false, false);
391-
if (num_function_args != variable_list.GetSize()) {
392-
LOG_ERROR(
393-
"function args number mismatch!:value number=%d, function args=%d",
394-
variable_list.GetSize(), num_function_args);
395-
}
396402

397403
LLVMMetadataRef ParamLocation = LLVMDIBuilderCreateDebugLocation(
398404
comp_ctx->context, line_entry.GetLine(), 0, FunctionMetadata, NULL);
@@ -412,27 +418,38 @@ lldb_function_to_function_dbi(const AOTCompContext *comp_ctx,
412418
LLVMDIBuilderInsertDbgValueAtEnd(DIB, Param, ParamVar, ParamExpression,
413419
ParamLocation, block_curr);
414420

415-
for (uint32_t function_arg_idx = 0;
416-
function_arg_idx < variable_list.GetSize(); ++function_arg_idx) {
417-
SBValue variable(variable_list.GetValueAtIndex(function_arg_idx));
418-
if (variable.IsValid() && ParamTypes[function_arg_idx + 1] != NULL) {
419-
SBDeclaration dec(variable.GetDeclaration());
420-
auto valtype = variable.GetType();
421-
LLVMMetadataRef ParamLocation = LLVMDIBuilderCreateDebugLocation(
422-
comp_ctx->context, dec.GetLine(), dec.GetColumn(),
423-
FunctionMetadata, NULL);
424-
const char *varname = variable.GetName();
425-
LLVMMetadataRef ParamVar = LLVMDIBuilderCreateParameterVariable(
426-
DIB, FunctionMetadata, varname, varname ? strlen(varname) : 0,
427-
function_arg_idx + 1 + 1,
428-
File, // starts form 1, and 1 is exenv,
429-
dec.GetLine(), ParamTypes[function_arg_idx + 1], true,
430-
LLVMDIFlagZero);
431-
LLVMValueRef Param =
432-
LLVMGetParam(func_ctx->func, function_arg_idx + 1);
433-
LLVMDIBuilderInsertDbgValueAtEnd(DIB, Param, ParamVar,
434-
ParamExpression, ParamLocation,
435-
block_curr);
421+
if (!cplusplus) {
422+
auto variable_list = function.GetBlock().GetVariables(
423+
extractor->target, true, false, false);
424+
if (num_function_args != variable_list.GetSize()) {
425+
LOG_ERROR("function args number mismatch!:value number=%d, "
426+
"function args=%d",
427+
variable_list.GetSize(), num_function_args);
428+
}
429+
for (uint32_t function_arg_idx = 0;
430+
function_arg_idx < variable_list.GetSize(); ++function_arg_idx) {
431+
SBValue variable(variable_list.GetValueAtIndex(function_arg_idx));
432+
if (variable.IsValid()
433+
&& ParamTypes[function_arg_idx + 1] != NULL) {
434+
SBDeclaration dec(variable.GetDeclaration());
435+
auto valtype = variable.GetType();
436+
LLVMMetadataRef ParamLocation =
437+
LLVMDIBuilderCreateDebugLocation(
438+
comp_ctx->context, dec.GetLine(), dec.GetColumn(),
439+
FunctionMetadata, NULL);
440+
const char *varname = variable.GetName();
441+
LLVMMetadataRef ParamVar = LLVMDIBuilderCreateParameterVariable(
442+
DIB, FunctionMetadata, varname,
443+
varname ? strlen(varname) : 0, function_arg_idx + 1 + 1,
444+
File, // starts form 1, and 1 is exenv,
445+
dec.GetLine(), ParamTypes[function_arg_idx + 1], true,
446+
LLVMDIFlagZero);
447+
LLVMValueRef Param =
448+
LLVMGetParam(func_ctx->func, function_arg_idx + 1);
449+
LLVMDIBuilderInsertDbgValueAtEnd(DIB, Param, ParamVar,
450+
ParamExpression, ParamLocation,
451+
block_curr);
452+
}
436453
}
437454
}
438455

0 commit comments

Comments
 (0)