[PATCH] D124392: [AIX][XCOFF] error on emit symbol visibility for XCOFF object file

David Tenty via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Mon Apr 25 08:01:11 PDT 2022


daltenty created this revision.
daltenty added reviewers: Esme, DiggerLin, hubert.reinterpretcast.
Herald added subscribers: hiraditya, nemanjai.
Herald added a project: All.
daltenty requested review of this revision.
Herald added a project: LLVM.
Herald added a subscriber: llvm-commits.

This is a follow on to the revert of D84265 <https://reviews.llvm.org/D84265> to add an error if we'd need to write a non-zero visibility type in the XCOFF object file. We can't currently do that because we lack the auxiliary header to interpret the bits in XCOFF32. This is important because we are currently working on visibility in the assembly writing path, and without this error the visibility could be silently ignored.


https://reviews.llvm.org/D124392

Files:
  llvm/include/llvm/MC/MCSectionXCOFF.h
  llvm/lib/MC/XCOFFObjectWriter.cpp
  llvm/test/CodeGen/PowerPC/aix-xcoff-visibility.ll


Index: llvm/test/CodeGen/PowerPC/aix-xcoff-visibility.ll
===================================================================
--- llvm/test/CodeGen/PowerPC/aix-xcoff-visibility.ll
+++ llvm/test/CodeGen/PowerPC/aix-xcoff-visibility.ll
@@ -3,6 +3,18 @@
 ; RUN: llc -verify-machineinstrs -mtriple powerpc64-ibm-aix-xcoff -mcpu=pwr4 -mattr=-altivec -data-sections=false < %s |\
 ; RUN:   FileCheck %s
 
+; RUN: not --crash llc -verify-machineinstrs -mtriple powerpc-ibm-aix-xcoff \
+; RUN:     -filetype=obj -o %t.o < %s 2>&1 | \
+; RUN:   FileCheck --check-prefix=XCOFF32 %s
+; XCOFF32: LLVM ERROR: Cannot emit non-zero visibility yet.
+
+; RUN: not --crash llc -verify-machineinstrs -mtriple powerpc64-ibm-aix-xcoff \
+; RUN:     -filetype=obj -o %t.o 2>&1 < %s 2>&1 | \
+; RUN:   FileCheck --check-prefix=XCOFF64 %s
+; FIXME: This should check for the visibility error, but we actually fail before
+; that due to unimplemented relocations.
+; XCOFF64: LLVM ERROR: Unimplemented fixup kind.
+
 @b =  global i32 0, align 4
 @b_h = hidden global i32 0, align 4
 
Index: llvm/lib/MC/XCOFFObjectWriter.cpp
===================================================================
--- llvm/lib/MC/XCOFFObjectWriter.cpp
+++ llvm/lib/MC/XCOFFObjectWriter.cpp
@@ -66,6 +66,10 @@
   const MCSymbolXCOFF *const MCSym;
   uint32_t SymbolTableIndex;
 
+  XCOFF::VisibilityType getVisibilityType() const {
+    return MCSym->getVisibilityType();
+  }
+
   XCOFF::StorageClass getStorageClass() const {
     return MCSym->getStorageClass();
   }
@@ -84,6 +88,9 @@
   SmallVector<Symbol, 1> Syms;
   SmallVector<XCOFFRelocation, 1> Relocations;
   StringRef getSymbolTableName() const { return MCSec->getSymbolTableName(); }
+  XCOFF::VisibilityType getVisibilityType() const {
+    return MCSec->getVisibilityType();
+  }
   XCOFFSection(const MCSectionXCOFF *MCSec)
       : MCSec(MCSec), SymbolTableIndex(-1), Address(-1), Size(0) {}
 };
@@ -670,7 +677,8 @@
   // table entries for a detailed description. Since we don't yet support
   // visibility, and all other bits are either optionally set or reserved, this
   // is always zero.
-  // TODO FIXME How to assert a symbol's visibilty is default?
+  if (SymbolType != 0)
+    report_fatal_error("Cannot emit non-zero visibility yet.");
   // TODO Set the function indicator (bit 10, 0x0020) for functions
   // when debugging is enabled.
   W.write<uint16_t>(SymbolType);
@@ -706,7 +714,7 @@
 
   writeSymbolEntry(SymbolRef.getSymbolTableName(),
                    CSectionRef.Address + SymbolOffset, SectionIndex,
-                   /*SymbolType=*/0, SymbolRef.getStorageClass());
+                   SymbolRef.getVisibilityType(), SymbolRef.getStorageClass());
 
   writeSymbolAuxCsectEntry(CSectionRef.SymbolTableIndex, XCOFF::XTY_LD,
                            CSectionRef.MCSec->getMappingClass());
@@ -726,7 +734,7 @@
     const XCOFFSection &CSectionRef, int16_t SectionIndex,
     XCOFF::StorageClass StorageClass) {
   writeSymbolEntry(CSectionRef.getSymbolTableName(), CSectionRef.Address,
-                   SectionIndex, /*SymbolType=*/0, StorageClass);
+                   SectionIndex, CSectionRef.getVisibilityType(), StorageClass);
 
   writeSymbolAuxCsectEntry(CSectionRef.Size, getEncodedType(CSectionRef.MCSec),
                            CSectionRef.MCSec->getMappingClass());
Index: llvm/include/llvm/MC/MCSectionXCOFF.h
===================================================================
--- llvm/include/llvm/MC/MCSectionXCOFF.h
+++ llvm/include/llvm/MC/MCSectionXCOFF.h
@@ -95,6 +95,9 @@
   XCOFF::StorageClass getStorageClass() const {
     return QualName->getStorageClass();
   }
+  XCOFF::VisibilityType getVisibilityType() const {
+    return QualName->getVisibilityType();
+  }
   XCOFF::SymbolType getCSectType() const {
     assert(isCsect() && "Only csect section has symbol type property!");
     return CsectProp->Type;


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D124392.424910.patch
Type: text/x-patch
Size: 3892 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20220425/71a137ed/attachment.bin>


More information about the llvm-commits mailing list