@@ -507,6 +507,15 @@ static void setImportAttributes(T *existing,
507507 }
508508}
509509
510+ static void traceImport (std::optional<StringRef> importName, InputFile *file) {
511+ if (importName.has_value ()) {
512+ auto name = importName.value ();
513+ if (symtab->isTraced (name)) {
514+ printTraceSymbolUndefined (name, file);
515+ }
516+ }
517+ }
518+
510519Symbol *SymbolTable::addUndefinedFunction (StringRef name,
511520 std::optional<StringRef> importName,
512521 std::optional<StringRef> importModule,
@@ -526,6 +535,7 @@ Symbol *SymbolTable::addUndefinedFunction(StringRef name,
526535 printTraceSymbolUndefined (name, file);
527536
528537 auto replaceSym = [&]() {
538+ traceImport (importName, file);
529539 replaceSymbol<UndefinedFunction>(s, name, importName, importModule, flags,
530540 file, sig, isCalledDirectly);
531541 };
@@ -560,6 +570,7 @@ Symbol *SymbolTable::addUndefinedFunction(StringRef name,
560570 replaceSym ();
561571 }
562572 if (existingUndefined) {
573+ traceImport (importName, file);
563574 setImportAttributes (existingUndefined, importName, importModule, flags,
564575 file);
565576 if (isCalledDirectly)
@@ -612,10 +623,11 @@ Symbol *SymbolTable::addUndefinedGlobal(StringRef name,
612623 if (s->traced )
613624 printTraceSymbolUndefined (name, file);
614625
615- if (wasInserted)
626+ if (wasInserted) {
627+ traceImport (importName, file);
616628 replaceSymbol<UndefinedGlobal>(s, name, importName, importModule, flags,
617629 file, type);
618- else if (auto *lazy = dyn_cast<LazySymbol>(s))
630+ } else if (auto *lazy = dyn_cast<LazySymbol>(s))
619631 lazy->extract ();
620632 else if (s->isDefined ())
621633 checkGlobalType (s, file, type);
@@ -638,10 +650,11 @@ Symbol *SymbolTable::addUndefinedTable(StringRef name,
638650 if (s->traced )
639651 printTraceSymbolUndefined (name, file);
640652
641- if (wasInserted)
653+ if (wasInserted) {
654+ traceImport (importName, file);
642655 replaceSymbol<UndefinedTable>(s, name, importName, importModule, flags,
643656 file, type);
644- else if (auto *lazy = dyn_cast<LazySymbol>(s))
657+ } else if (auto *lazy = dyn_cast<LazySymbol>(s))
645658 lazy->extract ();
646659 else if (s->isDefined ())
647660 checkTableType (s, file, type);
@@ -664,10 +677,11 @@ Symbol *SymbolTable::addUndefinedTag(StringRef name,
664677 if (s->traced )
665678 printTraceSymbolUndefined (name, file);
666679
667- if (wasInserted)
680+ if (wasInserted) {
681+ traceImport (importName, file);
668682 replaceSymbol<UndefinedTag>(s, name, importName, importModule, flags, file,
669683 sig);
670- else if (auto *lazy = dyn_cast<LazySymbol>(s))
684+ } else if (auto *lazy = dyn_cast<LazySymbol>(s))
671685 lazy->extract ();
672686 else if (s->isDefined ())
673687 checkTagType (s, file, sig);
@@ -831,6 +845,13 @@ void SymbolTable::trace(StringRef name) {
831845 symMap.insert ({CachedHashStringRef (name), -1 });
832846}
833847
848+ bool SymbolTable::isTraced (StringRef name) {
849+ auto it = symMap.find (CachedHashStringRef (name));
850+ if (it == symMap.end ())
851+ return false ;
852+ return it->second == -1 || symVector[it->second ]->traced ;
853+ }
854+
834855void SymbolTable::wrap (Symbol *sym, Symbol *real, Symbol *wrap) {
835856 // Swap symbols as instructed by -wrap.
836857 int &origIdx = symMap[CachedHashStringRef (sym->getName ())];
0 commit comments