Add weak reference directive.

llvm-svn: 32091
This commit is contained in:
Evan Cheng 2006-12-01 20:47:11 +00:00
parent 16353d6583
commit 022030a425
6 changed files with 20 additions and 11 deletions

View File

@ -211,6 +211,10 @@ namespace llvm {
/// as being used somehow that the assembler can't see. This prevents dead
/// code elimination on some targets.
const char *UsedDirective; // Defaults to null.
/// WeakRefDirective - This directive, if non-null, is used to decalre a
/// global as being a weak undefined symbol.
const char *WeakRefDirective; // Defaults to null.
//===--- Dwarf Emission Directives -----------------------------------===//
@ -422,6 +426,9 @@ namespace llvm {
const char *getUsedDirective() const {
return UsedDirective;
}
const char *getWeakRefDirective() const {
return WeakRefDirective;
}
bool hasLEB128() const {
return HasLEB128;
}

View File

@ -647,11 +647,13 @@ bool DarwinAsmPrinter::doFinalization(Module &M) {
}
}
if (ExtWeakSymbols.begin() != ExtWeakSymbols.end())
SwitchToDataSection("");
for (std::set<std::string>::iterator i = ExtWeakSymbols.begin(),
e = ExtWeakSymbols.end(); i != e; ++i) {
O << "\t.weak_reference " << *i << "\n";
if (TAI->getWeakRefDirective()) {
if (ExtWeakSymbols.begin() != ExtWeakSymbols.end())
SwitchToDataSection("");
for (std::set<std::string>::iterator i = ExtWeakSymbols.begin(),
e = ExtWeakSymbols.end(); i != e; ++i) {
O << TAI->getWeakRefDirective() << *i << "\n";
}
}
bool isPPC64 = TD->getPointerSizeInBits() == 64;

View File

@ -33,6 +33,7 @@ DarwinTargetAsmInfo::DarwinTargetAsmInfo(const PPCTargetMachine &TM) {
StaticCtorsSection = ".mod_init_func";
StaticDtorsSection = ".mod_term_func";
UsedDirective = "\t.no_dead_strip\t";
WeakRefDirective = "\t.weak_reference\t";
InlineAsmStart = "# InlineAsm Start";
InlineAsmEnd = "# InlineAsm End";

View File

@ -61,6 +61,7 @@ TargetAsmInfo::TargetAsmInfo() :
COMMDirectiveTakesAlignment(true),
HasDotTypeDotSizeDirective(true),
UsedDirective(0),
WeakRefDirective(0),
HasLEB128(false),
HasDotLoc(false),
HasDotFile(false),

View File

@ -278,16 +278,12 @@ bool X86SharedAsmPrinter::doFinalization(Module &M) {
O << "\t.ascii \" -export:" << *i << "\"\n";
}
if (!Subtarget->isTargetCygwin()) {
// There is no external weak linkage on Mingw32 platform.
// Defaulting to external
if (TAI->getWeakRefDirective()) {
if (ExtWeakSymbols.begin() != ExtWeakSymbols.end())
SwitchToDataSection("");
for (std::set<std::string>::iterator i = ExtWeakSymbols.begin(),
e = ExtWeakSymbols.end(); i != e; ++i) {
O << (Subtarget->isTargetDarwin() ? "\t.weak_reference" : "\t.weak")
<< " " << *i << "\n";
O << TAI->getWeakRefDirective() << *i << "\n";
}
}

View File

@ -62,6 +62,7 @@ X86TargetAsmInfo::X86TargetAsmInfo(const X86TargetMachine &TM) {
InlineAsmEnd = "# InlineAsm End";
SetDirective = "\t.set";
UsedDirective = "\t.no_dead_strip\t";
WeakRefDirective = "\t.weak_reference\t";
NeedsSet = true;
DwarfAbbrevSection = ".section __DWARF,__debug_abbrev,regular,debug";
@ -86,6 +87,7 @@ X86TargetAsmInfo::X86TargetAsmInfo(const X86TargetMachine &TM) {
// HasDotFile - True if target asm supports .file directives.
// bool HasDotFile; // Defaults to false.
PrivateGlobalPrefix = "."; // Prefix for private global symbols
WeakRefDirective = "\t.weak\t";
DwarfRequiresFrameSection = false;
DwarfAbbrevSection = "\t.section\t.debug_abbrev,\"\",@progbits";
DwarfInfoSection = "\t.section\t.debug_info,\"\",@progbits";