It turns out that putting an 8-byte symbol in a 4-byte section makes Solaris ld sulk. GNU ld is perfectly happy with it, which is worrying for a whole other set of reasons...

Thanks to Anton, Duncan and Rafael for helping me track this down.
Pointy hat to Rafael for introducing the bug in the first place.

llvm-svn: 150811
This commit is contained in:
David Chisnall 2012-02-17 16:05:50 +00:00
parent a37a7e5a0f
commit 86b0f069d6
2 changed files with 31 additions and 3 deletions

View File

@ -77,14 +77,14 @@ void TargetLoweringObjectFileELF::emitPersonalityValue(MCStreamer &Streamer,
Flags,
SectionKind::getDataRel(),
0, Label->getName());
unsigned Size = TM.getTargetData()->getPointerSize();
Streamer.SwitchSection(Sec);
Streamer.EmitValueToAlignment(8);
Streamer.EmitValueToAlignment(Size);
Streamer.EmitSymbolAttribute(Label, MCSA_ELF_TypeObject);
const MCExpr *E = MCConstantExpr::Create(8, getContext());
const MCExpr *E = MCConstantExpr::Create(Size, getContext());
Streamer.EmitELFSize(Label, E);
Streamer.EmitLabel(Label);
unsigned Size = TM.getTargetData()->getPointerSize();
Streamer.EmitSymbolValue(Sym, Size);
}

View File

@ -0,0 +1,28 @@
; RUN: llc < %s -relocation-model=pic -disable-cfi -mtriple=x86_64-pc-solaris2.11 -disable-cgp-branch-opts | FileCheck %s -check-prefix=X64
; RUN: llc < %s -relocation-model=pic -disable-cfi -mtriple=i386-pc-solaris2.11 -disable-cgp-branch-opts | FileCheck %s -check-prefix=X32
; PR1632
define void @_Z1fv() {
entry:
invoke void @_Z1gv()
to label %return unwind label %unwind
unwind: ; preds = %entry
%exn = landingpad {i8*, i32} personality i32 (...)* @__gxx_personality_v0
cleanup
ret void
return: ; preds = %eh_then, %entry
ret void
}
declare void @_Z1gv()
declare i32 @__gxx_personality_v0(...)
; X64: .size DW.ref.__gxx_personality_v0, 8
; X64: .quad __gxx_personality_v0
; X32: .size DW.ref.__gxx_personality_v0, 4
; X32: .long __gxx_personality_v0