@@ -479,7 +479,7 @@ void LinkerDriver::parseDirectives(InputFile *file) {
479
479
480
480
// Handle /include: in bulk.
481
481
for (StringRef inc : directives.includes )
482
- addUndefined (inc);
482
+ file-> symtab . addGCRoot (inc);
483
483
484
484
// Handle /exclude-symbols: in bulk.
485
485
for (StringRef e : directives.excludes ) {
@@ -505,13 +505,13 @@ void LinkerDriver::parseDirectives(InputFile *file) {
505
505
case OPT_entry:
506
506
if (!arg->getValue ()[0 ])
507
507
Fatal (ctx) << " missing entry point symbol name" ;
508
- ctx.config .entry = addUndefined (mangle (arg->getValue ()), true );
508
+ ctx.config .entry = file-> symtab . addGCRoot (mangle (arg->getValue ()), true );
509
509
break ;
510
510
case OPT_failifmismatch:
511
511
checkFailIfMismatch (arg->getValue (), file);
512
512
break ;
513
513
case OPT_incl:
514
- addUndefined (arg->getValue ());
514
+ file-> symtab . addGCRoot (arg->getValue ());
515
515
break ;
516
516
case OPT_manifestdependency:
517
517
ctx.config .manifestDependencies .insert (arg->getValue ());
@@ -805,35 +805,6 @@ void LinkerDriver::addLibSearchPaths() {
805
805
}
806
806
}
807
807
808
- Symbol *LinkerDriver::addUndefined (StringRef name, bool aliasEC) {
809
- Symbol *b = ctx.symtab .addUndefined (name);
810
- if (!b->isGCRoot ) {
811
- b->isGCRoot = true ;
812
- ctx.config .gcroot .push_back (b);
813
- }
814
-
815
- // On ARM64EC, a symbol may be defined in either its mangled or demangled form
816
- // (or both). Define an anti-dependency symbol that binds both forms, similar
817
- // to how compiler-generated code references external functions.
818
- if (aliasEC && isArm64EC (ctx.config .machine )) {
819
- if (std::optional<std::string> mangledName =
820
- getArm64ECMangledFunctionName (name)) {
821
- auto u = dyn_cast<Undefined>(b);
822
- if (u && !u->weakAlias ) {
823
- Symbol *t = ctx.symtab .addUndefined (saver ().save (*mangledName));
824
- u->setWeakAlias (t, true );
825
- }
826
- } else if (std::optional<std::string> demangledName =
827
- getArm64ECDemangledFunctionName (name)) {
828
- Symbol *us = ctx.symtab .addUndefined (saver ().save (*demangledName));
829
- auto u = dyn_cast<Undefined>(us);
830
- if (u && !u->weakAlias )
831
- u->setWeakAlias (b, true );
832
- }
833
- }
834
- return b;
835
- }
836
-
837
808
void LinkerDriver::addUndefinedGlob (StringRef arg) {
838
809
Expected<GlobPattern> pat = GlobPattern::create (arg);
839
810
if (!pat) {
@@ -849,7 +820,7 @@ void LinkerDriver::addUndefinedGlob(StringRef arg) {
849
820
});
850
821
851
822
for (Symbol *sym : syms)
852
- addUndefined (sym->getName ());
823
+ ctx. symtab . addGCRoot (sym->getName ());
853
824
}
854
825
855
826
StringRef LinkerDriver::mangleMaybe (Symbol *s) {
@@ -1487,7 +1458,7 @@ void LinkerDriver::maybeCreateECExportThunk(StringRef name, Symbol *&sym) {
1487
1458
expName = saver ().save (" EXP+" + *mangledName);
1488
1459
else
1489
1460
expName = saver ().save (" EXP+" + name);
1490
- sym = addUndefined (expName);
1461
+ sym = ctx. symtabEC -> addGCRoot (expName);
1491
1462
if (auto undef = dyn_cast<Undefined>(sym)) {
1492
1463
if (!undef->getWeakAlias ()) {
1493
1464
auto thunk = make<ECExportThunkChunk>(def);
@@ -1537,7 +1508,8 @@ void LinkerDriver::createECExportThunks() {
1537
1508
1538
1509
void LinkerDriver::pullArm64ECIcallHelper () {
1539
1510
if (!ctx.config .arm64ECIcallHelper )
1540
- ctx.config .arm64ECIcallHelper = addUndefined (" __icall_helper_arm64ec" );
1511
+ ctx.config .arm64ECIcallHelper =
1512
+ ctx.symtabEC ->addGCRoot (" __icall_helper_arm64ec" );
1541
1513
}
1542
1514
1543
1515
// In MinGW, if no symbols are chosen to be exported, then all symbols are
@@ -1976,6 +1948,7 @@ void LinkerDriver::linkerMain(ArrayRef<const char *> argsArr) {
1976
1948
setMachine (machine);
1977
1949
}
1978
1950
}
1951
+ SymbolTable &mainSymtab = ctx.hybridSymtab ? *ctx.hybridSymtab : ctx.symtab ;
1979
1952
1980
1953
// Handle /nodefaultlib:<filename>
1981
1954
{
@@ -2062,7 +2035,7 @@ void LinkerDriver::linkerMain(ArrayRef<const char *> argsArr) {
2062
2035
2063
2036
// Handle /include
2064
2037
for (auto *arg : args.filtered (OPT_incl))
2065
- addUndefined (arg->getValue ());
2038
+ mainSymtab. addGCRoot (arg->getValue ());
2066
2039
2067
2040
// Handle /implib
2068
2041
if (auto *arg = args.getLastArg (OPT_implib))
@@ -2493,22 +2466,22 @@ void LinkerDriver::linkerMain(ArrayRef<const char *> argsArr) {
2493
2466
if (auto *arg = args.getLastArg (OPT_entry)) {
2494
2467
if (!arg->getValue ()[0 ])
2495
2468
Fatal (ctx) << " missing entry point symbol name" ;
2496
- config->entry = addUndefined (mangle (arg->getValue ()), true );
2469
+ config->entry = ctx. symtab . addGCRoot (mangle (arg->getValue ()), true );
2497
2470
} else if (!config->entry && !config->noEntry ) {
2498
2471
if (args.hasArg (OPT_dll)) {
2499
2472
StringRef s = (config->machine == I386) ? " __DllMainCRTStartup@12"
2500
2473
: " _DllMainCRTStartup" ;
2501
- config->entry = addUndefined (s, true );
2474
+ config->entry = ctx. symtab . addGCRoot (s, true );
2502
2475
} else if (config->driverWdm ) {
2503
2476
// /driver:wdm implies /entry:_NtProcessStartup
2504
- config->entry = addUndefined (mangle (" _NtProcessStartup" ), true );
2477
+ config->entry = ctx. symtab . addGCRoot (mangle (" _NtProcessStartup" ), true );
2505
2478
} else {
2506
2479
// Windows specific -- If entry point name is not given, we need to
2507
2480
// infer that from user-defined entry name.
2508
2481
StringRef s = findDefaultEntry ();
2509
2482
if (s.empty ())
2510
2483
Fatal (ctx) << " entry point must be defined" ;
2511
- config->entry = addUndefined (s, true );
2484
+ config->entry = ctx. symtab . addGCRoot (s, true );
2512
2485
Log (ctx) << " Entry name inferred: " << s;
2513
2486
}
2514
2487
}
@@ -2520,9 +2493,10 @@ void LinkerDriver::linkerMain(ArrayRef<const char *> argsArr) {
2520
2493
for (auto *arg : args.filtered (OPT_delayload)) {
2521
2494
config->delayLoads .insert (StringRef (arg->getValue ()).lower ());
2522
2495
if (config->machine == I386) {
2523
- config->delayLoadHelper = addUndefined (" ___delayLoadHelper2@8" );
2496
+ config->delayLoadHelper = ctx. symtab . addGCRoot (" ___delayLoadHelper2@8" );
2524
2497
} else {
2525
- config->delayLoadHelper = addUndefined (" __delayLoadHelper2" , true );
2498
+ config->delayLoadHelper =
2499
+ ctx.symtab .addGCRoot (" __delayLoadHelper2" , true );
2526
2500
}
2527
2501
}
2528
2502
}
@@ -2659,7 +2633,7 @@ void LinkerDriver::linkerMain(ArrayRef<const char *> argsArr) {
2659
2633
for (Export &e : config->exports ) {
2660
2634
if (!e.forwardTo .empty ())
2661
2635
continue ;
2662
- e.sym = addUndefined (e.name , !e.data );
2636
+ e.sym = ctx. symtab . addGCRoot (e.name , !e.data );
2663
2637
if (e.source != ExportSource::Directives)
2664
2638
e.symbolName = mangleMaybe (e.sym );
2665
2639
}
@@ -2701,13 +2675,13 @@ void LinkerDriver::linkerMain(ArrayRef<const char *> argsArr) {
2701
2675
2702
2676
// Windows specific -- if __load_config_used can be resolved, resolve it.
2703
2677
if (ctx.symtab .findUnderscore (" _load_config_used" ))
2704
- addUndefined (mangle (" _load_config_used" ));
2678
+ ctx. symtab . addGCRoot (mangle (" _load_config_used" ));
2705
2679
2706
2680
if (args.hasArg (OPT_include_optional)) {
2707
2681
// Handle /includeoptional
2708
2682
for (auto *arg : args.filtered (OPT_include_optional))
2709
2683
if (isa_and_nonnull<LazyArchive>(ctx.symtab .find (arg->getValue ())))
2710
- addUndefined (arg->getValue ());
2684
+ ctx. symtab . addGCRoot (arg->getValue ());
2711
2685
}
2712
2686
} while (run ());
2713
2687
}
0 commit comments