Prior to this diff, names in the __llvm_prf_names section had the format [<filepath>:]<function-name>, e.g., main.cpp:foo, bar. <filepath> is used to discriminate between possibly identical function names when linkage is local and <function-name> simply comes from F.getName(). This has two problems:
- : is commonly found in Objective-C functions so that names like main.mm:-[C foo::] and -[C bar::] are difficult to parse
- <function-name> might be different from the linkage name, so it cannot be used to pass a function order to the linker via -symbol-ordering-file or -order_file (see https://discourse.llvm.org/t/rfc-temporal-profiling-extension-for-irpgo/68068)
Instead, this diff changes the format to [<filepath>;]<linkage-name>, e.g., main.cpp;_foo, _bar. The hope is that ; won't realistically be found in either <filepath> or <linkage-name>.
To prevent invalidating all prior IRPGO profiles, we also lookup the prior name format when a record is not found (see InstrProfSymtab::create(), readMemprof(), and getInstrProfRecord()). It seems that Swift and Clang FE-PGO rely on the original getPGOFuncName(), so we cannot simply replace it.
and --> is