@@ -54,40 +54,50 @@ StatusOr<ir::shared::Language> TransformSourceLanguage(
5454 }
5555}
5656
57+ StatusOr<ir::shared::Language> TryDetectSourceLanguageFromDwarf (
58+ obj_tools::DwarfReader* dwarf_reader, const std::string& symbol_name) {
59+ PX_ASSIGN_OR_RETURN (const auto & function_die,
60+ dwarf_reader->GetMatchingDIE (symbol_name, llvm::dwarf::DW_TAG_subprogram));
61+ llvm::DWARFUnit* cu = function_die.getDwarfUnit ();
62+ llvm::DWARFDie unit_die = cu->getUnitDIE ();
63+
64+ PX_ASSIGN_OR_RETURN (auto lang_pair, dwarf_reader->DetectSourceLanguageFromCUDIE (unit_die));
65+ llvm::dwarf::SourceLanguage source_lang = lang_pair.first ;
66+ PX_ASSIGN_OR_RETURN (auto detected_language, TransformSourceLanguage (source_lang));
67+
68+ return detected_language;
69+ }
70+
5771} // namespace
5872
59- Status DetectSourceLanguage (obj_tools::ElfReader* elf_reader, obj_tools::DwarfReader* dwarf_reader,
60- ir::logical::TracepointSpec* program, const std::string& symbol_name) {
73+ void DetectSourceLanguage (obj_tools::ElfReader* elf_reader, obj_tools::DwarfReader* dwarf_reader,
74+ ir::logical::TracepointSpec* program, const std::string& symbol_name) {
75+ ir::shared::Language detected_language = ir::shared::Language::LANG_UNKNOWN;
6176 // Primary detection mechanism is DWARF info, when available.
6277 if (dwarf_reader != nullptr ) {
63- PX_ASSIGN_OR_RETURN (const auto & function_die,
64- dwarf_reader->GetMatchingDIE (symbol_name, llvm::dwarf::DW_TAG_subprogram));
65- llvm::DWARFUnit* cu = function_die.getDwarfUnit ();
66- llvm::DWARFDie unit_die = cu->getUnitDIE ();
67-
68- PX_ASSIGN_OR_RETURN (auto lang_pair, dwarf_reader->DetectSourceLanguageFromCUDIE (unit_die));
69- llvm::dwarf::SourceLanguage source_lang = lang_pair.first ;
70- PX_ASSIGN_OR_RETURN (auto detected_language, TransformSourceLanguage (source_lang));
71-
72- LOG (INFO) << absl::Substitute (" Using language $0 for object $1 and others" ,
73- magic_enum::enum_name (source_lang), elf_reader->binary_path ());
74-
75- program->set_language (detected_language);
76- return Status::OK ();
78+ auto result = TryDetectSourceLanguageFromDwarf (dwarf_reader, symbol_name);
79+ if (result.ok ()) {
80+ detected_language = result.ConsumeValueOrDie ();
81+ }
7782 } else {
7883 // Back-up detection policy looks for certain language-specific symbols
7984 if (IsGoExecutable (elf_reader)) {
80- LOG (INFO) << absl::Substitute (" Using language GOLANG for object $0 and others" ,
81- elf_reader->binary_path ());
82- program->set_language (ir::shared::Language::GOLANG);
83- return Status::OK ();
85+ detected_language = ir::shared::Language::GOLANG;
8486 }
85-
86- // TODO(oazizi): Make this stronger by adding more elf-based tests.
8787 }
8888
89- return error::InvalidArgument (" Unable to detect source language for object $0." ,
90- elf_reader->binary_path ());
89+ if (detected_language != ir::shared::Language::LANG_UNKNOWN) {
90+ program->set_language (detected_language);
91+ LOG (INFO) << absl::Substitute (" Using language $0 for object $1 and symbol $2" ,
92+ magic_enum::enum_name (detected_language),
93+ elf_reader->binary_path (), symbol_name);
94+ } else {
95+ // Fall back to warning and assume C/C++ ABI
96+ LOG (WARNING) << absl::Substitute (
97+ " Language for object $0 and others is unknown or unsupported, so assuming C/C++ ABI. "
98+ " Some dynamic tracing features may not work, or may produce unexpected results." ,
99+ elf_reader->binary_path ());
100+ }
91101}
92102namespace {
93103
@@ -157,8 +167,7 @@ Status ResolveProbeSymbolAndLanguage(obj_tools::ElfReader* elf_reader,
157167
158168 auto tracepoint = probe.mutable_tracepoint ();
159169 *tracepoint->mutable_symbol () = *symbol_name;
160- PX_RETURN_IF_ERROR (
161- DetectSourceLanguage (elf_reader, dwarf_reader, t.mutable_program (), *symbol_name));
170+ DetectSourceLanguage (elf_reader, dwarf_reader, t.mutable_program (), *symbol_name);
162171 }
163172 }
164173
0 commit comments