Skip to content

Commit bea6f6d

Browse files
alokkrsharmabryanpkc
authored andcommitted
Support for DWARF 4/5 and fix of issues related to -gdwarf-X options (#92)
* Support for -gdwarf-5 option in Flang driver. Summary: FLANG driver doesnt pass -gdwarf-4/5 to flang1 in form of xbits, while it passes for -gdwarf-2/3 -gdwarf-2 => -x 120 0x200 -gdwarf-3 => -x 120 0x4000 Due to this -gdwarf-5 is never honored and default option -gdwarf-4 is taken. # flang -gdwarf-5 test.f90 # llvm-dwarfdump a.out | grep version 0x00000000: Compile Unit: length = 0x0000008e version = 0x0004 Now 0x1000000/0x2000000 will be passed for -gdwarf-4/5 -gdwarf-4 => -x 120 0x1000000 -gdwarf-5 => -x 120 0x2000000 Testing: - GNU gdb fortran testsuite - check-llvm - check-debuginfo * Flang doenst choose correct dwarf version when multiple -g/-gdwarfN mentioned Summary: When multiple -g/-gdwarfN options are passed together at compile time, flang chooses the least one. Clang/gfortran etc choose the last one. -gdwarf-5 -gdwarf-3 => flang chooses 5 while clang/gfortran choose 3 -gdwarf-5 -g => flang choses the default while clang/gfortran choose 5 Testing: - check-llvm - check-debuginfo * Default dwarf version should be 4 for -g with flang Currently flang dumps dwarf version 2 for -g and 4 for absence of -g ------------------------- $ flang my.f90 $ llvm-dwarfdump a.out | grep version 0x00000000: Compile Unit: length = 0x0000003d version = 0x0004 abbr_offset = 0x0000 addr_size = 0x08 (next unit at 0x00000041) $ flang -g my.f90 $ llvm-dwarfdump a.out | grep version 0x00000000: Compile Unit: length = 0x00000047 version = 0x0002 abbr_offset = 0x0000 addr_size = 0x08 (next unit at 0x0000004b) ------------------------- It should be 4 for -g as it is the case with clang.
1 parent 4341503 commit bea6f6d

File tree

1 file changed

+24
-18
lines changed

1 file changed

+24
-18
lines changed

clang/lib/Driver/ToolChains/ClassicFlang.cpp

Lines changed: 24 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -327,28 +327,34 @@ void ClassicFlang::ConstructJob(Compilation &C, const JobAction &JA,
327327
LowerCmdArgs.push_back("0x8");
328328
}
329329

330-
// -g should produce DWARFv2
331-
for (auto Arg : Args.filtered(options::OPT_g_Flag)) {
332-
Arg->claim();
333-
CommonCmdArgs.push_back("-x");
334-
CommonCmdArgs.push_back("120");
335-
CommonCmdArgs.push_back("0x200");
336-
}
330+
// Last argument of -g/-gdwarfX should be taken.
331+
Arg *GArg = Args.getLastArg(options::OPT_g_Flag);
332+
Arg *GDwarfArg = Args.getLastArg(options::OPT_gdwarf_2,
333+
options::OPT_gdwarf_3,
334+
options::OPT_gdwarf_4,
335+
options::OPT_gdwarf_5);
336+
337+
if (GArg || GDwarfArg) {
338+
339+
for (auto Arg : Args.filtered(options::OPT_g_Flag, options::OPT_gdwarf_2,
340+
options::OPT_gdwarf_3, options::OPT_gdwarf_4,
341+
options::OPT_gdwarf_5)) {
342+
Arg->claim();
343+
}
337344

338-
// -gdwarf-2
339-
for (auto Arg : Args.filtered(options::OPT_gdwarf_2)) {
340-
Arg->claim();
341345
CommonCmdArgs.push_back("-x");
342346
CommonCmdArgs.push_back("120");
343-
CommonCmdArgs.push_back("0x200");
344-
}
345347

346-
// -gdwarf-3
347-
for (auto Arg : Args.filtered(options::OPT_gdwarf_3)) {
348-
Arg->claim();
349-
CommonCmdArgs.push_back("-x");
350-
CommonCmdArgs.push_back("120");
351-
CommonCmdArgs.push_back("0x4000");
348+
if (!GDwarfArg) // -g without -gdwarf-X produces default (DWARFv4)
349+
CommonCmdArgs.push_back("0x1000000");
350+
else if (GDwarfArg->getOption().matches(options::OPT_gdwarf_2)) // -gdwarf-2
351+
CommonCmdArgs.push_back("0x200");
352+
else if (GDwarfArg->getOption().matches(options::OPT_gdwarf_3)) // -gdwarf-3
353+
CommonCmdArgs.push_back("0x4000");
354+
else if (GDwarfArg->getOption().matches(options::OPT_gdwarf_4)) // -gdwarf-4
355+
CommonCmdArgs.push_back("0x1000000");
356+
else if (GDwarfArg->getOption().matches(options::OPT_gdwarf_5)) // -gdwarf-5
357+
CommonCmdArgs.push_back("0x2000000");
352358
}
353359

354360
// -Mipa has no effect

0 commit comments

Comments
 (0)