@@ -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