[llvm] [llvm][object][GOFF] refine Global flag conditions (PR #211632)

James Henderson via llvm-commits llvm-commits at lists.llvm.org
Thu Aug 6 01:52:23 PDT 2026


================
@@ -633,3 +633,92 @@ TEST_F(GOFFObjectFileTest, TXTConstruct) {
   StringRef Contents = SectionContent.get();
   EXPECT_EQ(Contents, "\x12\x34\x56\x78\x9a\xbc\xde\xf0");
 }
+
+TEST_F(GOFFObjectFileTest, GlobalSymbols) {
+  // HDR record.
+  addHdrRecord();
+
+  // ESD record 1: type SD
+  addEsdRecord(0x00, 0x01, {0xC1}); // A
+
+  // ESD record 2: type ED
+  addEsdRecord(0x01, 0x02, {0xC2}, 0x01); // B, parent=1
+
+  // ESD record 3: type LD (default binding scope = global)
+  addEsdRecord(0x02, 0x03, {0xC3}, 0x02); // C, parent=2
+
+  // ESD record 4: type PR
+  addEsdRecord(0x03, 0x04, {0xC4}, 0x02); // D, parent=2
+
+  // ESD record 5: type ErWx
+  addEsdRecord(0x04, 0x05, {0xC5}); // E
+
+  // ESD record 6: type LD + Section binding scope (BindingScope=1 -> lower
+  // nibble of BehavioralAttributes[5])
+  addEsdRecord(0x02, 0x06, {0xC6}, 0x02, 0x00, 0x00, 0x00,
+               {0, 0, 0, 0, 0, 0x01, 0, 0, 0, 0}); // F, parent=2
+
+  // ESD record 7: type LD + Module binding scope
+  addEsdRecord(0x02, 0x07, {0xC7}, 0x02, 0x00, 0x00, 0x00,
+               {0, 0, 0, 0, 0, 0x02, 0, 0, 0, 0}); // G, parent=2
+
+  // ESD record 8: type LD + Library binding scope
+  addEsdRecord(0x02, 0x08, {0xC8}, 0x02, 0x00, 0x00, 0x00,
+               {0, 0, 0, 0, 0, 0x03, 0, 0, 0, 0}); // H, parent=2
+
+  // ESD record 9: type LD + Import-Export binding scope
+  addEsdRecord(0x02, 0x09, {0xC9}, 0x02, 0x00, 0x00, 0x00,
+               {0, 0, 0, 0, 0, 0x04, 0, 0, 0, 0}); // I, parent=2
+
+  // ESD record 10: type LD + blank name
+  addEsdRecord(0x02, 0x0A, {0x40}, 0x02); // ' ', parent=2
+
+  // END record.
+  addEndRecord();
+
+  StringRef Data(GOFFData.data(), GOFFData.size());
+
+  Expected<std::unique_ptr<ObjectFile>> GOFFObjOrErr =
+      object::ObjectFile::createGOFFObjectFile(
+          MemoryBufferRef(Data, "dummyGOFF"));
+
+  ASSERT_THAT_EXPECTED(GOFFObjOrErr, Succeeded());
+
+  GOFFObjectFile *GOFFObj =
+      static_cast<GOFFObjectFile *>((*GOFFObjOrErr).get());
+
+  auto SymbolRange = GOFFObj->symbols();
+  auto Symbol = SymbolRange.begin();
+  auto ValidateGlobal = [&](StringRef Name, bool IsGlobal) {
+    ASSERT_TRUE(Symbol != SymbolRange.end());
+
+    // Check Name.
+    Expected<StringRef> SymbolNameOrErr = GOFFObj->getSymbolName(*Symbol);
+    ASSERT_THAT_EXPECTED(SymbolNameOrErr, Succeeded());
+    StringRef SymbolName = SymbolNameOrErr.get();
+    EXPECT_EQ(SymbolName, Name);
+
+    // Check flags.
+    Expected<uint32_t> SymbolFlagsOrErr = Symbol->getFlags();
+    ASSERT_THAT_EXPECTED(SymbolFlagsOrErr, Succeeded());
+    uint32_t SymbolFlags = SymbolFlagsOrErr.get();
+    if (IsGlobal) {
+      EXPECT_TRUE(SymbolFlags & SymbolRef::SF_Global);
+    } else {
+      EXPECT_FALSE(SymbolFlags & SymbolRef::SF_Global);
+    }
----------------
jh7370 wrote:

This is probably fine, but I wonder whether:
```
EXPECT_EQ(SymbolFlags & SymbolRef::SF_Global == IsGlobal);
```
would be a marginal improvement?

https://github.com/llvm/llvm-project/pull/211632


More information about the llvm-commits mailing list