print weak references
authorRafael Espindola <rafael.espindola@gmail.com>
Wed, 6 Dec 2006 13:35:10 +0000 (13:35 +0000)
committerRafael Espindola <rafael.espindola@gmail.com>
Wed, 6 Dec 2006 13:35:10 +0000 (13:35 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@32276 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/ARM/ARMAsmPrinter.cpp
lib/Target/ARM/ARMTargetAsmInfo.cpp
test/CodeGen/ARM/weak.ll

index 093dd6db17ccbcb614eda0451bf60b3ab0889504..5eadee20db169143026899c8db88cf63fefa5b57 100644 (file)
@@ -63,6 +63,8 @@ namespace {
       : 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().
@@ -127,7 +129,7 @@ bool ARMAsmPrinter::runOnMachineFunction(MachineFunction &MF) {
     break;
   case Function::WeakLinkage:
   case Function::LinkOnceLinkage:
-    O << "\t.weak\t" << CurrentFnName << "\n";
+    O << TAI->getWeakRefDirective() << CurrentFnName << "\n";
     break;
   }
   EmitAlignment(2, F);
@@ -244,6 +246,9 @@ void ARMAsmPrinter::printOperand(const MachineInstr *MI, int opNum) {
     GlobalValue *GV = MO.getGlobal();
     std::string Name = Mang->getValueName(GV);
     O << Name;
+    if (GV->hasExternalWeakLinkage()) {
+      ExtWeakSymbols.insert(Name);
+    }
   }
     break;
   case MachineOperand::MO_ExternalSymbol:
@@ -325,6 +330,13 @@ bool ARMAsmPrinter::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 << TAI->getWeakRefDirective() << *i << "\n";
+  }
+
   AsmPrinter::doFinalization(M);
   return false; // success
 }
index 90db46667637a7c61209834b49b25f04b28318d9..510c0092ff5962449bad25f0ff594da21b358b79 100644 (file)
@@ -23,4 +23,5 @@ ARMTargetAsmInfo::ARMTargetAsmInfo(const ARMTargetMachine &TM) {
   CommentString = "@";
   ConstantPoolSection = "\t.text\n";
   AlignmentIsInBytes = false;
+  WeakRefDirective = "\t.weak\t";
 }
index 682da8c42bb6fa2fd43de9d1130a59607c2132ed..049b1ebbe7039bb8725e12f1fa63049e018909c0 100644 (file)
@@ -1,5 +1,6 @@
 ; 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:
 
@@ -7,3 +8,11 @@ weak uint %f() {
 entry:
        unreachable
 }
+
+void %g() {
+entry:
+        tail call void %h( )
+        ret void
+}
+
+declare extern_weak void %h()