@@ -4808,6 +4808,40 @@ void RewriteInstance::updateELFSymbolTable(
4808
4808
// Create a new symbol based on the existing symbol.
4809
4809
ELFSymTy NewSymbol = Symbol;
4810
4810
4811
+ // Handle special symbols based on their name.
4812
+ Expected<StringRef> SymbolName = Symbol.getName (StringSection);
4813
+ assert (SymbolName && " cannot get symbol name" );
4814
+
4815
+ auto updateSymbolValue = [&](const StringRef Name,
4816
+ std::optional<uint64_t > Value = std::nullopt) {
4817
+ NewSymbol.st_value = Value ? *Value : getNewValueForSymbol (Name);
4818
+ NewSymbol.st_shndx = ELF::SHN_ABS;
4819
+ BC->outs () << " BOLT-INFO: setting " << Name << " to 0x"
4820
+ << Twine::utohexstr (NewSymbol.st_value ) << ' \n ' ;
4821
+ };
4822
+
4823
+ if (*SymbolName == " __hot_start" || *SymbolName == " __hot_end" ) {
4824
+ if (opts::HotText) {
4825
+ updateSymbolValue (*SymbolName);
4826
+ ++NumHotTextSymsUpdated;
4827
+ }
4828
+ goto registerSymbol;
4829
+ }
4830
+
4831
+ if (*SymbolName == " __hot_data_start" || *SymbolName == " __hot_data_end" ) {
4832
+ if (opts::HotData) {
4833
+ updateSymbolValue (*SymbolName);
4834
+ ++NumHotDataSymsUpdated;
4835
+ }
4836
+ goto registerSymbol;
4837
+ }
4838
+
4839
+ if (*SymbolName == " _end" ) {
4840
+ if (NextAvailableAddress > Symbol.st_value )
4841
+ updateSymbolValue (*SymbolName, NextAvailableAddress);
4842
+ goto registerSymbol;
4843
+ }
4844
+
4811
4845
if (Function) {
4812
4846
// If the symbol matched a function that was not emitted, update the
4813
4847
// corresponding section index but otherwise leave it unchanged.
@@ -4904,33 +4938,7 @@ void RewriteInstance::updateELFSymbolTable(
4904
4938
}
4905
4939
}
4906
4940
4907
- // Handle special symbols based on their name.
4908
- Expected<StringRef> SymbolName = Symbol.getName (StringSection);
4909
- assert (SymbolName && " cannot get symbol name" );
4910
-
4911
- auto updateSymbolValue = [&](const StringRef Name,
4912
- std::optional<uint64_t > Value = std::nullopt) {
4913
- NewSymbol.st_value = Value ? *Value : getNewValueForSymbol (Name);
4914
- NewSymbol.st_shndx = ELF::SHN_ABS;
4915
- BC->outs () << " BOLT-INFO: setting " << Name << " to 0x"
4916
- << Twine::utohexstr (NewSymbol.st_value ) << ' \n ' ;
4917
- };
4918
-
4919
- if (opts::HotText &&
4920
- (*SymbolName == " __hot_start" || *SymbolName == " __hot_end" )) {
4921
- updateSymbolValue (*SymbolName);
4922
- ++NumHotTextSymsUpdated;
4923
- }
4924
-
4925
- if (opts::HotData && (*SymbolName == " __hot_data_start" ||
4926
- *SymbolName == " __hot_data_end" )) {
4927
- updateSymbolValue (*SymbolName);
4928
- ++NumHotDataSymsUpdated;
4929
- }
4930
-
4931
- if (*SymbolName == " _end" && NextAvailableAddress > Symbol.st_value )
4932
- updateSymbolValue (*SymbolName, NextAvailableAddress);
4933
-
4941
+ registerSymbol:
4934
4942
if (IsDynSym)
4935
4943
Write ((&Symbol - cantFail (Obj.symbols (&SymTabSection)).begin ()) *
4936
4944
sizeof (ELFSymTy),
0 commit comments