Skip to content

Commit ab8a621

Browse files
committed
Restore callback to C/C++ ABI instead of returning an error
Signed-off-by: Dom Del Nano <ddelnano@gmail.com>
1 parent 18bc7f0 commit ab8a621

3 files changed

Lines changed: 41 additions & 32 deletions

File tree

src/stirling/source_connectors/dynamic_tracer/dynamic_tracing/autogen.cc

Lines changed: 35 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -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
}
92102
namespace {
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

src/stirling/source_connectors/dynamic_tracer/dynamic_tracing/autogen.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,9 +33,10 @@ namespace dynamic_tracing {
3333
/**
3434
* Uses ELF or DWARF information to detect the source language.
3535
* Populates the tracepoint program's language field in input_program.
36+
* If the language cannot be determined, it assumes a C/C++ language ABI.
3637
*/
37-
Status DetectSourceLanguage(obj_tools::ElfReader* elf_reader, obj_tools::DwarfReader* dwarf_reader,
38-
ir::logical::TracepointSpec* program, const std::string& symbol_name);
38+
void DetectSourceLanguage(obj_tools::ElfReader* elf_reader, obj_tools::DwarfReader* dwarf_reader,
39+
ir::logical::TracepointSpec* program, const std::string& symbol_name);
3940

4041
/**
4142
* Uses ELF information to check if the provided symbol exists.

src/stirling/source_connectors/dynamic_tracer/dynamic_tracing/autogen_test.cc

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -211,10 +211,9 @@ TEST_P(DetectSourceLanguageTest, Transform) {
211211

212212
std::string expected_output = absl::Substitute(p.expected_output, binary_path_);
213213

214-
auto s = DetectSourceLanguage(elf_reader_.get(), dwarf_reader_.get(),
215-
program.mutable_tracepoints(0)->mutable_program(),
216-
program.tracepoints(0).program().probes(0).tracepoint().symbol());
217-
ASSERT_OK(s);
214+
DetectSourceLanguage(elf_reader_.get(), dwarf_reader_.get(),
215+
program.mutable_tracepoints(0)->mutable_program(),
216+
program.tracepoints(0).program().probes(0).tracepoint().symbol());
218217
ASSERT_THAT(program, EqualsProto(expected_output));
219218
}
220219

0 commit comments

Comments
 (0)