: AsmPrinter(O, TM, T) {
}
+ std::set<std::string> ExtWeakSymbols;
+
/// We name each basic block in a Function with a unique number, so
/// that we can consistently refer to them later. This is cleared
/// at the beginning of each call to runOnMachineFunction().
break;
case Function::WeakLinkage:
case Function::LinkOnceLinkage:
- O << "\t.weak\t" << CurrentFnName << "\n";
+ O << TAI->getWeakRefDirective() << CurrentFnName << "\n";
break;
}
EmitAlignment(2, F);
GlobalValue *GV = MO.getGlobal();
std::string Name = Mang->getValueName(GV);
O << Name;
+ if (GV->hasExternalWeakLinkage()) {
+ ExtWeakSymbols.insert(Name);
+ }
}
break;
case MachineOperand::MO_ExternalSymbol:
}
}
+ 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";
+ }
+
AsmPrinter::doFinalization(M);
return false; // success
}
; RUN: llvm-upgrade < %s | llvm-as | llc -march=arm &&
-; RUN: llvm-upgrade < %s | llvm-as | llc -march=arm | grep .weak
+; RUN: llvm-upgrade < %s | llvm-as | llc -march=arm | grep .weak.*f &&
+; RUN: llvm-upgrade < %s | llvm-as | llc -march=arm | grep .weak.*h
implementation ; Functions:
entry:
unreachable
}
+
+void %g() {
+entry:
+ tail call void %h( )
+ ret void
+}
+
+declare extern_weak void %h()