From b5bd026a756d8650f2a94607c9b1dc34cf1c024a Mon Sep 17 00:00:00 2001 From: Anton Korobeynikov Date: Sat, 21 Feb 2009 11:53:32 +0000 Subject: Drop bunch of half-working stuff in the ext_weak linkage support. Now we're using one gross, but quite robust hack :) (previous ones did not work, for example, when ext_weak symbol was used deep inside constant expression in the initializer). The proper fix of this problem will require some quite huge asmprinter changes and that's why was postponed. This fixes PR3629 by the way :) git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@65230 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/CodeGen/AsmPrinter/AsmPrinter.cpp | 10 --------- lib/Target/X86/AsmPrinter/X86ATTAsmPrinter.cpp | 25 +++++++++++++++++------ test/CodeGen/X86/2009-02-21-ExtWeakInitializer.ll | 20 ++++++++++++++++++ 3 files changed, 39 insertions(+), 16 deletions(-) create mode 100644 test/CodeGen/X86/2009-02-21-ExtWeakInitializer.ll diff --git a/lib/CodeGen/AsmPrinter/AsmPrinter.cpp b/lib/CodeGen/AsmPrinter/AsmPrinter.cpp index 678488e1b4..d4dd79572e 100644 --- a/lib/CodeGen/AsmPrinter/AsmPrinter.cpp +++ b/lib/CodeGen/AsmPrinter/AsmPrinter.cpp @@ -205,16 +205,6 @@ bool AsmPrinter::doFinalization(Module &M) { printVisibility(Name, I->getVisibility()); O << TAI->getSetDirective() << ' ' << Name << ", " << Target << '\n'; - - // If the aliasee has external weak linkage it can be referenced only by - // alias itself. In this case it can be not in ExtWeakSymbols list. Emit - // weak reference in such case. - if (GV->hasExternalWeakLinkage()) { - if (TAI->getWeakRefDirective()) - O << TAI->getWeakRefDirective() << Target << '\n'; - else - O << "\t.globl\t" << Target << '\n'; - } } } diff --git a/lib/Target/X86/AsmPrinter/X86ATTAsmPrinter.cpp b/lib/Target/X86/AsmPrinter/X86ATTAsmPrinter.cpp index 12cfda16dc..ca1d7385ad 100644 --- a/lib/Target/X86/AsmPrinter/X86ATTAsmPrinter.cpp +++ b/lib/Target/X86/AsmPrinter/X86ATTAsmPrinter.cpp @@ -871,12 +871,6 @@ void X86ATTAsmPrinter::printModuleLevelGV(const GlobalVariable* GVar) { if (TAI->hasDotTypeDotSizeDirective()) O << "\t.size\t" << name << ", " << Size << '\n'; - // If the initializer is a extern weak symbol, remember to emit the weak - // reference! - if (const GlobalValue *GV = dyn_cast(C)) - if (GV->hasExternalWeakLinkage()) - ExtWeakSymbols.insert(GV); - EmitGlobalConstant(C); } @@ -907,6 +901,25 @@ bool X86ATTAsmPrinter::doFinalization(Module &M) { if (I->hasDLLExportLinkage()) DLLExportedGVs.insert(Mang->makeNameProper(I->getName(),"")); + + // If the global is a extern weak symbol, remember to emit the weak + // reference! + // FIXME: This is rather hacky, since we'll emit references to ALL weak stuff, + // not used. But currently it's the only way to deal with extern weak + // initializers hidden deep inside constant expressions. + if (I->hasExternalWeakLinkage()) + ExtWeakSymbols.insert(I); + } + + for (Module::const_iterator I = M.begin(), E = M.end(); + I != E; ++I) { + // If the global is a extern weak symbol, remember to emit the weak + // reference! + // FIXME: This is rather hacky, since we'll emit references to ALL weak stuff, + // not used. But currently it's the only way to deal with extern weak + // initializers hidden deep inside constant expressions. + if (I->hasExternalWeakLinkage()) + ExtWeakSymbols.insert(I); } // Output linker support code for dllexported globals diff --git a/test/CodeGen/X86/2009-02-21-ExtWeakInitializer.ll b/test/CodeGen/X86/2009-02-21-ExtWeakInitializer.ll new file mode 100644 index 0000000000..a6bb7b8615 --- /dev/null +++ b/test/CodeGen/X86/2009-02-21-ExtWeakInitializer.ll @@ -0,0 +1,20 @@ +; RUN: llvm-as < %s | llc | grep weak | count 3 +; PR3629 + +target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-f80:128:128" +target triple = "x86_64-unknown-freebsd7.1" +module asm ".ident\09\22$FreeBSD$\22" + %struct.anon = type <{ %struct.uart_devinfo* }> + %struct.lock_object = type <{ i8*, i32, i32, %struct.witness* }> + %struct.mtx = type <{ %struct.lock_object, i64 }> + %struct.uart_bas = type <{ i64, i64, i32, i32, i32, i8, i8, i8, i8 }> + %struct.uart_class = type opaque + %struct.uart_devinfo = type <{ %struct.anon, %struct.uart_ops*, %struct.uart_bas, i32, i32, i32, i32, i32, i8, i8, i8, i8, i32 (%struct.uart_softc*)*, i32 (%struct.uart_softc*)*, i8*, %struct.mtx* }> + %struct.uart_ops = type <{ i32 (%struct.uart_bas*)*, void (%struct.uart_bas*, i32, i32, i32, i32)*, void (%struct.uart_bas*)*, void (%struct.uart_bas*, i32)*, i32 (%struct.uart_bas*)*, i32 (%struct.uart_bas*, %struct.mtx*)* }> + %struct.uart_softc = type opaque + %struct.witness = type opaque + +@uart_classes = internal global [3 x %struct.uart_class*] [%struct.uart_class* @uart_ns8250_class, %struct.uart_class* @uart_sab82532_class, %struct.uart_class* @uart_z8530_class], align 8 ; <[3 x %struct.uart_class*]*> [#uses=1] +@uart_ns8250_class = extern_weak global %struct.uart_class ; <%struct.uart_class*> [#uses=1] +@uart_sab82532_class = extern_weak global %struct.uart_class ; <%struct.uart_class*> [#uses=1] +@uart_z8530_class = extern_weak global %struct.uart_class ; <%struct.uart_class*> [#uses=1] -- cgit v1.2.3