[AIX] Avoid structor alias; die before bad alias codegen

Summary:
`AsmPrinter::emitGlobalIndirectSymbol` is dependent on
`MCStreamer::emitAssignment` to produce `.set` directives for alias
symbols; however, the `.set` pseudo-op on AIX is documented as not
usable with external relocatable terms or expressions, which limits its
applicability in generating alias symbols.

Disable generating aliases on AIX until a different implementation
strategy is available.

Reviewers: cebowleratibm, jasonliu, sfertile, daltenty, DiggerLin

Reviewed By: jasonliu

Differential Revision: https://reviews.llvm.org/D79044
This commit is contained in:
Hubert Tong 2020-05-08 16:29:58 -04:00
parent f66309deab
commit b116ded57d
4 changed files with 27 additions and 2 deletions

View File

@ -4675,8 +4675,8 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA,
// Enable -mconstructor-aliases except on darwin, where we have to work around
// a linker bug (see <rdar://problem/7651567>), and CUDA device code, where
// aliases aren't supported.
if (!RawTriple.isOSDarwin() && !RawTriple.isNVPTX())
// aliases aren't supported. Similarly, aliases aren't yet supported for AIX.
if (!RawTriple.isOSDarwin() && !RawTriple.isNVPTX() && !RawTriple.isOSAIX())
CmdArgs.push_back("-mconstructor-aliases");
// Darwin's kernel doesn't support guard variables; just die if we

View File

@ -0,0 +1,7 @@
// Check that we don't pass -mconstructor-aliases when compiling for AIX.
// RUN: %clang -### -target powerpc-ibm-aix7.1.0.0 %s -c -o %t.o 2>&1 \
// RUN: | FileCheck %s
// RUN: %clang -### -target powerpc64-ibm-aix7.1.0.0 %s -c -o %t.o 2>&1 \
// RUN: | FileCheck %s
// CHECK-NOT: "-mconstructor-aliases"

View File

@ -155,6 +155,14 @@ public:
StringRef getPassName() const override { return "AIX PPC Assembly Printer"; }
bool doInitialization(Module &M) override {
if (M.alias_size() > 0u)
report_fatal_error(
"module has aliases, which LLVM does not yet support for AIX");
return PPCAsmPrinter::doInitialization(M);
}
void SetupMachineFunction(MachineFunction &MF) override;
void emitGlobalVariable(const GlobalVariable *GV) override;

View File

@ -0,0 +1,10 @@
; RUN: not --crash llc < %s -mtriple powerpc-ibm-aix-xcoff 2>&1 | FileCheck %s
; RUN: not --crash llc < %s -mtriple powerpc64-ibm-aix-xcoff 2>&1 | FileCheck %s
; Check that, while generation of aliases on AIX remains unimplemented, llc dies
; with an appropriate message instead of generating incorrect output when an
; alias is encountered.
define i32 @a() { ret i32 0 }
; CHECK: ERROR: module has aliases
@b = internal alias i32 (), i32 ()* @a