aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDale Johannesen <dalej@apple.com>2008-01-10 02:03:30 +0000
committerDale Johannesen <dalej@apple.com>2008-01-10 02:03:30 +0000
commit038129dd58acbb2cd6e80bee05649903897df967 (patch)
tree66443ca4484e5f02b8e33323cfe31c7f0ce6fa69
parentddd060ffcfd56ef91eb28ce76a2b0576dfe51129 (diff)
Emit unused EH frames for weak definitions on Darwin,
because assembler/linker can't cope with weak absolutes. PR 1880. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@45811 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--include/llvm/Target/TargetAsmInfo.h7
-rw-r--r--lib/CodeGen/DwarfWriter.cpp23
-rw-r--r--lib/Target/PowerPC/PPCTargetAsmInfo.cpp7
-rw-r--r--lib/Target/TargetAsmInfo.cpp1
-rw-r--r--lib/Target/X86/X86TargetAsmInfo.cpp7
5 files changed, 31 insertions, 14 deletions
diff --git a/include/llvm/Target/TargetAsmInfo.h b/include/llvm/Target/TargetAsmInfo.h
index c3182759e8..8192b46f8d 100644
--- a/include/llvm/Target/TargetAsmInfo.h
+++ b/include/llvm/Target/TargetAsmInfo.h
@@ -309,6 +309,10 @@ namespace llvm {
///
const char *GlobalEHDirective; // Defaults to NULL.
+ /// SupportsWeakEmptyEHFrame - True if target assembler and linker will
+ /// handle a weak_definition of constant 0 for an omitted EH frame.
+ bool SupportsWeakOmittedEHFrame; // Defaults to true.
+
/// DwarfSectionOffsetDirective - Special section offset directive.
const char* DwarfSectionOffsetDirective; // Defaults to NULL
@@ -585,6 +589,9 @@ namespace llvm {
const char *getGlobalEHDirective() const {
return GlobalEHDirective;
}
+ bool getSupportsWeakOmittedEHFrame() const {
+ return SupportsWeakOmittedEHFrame;
+ }
const char *getDwarfSectionOffsetDirective() const {
return DwarfSectionOffsetDirective;
}
diff --git a/lib/CodeGen/DwarfWriter.cpp b/lib/CodeGen/DwarfWriter.cpp
index c1091e9e7d..1f7618a533 100644
--- a/lib/CodeGen/DwarfWriter.cpp
+++ b/lib/CodeGen/DwarfWriter.cpp
@@ -2877,18 +2877,25 @@ private:
O << GlobalEHDirective << EHFrameInfo.FnName << "\n";
}
- // If there are no calls then you can't unwind.
- if (!EHFrameInfo.hasCalls) {
+ // If corresponding function is weak definition, this should be too.
+ if ((EHFrameInfo.linkage == Function::WeakLinkage ||
+ EHFrameInfo.linkage == Function::LinkOnceLinkage) &&
+ TAI->getWeakDefDirective())
+ O << TAI->getWeakDefDirective() << EHFrameInfo.FnName << "\n";
+
+ // If there are no calls then you can't unwind. This may mean we can
+ // omit the EH Frame, but some environments do not handle weak absolute
+ // symbols.
+ if (!EHFrameInfo.hasCalls &&
+ ((EHFrameInfo.linkage != Function::WeakLinkage &&
+ EHFrameInfo.linkage != Function::LinkOnceLinkage) ||
+ !TAI->getWeakDefDirective() ||
+ TAI->getSupportsWeakOmittedEHFrame()))
+ {
O << EHFrameInfo.FnName << " = 0\n";
} else {
O << EHFrameInfo.FnName << ":\n";
- // If corresponding function is weak definition, this should be too.
- if ((EHFrameInfo.linkage == Function::WeakLinkage ||
- EHFrameInfo.linkage == Function::LinkOnceLinkage) &&
- TAI->getWeakDefDirective())
- O << TAI->getWeakDefDirective() << EHFrameInfo.FnName << "\n";
-
// EH frame header.
EmitDifference("eh_frame_end", EHFrameInfo.Number,
"eh_frame_begin", EHFrameInfo.Number, true);
diff --git a/lib/Target/PowerPC/PPCTargetAsmInfo.cpp b/lib/Target/PowerPC/PPCTargetAsmInfo.cpp
index 016a7555ed..0cb2fe4573 100644
--- a/lib/Target/PowerPC/PPCTargetAsmInfo.cpp
+++ b/lib/Target/PowerPC/PPCTargetAsmInfo.cpp
@@ -51,8 +51,8 @@ DarwinTargetAsmInfo::DarwinTargetAsmInfo(const PPCTargetMachine &TM)
StaticDtorsSection = ".mod_term_func";
}
UsedDirective = "\t.no_dead_strip\t";
- WeakDefDirective = "\t.weak_definition\t";
- WeakRefDirective = "\t.weak_reference\t";
+ WeakDefDirective = "\t.weak_definition ";
+ WeakRefDirective = "\t.weak_reference ";
HiddenDirective = "\t.private_extern\t";
SupportsExceptionHandling = true;
NeedsIndirectEncoding = true;
@@ -62,12 +62,13 @@ DarwinTargetAsmInfo::DarwinTargetAsmInfo(const PPCTargetMachine &TM)
DwarfEHFrameSection =
".section __TEXT,__eh_frame,coalesced,no_toc+strip_static_syms+live_support";
DwarfExceptionSection = ".section __DATA,__gcc_except_tab";
+ GlobalEHDirective = "\t.globl\t";
+ SupportsWeakOmittedEHFrame = false;
DwarfAbbrevSection = ".section __DWARF,__debug_abbrev,regular,debug";
DwarfInfoSection = ".section __DWARF,__debug_info,regular,debug";
DwarfLineSection = ".section __DWARF,__debug_line,regular,debug";
DwarfFrameSection = ".section __DWARF,__debug_frame,regular,debug";
- GlobalEHDirective = "\t.globl\t";
DwarfPubNamesSection = ".section __DWARF,__debug_pubnames,regular,debug";
DwarfPubTypesSection = ".section __DWARF,__debug_pubtypes,regular,debug";
DwarfStrSection = ".section __DWARF,__debug_str,regular,debug";
diff --git a/lib/Target/TargetAsmInfo.cpp b/lib/Target/TargetAsmInfo.cpp
index d7769bf11c..b87abafc75 100644
--- a/lib/Target/TargetAsmInfo.cpp
+++ b/lib/Target/TargetAsmInfo.cpp
@@ -86,6 +86,7 @@ TargetAsmInfo::TargetAsmInfo() :
SupportsExceptionHandling(false),
DwarfRequiresFrameSection(true),
GlobalEHDirective(0),
+ SupportsWeakOmittedEHFrame(true),
DwarfSectionOffsetDirective(0),
DwarfAbbrevSection(".debug_abbrev"),
DwarfInfoSection(".debug_info"),
diff --git a/lib/Target/X86/X86TargetAsmInfo.cpp b/lib/Target/X86/X86TargetAsmInfo.cpp
index 6bfc326f20..a872778f00 100644
--- a/lib/Target/X86/X86TargetAsmInfo.cpp
+++ b/lib/Target/X86/X86TargetAsmInfo.cpp
@@ -76,8 +76,8 @@ X86TargetAsmInfo::X86TargetAsmInfo(const X86TargetMachine &TM) {
SetDirective = "\t.set";
PCSymbol = ".";
UsedDirective = "\t.no_dead_strip\t";
- WeakDefDirective = "\t.weak_definition\t";
- WeakRefDirective = "\t.weak_reference\t";
+ WeakDefDirective = "\t.weak_definition ";
+ WeakRefDirective = "\t.weak_reference ";
HiddenDirective = "\t.private_extern\t";
// In non-PIC modes, emit a special label before jump tables so that the
@@ -93,7 +93,6 @@ X86TargetAsmInfo::X86TargetAsmInfo(const X86TargetMachine &TM) {
DwarfInfoSection = ".section __DWARF,__debug_info,regular,debug";
DwarfLineSection = ".section __DWARF,__debug_line,regular,debug";
DwarfFrameSection = ".section __DWARF,__debug_frame,regular,debug";
- GlobalEHDirective = "\t.globl\t";
DwarfPubNamesSection = ".section __DWARF,__debug_pubnames,regular,debug";
DwarfPubTypesSection = ".section __DWARF,__debug_pubtypes,regular,debug";
DwarfStrSection = ".section __DWARF,__debug_str,regular,debug";
@@ -105,6 +104,8 @@ X86TargetAsmInfo::X86TargetAsmInfo(const X86TargetMachine &TM) {
// Exceptions handling
if (!Subtarget->is64Bit())
SupportsExceptionHandling = true;
+ GlobalEHDirective = "\t.globl\t";
+ SupportsWeakOmittedEHFrame = false;
AbsoluteEHSectionOffsets = false;
DwarfEHFrameSection =
".section __TEXT,__eh_frame,coalesced,no_toc+strip_static_syms+live_support";