/// WeakDefDirective - This directive, if non-null, is used to declare a
/// global as being a weak defined symbol.
const char *WeakDefDirective; // Defaults to NULL.
+
+ /// LinkOnceDirective - This directive, if non-null is used to declare a
+ /// global as being a weak defined symbol. This is used on cygwin/mingw.
+ const char *LinkOnceDirective; // Defaults to NULL.
/// HiddenDirective - This directive, if non-null, is used to declare a
/// global or function as having hidden visibility.
const char *getUsedDirective() const {
return UsedDirective;
}
- const char *getWeakRefDirective() const {
- return WeakRefDirective;
- }
- const char *getWeakDefDirective() const {
- return WeakDefDirective;
- }
+ const char *getWeakRefDirective() const { return WeakRefDirective; }
+ const char *getWeakDefDirective() const { return WeakDefDirective; }
+ const char *getLinkOnceDirective() const { return LinkOnceDirective; }
const char *getHiddenDirective() const {
return HiddenDirective;
}
case GlobalValue::WeakAnyLinkage:
case GlobalValue::WeakODRLinkage:
case GlobalValue::LinkerPrivateLinkage:
- if (Subtarget->isTargetDarwin()) {
+ if (const char *WeakDef = MAI->getWeakDefDirective()) {
+ // .globl _foo
OutStreamer.EmitSymbolAttribute(GVarSym, MCStreamer::Global);
- O << MAI->getWeakDefDirective() << *GVarSym << '\n';
- } else if (Subtarget->isTargetCygMing()) {
+ // .weak_definition _foo
+ O << WeakDef << *GVarSym << '\n';
+ } else if (const char *LinkOnce = MAI->getLinkOnceDirective()) {
+ // .globl _foo
OutStreamer.EmitSymbolAttribute(GVarSym, MCStreamer::Global);
- O << "\t.linkonce same_size\n";
+ // .linkonce same_size
+ O << LinkOnce;
} else
O << "\t.weak\t" << *GVarSym << '\n';
break;
// FIXME: appending linkage variables should go into a section of
// their name or something. For now, just emit them as external.
case GlobalValue::ExternalLinkage:
- // If external or appending, declare as a global symbol
+ // If external or appending, declare as a global symbol.
+ // .globl _foo
OutStreamer.EmitSymbolAttribute(GVarSym, MCStreamer::Global);
break;
case GlobalValue::PrivateLinkage:
EmitAlignment(AlignLog, GVar);
O << *GVarSym << ":";
- if (VerboseAsm){
+ if (VerboseAsm) {
O.PadToColumn(MAI->getCommentColumn());
O << MAI->getCommentString() << ' ';
WriteAsOperand(O, GVar, /*PrintType=*/false, GVar->getParent());