diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/util/bin/format/dwarf4/encoding/DWARFSourceLanguage.java b/Ghidra/Features/Base/src/main/java/ghidra/app/util/bin/format/dwarf4/encoding/DWARFSourceLanguage.java index 8f408e60ec..61b4237299 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/util/bin/format/dwarf4/encoding/DWARFSourceLanguage.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/util/bin/format/dwarf4/encoding/DWARFSourceLanguage.java @@ -42,7 +42,30 @@ public final class DWARFSourceLanguage { public static final int DW_LANG_UPC = 0x12; public static final int DW_LANG_D = 0x13; public static final int DW_LANG_Python = 0x14; + public static final int DW_LANG_OpenCL = 0x15; + public static final int DW_LANG_Go = 0x16; + public static final int DW_LANG_Modula3 = 0x17; + public static final int DW_LANG_Haskell = 0x18; + public static final int DW_LANG_C_plus_plus_03 = 0x19; + public static final int DW_LANG_C_plus_plus_11 = 0x1a; + public static final int DW_LANG_OCaml = 0x1b; + public static final int DW_LANG_Rust = 0x1c; + public static final int DW_LANG_C11 = 0x1d; + public static final int DW_LANG_Swift = 0x1e; + public static final int DW_LANG_Julia = 0x1f; + public static final int DW_LANG_Dylan = 0x20; + public static final int DW_LANG_C_plus_plus_14 = 0x21; + public static final int DW_LANG_Fortran03 = 0x22; + public static final int DW_LANG_Fortran08 = 0x23; + public static final int DW_LANG_RenderScript = 0x24; + public static final int DW_LANG_BLISS = 0x25; + public static final int DW_LANG_lo_user = 0x8000; public static final int DW_LANG_hi_user = 0xffff; + public static final int DW_LANG_Mips_Assembler = 0x8001; + public static final int DW_LANG_GOOGLE_RenderScript = 0x8e57; + public static final int DW_LANG_SUN_Assembler = 0x9001; + public static final int DW_LANG_ALTIUM_Assembler = 0x9101; + public static final int DW_LANG_BORLAND_Delphi = 0xb000; } diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/util/bin/format/dwarf4/next/DWARFFunctionImporter.java b/Ghidra/Features/Base/src/main/java/ghidra/app/util/bin/format/dwarf4/next/DWARFFunctionImporter.java index 5cdfc55a1c..4d97a71122 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/util/bin/format/dwarf4/next/DWARFFunctionImporter.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/util/bin/format/dwarf4/next/DWARFFunctionImporter.java @@ -24,6 +24,7 @@ import ghidra.app.cmd.comments.AppendCommentCmd; import ghidra.app.cmd.label.SetLabelPrimaryCmd; import ghidra.app.util.bin.format.dwarf4.*; import ghidra.app.util.bin.format.dwarf4.encoding.DWARFAttribute; +import ghidra.app.util.bin.format.dwarf4.encoding.DWARFSourceLanguage; import ghidra.app.util.bin.format.dwarf4.encoding.DWARFTag; import ghidra.app.util.bin.format.dwarf4.expression.*; import ghidra.program.database.function.OverlappingFunctionException; @@ -286,7 +287,20 @@ public class DWARFFunctionImporter { processFuncChildren(diea, dfunc); Function gfunc = createFunction(dfunc, diea); - if (gfunc != null) { + + boolean updateSignature = true; + + DWARFCompilationUnit firstCompilationUnit = prog.getCompilationUnits().get(0); + if (firstCompilationUnit != null) { + Number dwarfLanguage = firstCompilationUnit.getCompileUnit().getLanguage(); + + // Rust does not have associated function signature + if (dwarfLanguage == (Number) DWARFSourceLanguage.DW_LANG_Rust) { + updateSignature = false; + } + } + + if (gfunc != null && updateSignature) { if (formalParams.isEmpty() && dfunc.localVarErrors) { // if there were no defined parameters and we had problems decoding local variables,