Added the darwin .weak_def_can_be_hidden directive.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@107886 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Kevin Enderby 2010-07-08 17:22:42 +00:00
parent da995609e6
commit f59cac5ed3
7 changed files with 19 additions and 1 deletions

View File

@ -217,6 +217,11 @@ namespace llvm {
/// global as being a weak defined symbol. /// global as being a weak defined symbol.
const char *WeakDefDirective; // Defaults to NULL. const char *WeakDefDirective; // Defaults to NULL.
/// WeakDefAutoPrivateDirective - This directive, if non-null, is used to
/// declare a global as being a weak defined symbol that is automatically
/// made private by the static linker.
const char *WeakDefAutoPrivateDirective; // Defaults to NULL.
/// LinkOnceDirective - This directive, if non-null is used to declare a /// LinkOnceDirective - This directive, if non-null is used to declare a
/// global as being a weak defined symbol. This is used on cygwin/mingw. /// global as being a weak defined symbol. This is used on cygwin/mingw.
const char *LinkOnceDirective; // Defaults to NULL. const char *LinkOnceDirective; // Defaults to NULL.
@ -387,6 +392,9 @@ namespace llvm {
bool hasNoDeadStrip() const { return HasNoDeadStrip; } bool hasNoDeadStrip() const { return HasNoDeadStrip; }
const char *getWeakRefDirective() const { return WeakRefDirective; } const char *getWeakRefDirective() const { return WeakRefDirective; }
const char *getWeakDefDirective() const { return WeakDefDirective; } const char *getWeakDefDirective() const { return WeakDefDirective; }
const char *getWeakDefAutoPrivateDirective() const {
return WeakDefAutoPrivateDirective;
}
const char *getLinkOnceDirective() const { return LinkOnceDirective; } const char *getLinkOnceDirective() const { return LinkOnceDirective; }
MCSymbolAttr getHiddenVisibilityAttr() const { return HiddenVisibilityAttr;} MCSymbolAttr getHiddenVisibilityAttr() const { return HiddenVisibilityAttr;}

View File

@ -38,7 +38,8 @@ enum MCSymbolAttr {
MCSA_Reference, ///< .reference (MachO) MCSA_Reference, ///< .reference (MachO)
MCSA_Weak, ///< .weak MCSA_Weak, ///< .weak
MCSA_WeakDefinition, ///< .weak_definition (MachO) MCSA_WeakDefinition, ///< .weak_definition (MachO)
MCSA_WeakReference ///< .weak_reference (MachO) MCSA_WeakReference, ///< .weak_reference (MachO)
MCSA_WeakDefAutoPrivate ///< .weak_def_can_be_hidden (MachO)
}; };
enum MCAssemblerFlag { enum MCAssemblerFlag {

View File

@ -59,6 +59,7 @@ MCAsmInfo::MCAsmInfo() {
HasNoDeadStrip = false; HasNoDeadStrip = false;
WeakRefDirective = 0; WeakRefDirective = 0;
WeakDefDirective = 0; WeakDefDirective = 0;
WeakDefAutoPrivateDirective = 0;
LinkOnceDirective = 0; LinkOnceDirective = 0;
HiddenVisibilityAttr = MCSA_Hidden; HiddenVisibilityAttr = MCSA_Hidden;
ProtectedVisibilityAttr = MCSA_Protected; ProtectedVisibilityAttr = MCSA_Protected;

View File

@ -33,6 +33,7 @@ MCAsmInfoDarwin::MCAsmInfoDarwin() {
// Directives: // Directives:
WeakDefDirective = "\t.weak_definition "; WeakDefDirective = "\t.weak_definition ";
WeakRefDirective = "\t.weak_reference "; WeakRefDirective = "\t.weak_reference ";
WeakDefAutoPrivateDirective = "\t.weak_def_can_be_hidden ";
ZeroDirective = "\t.space\t"; // ".space N" emits N zeros. ZeroDirective = "\t.space\t"; // ".space N" emits N zeros.
HasMachoZeroFillDirective = true; // Uses .zerofill HasMachoZeroFillDirective = true; // Uses .zerofill
HasMachoTBSSDirective = true; // Uses .tbss HasMachoTBSSDirective = true; // Uses .tbss

View File

@ -288,6 +288,7 @@ void MCAsmStreamer::EmitSymbolAttribute(MCSymbol *Symbol,
case MCSA_WeakDefinition: OS << "\t.weak_definition\t"; break; case MCSA_WeakDefinition: OS << "\t.weak_definition\t"; break;
// .weak_reference // .weak_reference
case MCSA_WeakReference: OS << MAI.getWeakRefDirective(); break; case MCSA_WeakReference: OS << MAI.getWeakRefDirective(); break;
case MCSA_WeakDefAutoPrivate: OS << "\t.weak_def_can_be_hidden\t"; break;
} }
OS << *Symbol; OS << *Symbol;

View File

@ -273,6 +273,10 @@ void MCMachOStreamer::EmitSymbolAttribute(MCSymbol *Symbol,
// it has to be in a coalesced section, but this isn't enforced. // it has to be in a coalesced section, but this isn't enforced.
SD.setFlags(SD.getFlags() | SF_WeakDefinition); SD.setFlags(SD.getFlags() | SF_WeakDefinition);
break; break;
case MCSA_WeakDefAutoPrivate:
SD.setFlags(SD.getFlags() | SF_WeakDefinition | SF_WeakReference);
break;
} }
} }

View File

@ -755,6 +755,8 @@ bool AsmParser::ParseStatement() {
return ParseDirectiveSymbolAttribute(MCSA_WeakDefinition); return ParseDirectiveSymbolAttribute(MCSA_WeakDefinition);
if (IDVal == ".weak_reference") if (IDVal == ".weak_reference")
return ParseDirectiveSymbolAttribute(MCSA_WeakReference); return ParseDirectiveSymbolAttribute(MCSA_WeakReference);
if (IDVal == ".weak_def_can_be_hidden")
return ParseDirectiveSymbolAttribute(MCSA_WeakDefAutoPrivate);
if (IDVal == ".comm") if (IDVal == ".comm")
return ParseDirectiveComm(/*IsLocal=*/false); return ParseDirectiveComm(/*IsLocal=*/false);