================
@@ -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

Reply via email to