Skip to content

Commit 0258b30

Browse files
Troy Curtisstcurtiss
authored andcommitted
Add --trace=plugin=<name> scoped plugin tracing
Extend --trace=<category>[=<name>] (mirroring symbol=/section=/reloc=) to plugins, so an individual plugin's diagnostics can be enabled without tracing every plugin. GeneralOptions::tracePlugin() checks an exact-string/regex allowlist populated by the new plugin=<name> case, falling back to "trace everything" for the pre-existing bare --trace=plugin. Plugin::isTraced() wraps this check and replaces every tracePlugins()-gated call site in Plugin.cpp, PluginManager.cpp, and GNULDBackend::RunPluginsAndProcessHelper with per-plugin gating via O->prolog().getPlugin()->isTraced(). Signed-off-by: Troy Curtiss <trcurtiss@gmail.com>
1 parent 4ad9180 commit 0258b30

13 files changed

Lines changed: 192 additions & 35 deletions

File tree

include/eld/Config/GeneralOptions.h

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -152,6 +152,8 @@ class GeneralOptions {
152152

153153
bool traceReloc(std::string const &RelocName) const;
154154

155+
bool tracePlugin(std::string const &PluginName) const;
156+
155157
bool traceLTO(void) const;
156158

157159
bool codegenOpts(void) const;
@@ -1041,6 +1043,10 @@ class GeneralOptions {
10411043

10421044
bool isSectionTracingRequested() const { return SectionTracingRequested; }
10431045

1046+
void setPluginTracingRequested() { PluginTracingRequested = true; }
1047+
1048+
bool isPluginTracingRequested() const { return PluginTracingRequested; }
1049+
10441050
// --------------Dynamic Linker-------------------------
10451051
bool hasDynamicLinker() const { return BDynamicLinker; }
10461052

@@ -1376,9 +1382,11 @@ class GeneralOptions {
13761382
std::vector<llvm::Regex> SymbolTrace;
13771383
std::vector<llvm::Regex> RelocTrace;
13781384
std::vector<llvm::Regex> SectionTrace;
1385+
std::vector<llvm::Regex> PluginTrace;
13791386
std::vector<std::string> SymbolsToTrace;
13801387
std::vector<std::string> SectionsToTrace;
13811388
std::vector<std::string> RelocsToTrace;
1389+
std::vector<std::string> PluginsToTrace;
13821390
std::vector<llvm::Regex> MergeStrSectionsToTrace;
13831391
MergeStrTraceType MergeStrTraceValue = MergeStrTraceType::NONE;
13841392
std::set<std::string> RelocVerify;
@@ -1419,6 +1427,7 @@ class GeneralOptions {
14191427
llvm::StringRef TrampolineMapFile; // TrampolineMap
14201428
bool SymbolTracingRequested = false;
14211429
bool SectionTracingRequested = false;
1430+
bool PluginTracingRequested = false;
14221431
std::vector<llvm::StringRef> RequestedTimeRegions;
14231432
DiagnosticEngine *DiagEngine = nullptr;
14241433
bool BDynamicLinker = true;

include/eld/Driver/GnuLinkerOptions.td

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -866,6 +866,7 @@ defm trace
866866
"\t\t\t --trace=garbage-collection : trace linker garbage "
867867
"collection\n"
868868
"\t\t\t --trace=plugin : trace plugin\n"
869+
"\t\t\t --trace=plugin=<plugin-name> : trace a single plugin\n"
869870
"\t\t\t --trace=threads : trace threads\n"
870871
"\t\t\t --trace=assignments : trace symbol assignments\n"
871872
"\t\t\t --trace=command-line : trace header info\n"

include/eld/PluginAPI/LinkerWrapper.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -714,6 +714,11 @@ class DLL_A_EXPORT LinkerWrapper {
714714
/// Returns true if user has requested verbose diagnostics.
715715
bool isVerbose() const;
716716

717+
/// Returns true if this plugin is being traced, i.e. --trace=plugin
718+
/// was given without a scope, or with a scope (--trace=plugin=<name>)
719+
/// that matches this plugin's name.
720+
bool isTraced() const;
721+
717722
eld::Expected<std::vector<plugin::OutputSection>>
718723
getAllOutputSections() const;
719724

include/eld/Script/Plugin.h

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,10 @@ class Plugin {
6161

6262
std::string getPluginOptions() const { return PluginOptions; }
6363

64+
/// Returns true if diagnostics should be traced for this plugin, honoring
65+
/// both bare --trace=plugin and scoped --trace=plugin=<name>.
66+
bool isTraced() const;
67+
6468
plugin::PluginBase *getLinkerPlugin() const { return UserPluginHandle; }
6569

6670
void *getLibraryHandle() const { return PluginLibraryHandle; }
@@ -96,9 +100,10 @@ class Plugin {
96100
bool registerPlugin(void *Handle);
97101

98102
// -------------- Load/Unload/Reset Plugin ------------------------
99-
static void *loadPlugin(std::string Name, Module *Module);
103+
static void *loadPlugin(std::string Name, Module *Module, bool IsTraced);
100104

101-
static bool unload(std::string Name, void *LibraryHandle, Module *Module);
105+
static bool unload(std::string Name, void *LibraryHandle, Module *Module,
106+
bool IsTraced);
102107

103108
void reset();
104109

lib/Config/GeneralOptions.cpp

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -210,6 +210,13 @@ eld::Expected<void> GeneralOptions::setTrace(const char *PTraceType) {
210210
std::string Sym = TraceType.substr(Pos + 1).str();
211211
SectionTrace.emplace_back(llvm::Regex(Sym));
212212
SectionsToTrace.emplace_back(Sym);
213+
} else if (TraceType.starts_with("plugin") && TraceType.contains('=')) {
214+
setPluginTracingRequested();
215+
TraceMe = DiagEngine->getPrinter()->TracePlugin;
216+
size_t Pos = TraceType.find_last_of('=');
217+
std::string PluginName = TraceType.substr(Pos + 1).str();
218+
PluginTrace.emplace_back(llvm::Regex(PluginName));
219+
PluginsToTrace.emplace_back(PluginName);
213220
} else if (TraceType.starts_with("merge-strings")) {
214221
size_t Pos = TraceType.find_last_of('=');
215222
std::string Arg = TraceType.substr(Pos + 1).str();
@@ -402,6 +409,20 @@ bool GeneralOptions::traceReloc(std::string const &RelocName) const {
402409
});
403410
}
404411

412+
bool GeneralOptions::tracePlugin(std::string const &PluginName) const {
413+
if (!DiagEngine->getPrinter()->tracePlugins())
414+
return false;
415+
// Bare "--trace=plugin" (no scoped names given): trace every plugin.
416+
if (!PluginTracingRequested)
417+
return true;
418+
StringRef PluginRef(PluginName);
419+
return llvm::any_of(PluginsToTrace,
420+
[&](const std::string &S) { return S == PluginName; }) ||
421+
llvm::any_of(PluginTrace, [&](const llvm::Regex &Regex) {
422+
return Regex.match(PluginRef);
423+
});
424+
}
425+
405426
std::vector<llvm::StringRef> GeneralOptions::getLTOOptionsAsString() const {
406427
std::vector<llvm::StringRef> ReturnValue;
407428
if ((LTOOptions & LTOVerbose) == LTOVerbose)

lib/Core/LinkerScript.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,8 @@ void LinkerScript::unloadPlugins(Module *Module) {
7878
continue;
7979
// Run the cleanup function
8080
H.second->cleanup();
81-
Plugin::unload(H.first, H.second->getLibraryHandle(), Module);
81+
Plugin::unload(H.first, H.second->getLibraryHandle(), Module,
82+
H.second->isTraced());
8283
if (Module->getPrinter()->isVerbose())
8384
Diag->raise(Diag::unloaded_plugin) << H.first;
8485
}
@@ -574,7 +575,7 @@ bool LinkerScript::loadPlugin(Plugin &P, Module &M) {
574575
void *Handle = nullptr;
575576
auto &PAL = M.getPluginActivityLog();
576577
if (I == MLibraryToPluginMap.end()) {
577-
Handle = Plugin::loadPlugin(ResolvedPath, &M);
578+
Handle = Plugin::loadPlugin(ResolvedPath, &M, P.isTraced());
578579
MLibraryToPluginMap.insert(std::make_pair(ResolvedPath, &P));
579580
} else {
580581
Handle = I->second->getLibraryHandle();

lib/LinkerWrapper/LinkerWrapper.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1021,6 +1021,8 @@ bool LinkerWrapper::isVerbose() const {
10211021
return m_Module.getConfig().getPrinter()->isVerbose();
10221022
}
10231023

1024+
bool LinkerWrapper::isTraced() const { return m_Plugin->isTraced(); }
1025+
10241026
eld::Expected<std::vector<plugin::OutputSection>>
10251027
LinkerWrapper::getAllOutputSections() const {
10261028
CHECK_LINK_STATE(*this, "ActBeforeRuleMatching", "BeforeLayout",

lib/Plugin/PluginManager.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,7 @@ bool PluginManager::callVisitSymbolHook(LDSymbol *Sym, llvm::StringRef SymName,
111111

112112
void PluginManager::addSymbolVisitor(eld::Plugin *P) {
113113
SymbolVisitors.insert(P);
114-
if (DE.getPrinter()->tracePlugins())
114+
if (P->isTraced())
115115
DE.raise(Diag::trace_plugin_enable_visit_symbol) << P->getPluginName();
116116
}
117117

@@ -136,7 +136,7 @@ void PluginManager::setAuxiliarySymbolNameMap(
136136
const ObjectFile::AuxiliarySymbolNameMap &AuxSymNameMap, const Plugin *P) {
137137
ObjFile->setAuxiliarySymbolNameMap(AuxSymNameMap);
138138
AuxSymNameMapProvider[ObjFile] = P;
139-
if (DE.getPrinter()->tracePlugins())
139+
if (P->isTraced())
140140
DE.raise(Diag::trace_set_aux_sym_name_map)
141141
<< P->getPluginName() << ObjFile->getInput()->decoratedPath();
142142
}

lib/Script/Plugin.cpp

Lines changed: 29 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,10 @@ Plugin::Plugin(plugin::Plugin::Type T, std::string LibraryName,
4949
ThisModule(Module), ThisConfig(Module.getConfig()),
5050
IsDefaultPlugin(DefaultPlugin) {}
5151

52+
bool Plugin::isTraced() const {
53+
return ThisConfig.options().tracePlugin(getPluginType());
54+
}
55+
5256
std::string Plugin::resolvePath(const LinkerConfig &PConfig) {
5357
// Library already loaded!
5458
if (PluginLibraryHandle)
@@ -79,13 +83,14 @@ std::string Plugin::resolvePath(const LinkerConfig &PConfig) {
7983

8084
if (nullptr != NS) {
8185
PluginLibraryName = NS->getFullPath();
82-
if (ThisModule.getPrinter()->tracePlugins())
86+
if (isTraced())
8387
ThisConfig.raise(Diag::using_plugin) << PluginLibraryName << Name;
8488
}
8589
return PluginLibraryName;
8690
}
8791

88-
void *Plugin::loadPlugin(std::string LibraryName, Module *Module) {
92+
void *Plugin::loadPlugin(std::string LibraryName, Module *Module,
93+
bool IsTraced) {
8994
void *LibraryHandle = DynamicLibrary::Load(LibraryName);
9095
DiagnosticEngine *DiagEngine = Module->getConfig().getDiagEngine();
9196
if (!LibraryHandle) {
@@ -94,7 +99,7 @@ void *Plugin::loadPlugin(std::string LibraryName, Module *Module) {
9499
return nullptr;
95100
}
96101

97-
if (Module->getPrinter()->tracePlugins())
102+
if (IsTraced)
98103
DiagEngine->raise(Diag::loaded_library) << LibraryName;
99104

100105
return LibraryHandle;
@@ -151,15 +156,15 @@ bool Plugin::setFunctions() {
151156
return false;
152157
}
153158

154-
if (ThisModule.getPrinter()->tracePlugins()) {
159+
if (isTraced()) {
155160
ThisConfig.raise(Diag::found_register_function) << Register << LibraryName;
156161
ThisConfig.raise(Diag::found_function_for_plugintype)
157162
<< PluginFunc << LibraryName;
158163
}
159164

160165
std::string PluginCleanupFunc = "Cleanup";
161166
void *C = DynamicLibrary::GetFunction(PluginLibraryHandle, PluginCleanupFunc);
162-
if (C && ThisModule.getPrinter()->tracePlugins()) {
167+
if (C && isTraced()) {
163168
ThisConfig.raise(Diag::found_cleanup_function)
164169
<< PluginCleanupFunc << LibraryName;
165170
}
@@ -182,7 +187,7 @@ bool Plugin::setFunctions() {
182187
bool Plugin::getUserPlugin() {
183188
std::string LibraryName = DynamicLibrary::getLibraryName(Name);
184189

185-
if (ThisModule.getPrinter()->tracePlugins())
190+
if (isTraced())
186191
ThisConfig.raise(Diag::registering_all_functions);
187192

188193
UserPluginHandle = (*GetPluginFunction)(getPluginType().c_str());
@@ -192,7 +197,7 @@ bool Plugin::getUserPlugin() {
192197
return false;
193198
}
194199

195-
if (ThisModule.getPrinter()->tracePlugins())
200+
if (isTraced())
196201
ThisConfig.raise(Diag::found_plugin_handler)
197202
<< getPluginType() << LibraryName;
198203

@@ -211,7 +216,7 @@ bool Plugin::init(eld::OutputTarWriter *OutputTar) {
211216
return false;
212217
eld::RegisterTimer T(
213218
"Init", ThisModule.saveString(UserPluginHandle->GetName()), Stats);
214-
if (ThisModule.getPrinter()->tracePlugins())
219+
if (isTraced())
215220
ThisConfig.raise(Diag::note_initializing_plugin)
216221
<< getPluginType() << DynamicLibrary::getLibraryName(Name)
217222
<< UserPluginHandle->GetName();
@@ -235,14 +240,14 @@ bool Plugin::run(std::vector<Plugin *> &Plugins) {
235240
return false;
236241
eld::RegisterTimer T(
237242
"Run", ThisModule.saveString(UserPluginHandle->GetName()), Stats);
238-
if (ThisModule.getPrinter()->tracePlugins())
243+
if (isTraced())
239244
ThisConfig.raise(Diag::running_plugin)
240245
<< getPluginType() << DynamicLibrary::getLibraryName(Name)
241246
<< UserPluginHandle->GetName();
242247
Plugins.push_back(this);
243248
Running R(this);
244249
plugin::Plugin *P = llvm::cast<plugin::Plugin>(UserPluginHandle);
245-
plugin::Plugin::Status S = P->Run(ThisModule.getPrinter()->tracePlugins());
250+
plugin::Plugin::Status S = P->Run(isTraced());
246251
if (S == plugin::Plugin::Status::ERROR || P->GetLastError()) {
247252
ThisConfig.raise(Diag::plugin_has_error)
248253
<< getPluginType() << DynamicLibrary::getLibraryName(Name)
@@ -266,11 +271,12 @@ bool Plugin::cleanup() {
266271
return true;
267272
}
268273

269-
bool Plugin::unload(std::string LibraryName, void *Handle, Module *Module) {
274+
bool Plugin::unload(std::string LibraryName, void *Handle, Module *Module,
275+
bool IsTraced) {
270276
if (Handle) {
271277
DynamicLibrary::Unload(Handle);
272278

273-
if (Module->getPrinter()->tracePlugins())
279+
if (IsTraced)
274280
Module->getConfig().raise(Diag::unloaded_library) << LibraryName;
275281
}
276282

@@ -290,7 +296,7 @@ bool Plugin::destroy() {
290296
return false;
291297
eld::RegisterTimer T(
292298
"Destroy", ThisModule.saveString(UserPluginHandle->GetName()), Stats);
293-
if (ThisModule.getPrinter()->tracePlugins())
299+
if (isTraced())
294300
ThisConfig.raise(Diag::plugin_destroy) << getPluginType();
295301
plugin::Plugin *P = llvm::cast<plugin::Plugin>(UserPluginHandle);
296302
P->Destroy();
@@ -332,7 +338,7 @@ bool Plugin::check() {
332338
return false;
333339
}
334340

335-
if (ThisModule.getPrinter()->tracePlugins())
341+
if (isTraced())
336342
ThisConfig.raise(Diag::note_plugin_version)
337343
<< PluginMajor << PluginMinor << DynamicLibrary::getLibraryName(Name)
338344
<< getPluginType();
@@ -522,7 +528,7 @@ void Plugin::callInitHook() {
522528
plugin::LinkerPlugin *P = llvm::cast<plugin::LinkerPlugin>(UserPluginHandle);
523529
RegisterTimer T("Init", ThisModule.saveString(UserPluginHandle->GetName()),
524530
Stats);
525-
if (ThisModule.getPrinter()->tracePlugins())
531+
if (isTraced())
526532
ThisConfig.raise(Diag::trace_plugin_init) << getPluginName();
527533
P->Init(PluginOptions);
528534
}
@@ -531,15 +537,15 @@ void Plugin::callDestroyHook() {
531537
plugin::LinkerPlugin *P = llvm::cast<plugin::LinkerPlugin>(UserPluginHandle);
532538
RegisterTimer T("Destroy", ThisModule.saveString(UserPluginHandle->GetName()),
533539
Stats);
534-
if (ThisModule.getPrinter()->tracePlugins())
540+
if (isTraced())
535541
ThisConfig.raise(Diag::trace_plugin_destroy) << getPluginName();
536542
P->Destroy();
537543
}
538544

539545
void Plugin::registerCommandLineOption(
540546
const std::string &Option, bool HasValue,
541547
const CommandLineOptionSpec::OptionHandlerType &OptionHandler) {
542-
if (ThisModule.getPrinter()->tracePlugins()) {
548+
if (isTraced()) {
543549
if (HasValue)
544550
ThisConfig.raise(Diag::trace_plugin_register_opt_with_val)
545551
<< getPluginName() << Option;
@@ -568,7 +574,7 @@ void Plugin::callVisitSectionsHook(InputFile &IF) {
568574
plugin::LinkerPlugin *P = llvm::cast<plugin::LinkerPlugin>(UserPluginHandle);
569575
RegisterTimer T("VisitSections",
570576
ThisModule.saveString(UserPluginHandle->GetName()), Stats);
571-
if (ThisModule.getPrinter()->tracePlugins())
577+
if (isTraced())
572578
ThisConfig.raise(Diag::trace_plugin_visit_sections)
573579
<< getPluginName() << IF.getInput()->decoratedPath();
574580
P->VisitSections(plugin::InputFile(&IF));
@@ -579,7 +585,7 @@ void Plugin::callVisitSymbolHook(LDSymbol *Sym, llvm::StringRef SymName,
579585
plugin::LinkerPlugin *P = llvm::cast<plugin::LinkerPlugin>(UserPluginHandle);
580586
RegisterTimer T("VisitSymbol",
581587
ThisModule.saveString(UserPluginHandle->GetName()), Stats);
582-
if (ThisModule.getPrinter()->tracePlugins())
588+
if (isTraced())
583589
ThisConfig.raise(Diag::trace_plugin_visit_symbol)
584590
<< getPluginName() << SymName;
585591
std::unique_ptr<SymbolInfo> UpSymInfo = std::make_unique<SymbolInfo>(SymInfo);
@@ -593,7 +599,7 @@ void Plugin::callActBeforeRuleMatchingHook() {
593599
plugin::LinkerPlugin *P = llvm::cast<plugin::LinkerPlugin>(UserPluginHandle);
594600
RegisterTimer T(HookName, ThisModule.saveString(UserPluginHandle->GetName()),
595601
Stats);
596-
if (ThisModule.getPrinter()->tracePlugins())
602+
if (isTraced())
597603
ThisConfig.raise(Diag::trace_plugin_hook) << getPluginName() << HookName;
598604
P->ActBeforeRuleMatching();
599605
}
@@ -603,7 +609,7 @@ void Plugin::callActBeforeSectionMergingHook() {
603609
plugin::LinkerPlugin *P = llvm::cast<plugin::LinkerPlugin>(UserPluginHandle);
604610
RegisterTimer T(HookName, ThisModule.saveString(UserPluginHandle->GetName()),
605611
Stats);
606-
if (ThisModule.getPrinter()->tracePlugins())
612+
if (isTraced())
607613
ThisConfig.raise(Diag::trace_plugin_hook) << getPluginName() << HookName;
608614
P->ActBeforeSectionMerging();
609615
}
@@ -613,7 +619,7 @@ void Plugin::callActBeforePerformingLayoutHook() {
613619
plugin::LinkerPlugin *P = llvm::cast<plugin::LinkerPlugin>(UserPluginHandle);
614620
RegisterTimer T(HookName, ThisModule.saveString(UserPluginHandle->GetName()),
615621
Stats);
616-
if (ThisModule.getPrinter()->tracePlugins())
622+
if (isTraced())
617623
ThisConfig.raise(Diag::trace_plugin_hook) << getPluginName() << HookName;
618624
P->ActBeforePerformingLayout();
619625
}
@@ -623,7 +629,7 @@ void Plugin::callActBeforeWritingOutputHook() {
623629
plugin::LinkerPlugin *P = llvm::cast<plugin::LinkerPlugin>(UserPluginHandle);
624630
RegisterTimer T(HookName, ThisModule.saveString(UserPluginHandle->GetName()),
625631
Stats);
626-
if (ThisModule.getPrinter()->tracePlugins())
632+
if (isTraced())
627633
ThisConfig.raise(Diag::trace_plugin_hook) << getPluginName() << HookName;
628634
P->ActBeforeWritingOutput();
629635
}

0 commit comments

Comments
 (0)