================
@@ -138,39 +149,60 @@ initializeRecordStreamer(const Module &M,
void ModuleSymbolTable::CollectAsmSymbols(
const Module &M,
- function_ref<void(StringRef, BasicSymbolRef::Flags)> AsmSymbol) {
- initializeRecordStreamer(M, [&](RecordStreamer &Streamer) {
- Streamer.flushSymverDirectives();
-
- for (auto &KV : Streamer) {
- StringRef Key = KV.first();
- RecordStreamer::State Value = KV.second;
- // FIXME: For now we just assume that all asm symbols are executable.
- uint32_t Res = BasicSymbolRef::SF_Executable;
- switch (Value) {
- case RecordStreamer::NeverSeen:
- llvm_unreachable("NeverSeen should have been replaced earlier");
- case RecordStreamer::DefinedGlobal:
- Res |= BasicSymbolRef::SF_Global;
- break;
- case RecordStreamer::Defined:
- break;
- case RecordStreamer::Global:
- case RecordStreamer::Used:
- Res |= BasicSymbolRef::SF_Undefined;
- Res |= BasicSymbolRef::SF_Global;
- break;
- case RecordStreamer::DefinedWeak:
- Res |= BasicSymbolRef::SF_Weak;
- Res |= BasicSymbolRef::SF_Global;
- break;
- case RecordStreamer::UndefinedWeak:
- Res |= BasicSymbolRef::SF_Weak;
- Res |= BasicSymbolRef::SF_Undefined;
- }
- AsmSymbol(Key, BasicSymbolRef::Flags(Res));
+ function_ref<void(StringRef, BasicSymbolRef::Flags)> AsmSymbol,
+ function_ref<void(const DiagnosticInfo &DI)> DiagHandler, StringRef CPU,
+ StringRef Features) {
+
+ MDTuple *SymbolsMD =
+ dyn_cast_if_present<MDTuple>(M.getModuleFlag("global-asm-symbols"));
+
+ if (SymbolsMD) {
+ for (const Metadata *MD : SymbolsMD->operands()) {
+ const MDTuple *SymMD = cast<MDTuple>(MD);
+ const MDString *Name = cast<MDString>(SymMD->getOperand(0));
+ const ConstantInt *Flags =
+ mdconst::extract<ConstantInt>(SymMD->getOperand(1));
+ AsmSymbol(Name->getString(),
+ static_cast<BasicSymbolRef::Flags>(Flags->getZExtValue()));
}
- });
+ return;
+ }
+
+ initializeRecordStreamer(
+ M, CPU, Features,
+ [&](RecordStreamer &Streamer) {
+ Streamer.flushSymverDirectives();
+
+ for (auto &KV : Streamer) {
+ StringRef Key = KV.first();
+ RecordStreamer::State Value = KV.second;
----------------
ilovepi wrote:
you can use destructuring here to make this a bit easier. I think it can also
be a const reference.
```suggestion
for (const auto &[Key, Value] : Streamer) {
```
https://github.com/llvm/llvm-project/pull/174995
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits