diff --git a/llvm/include/llvm/MC/MCSectionXCOFF.h b/llvm/include/llvm/MC/MCSectionXCOFF.h --- a/llvm/include/llvm/MC/MCSectionXCOFF.h +++ b/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; diff --git a/llvm/lib/MC/XCOFFObjectWriter.cpp b/llvm/lib/MC/XCOFFObjectWriter.cpp --- a/llvm/lib/MC/XCOFFObjectWriter.cpp +++ b/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 Syms; SmallVector 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("Emitting non-zero visibilities is not supported yet."); // TODO Set the function indicator (bit 10, 0x0020) for functions // when debugging is enabled. W.write(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()); diff --git a/llvm/test/CodeGen/PowerPC/aix-xcoff-visibility.ll b/llvm/test/CodeGen/PowerPC/aix-xcoff-visibility.ll --- a/llvm/test/CodeGen/PowerPC/aix-xcoff-visibility.ll +++ b/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: Emitting non-zero visibilities is not supported 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