emit global constants
authorRafael Espindola <rafael.espindola@gmail.com>
Thu, 27 Jul 2006 11:38:51 +0000 (11:38 +0000)
committerRafael Espindola <rafael.espindola@gmail.com>
Thu, 27 Jul 2006 11:38:51 +0000 (11:38 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@29344 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/ARM/ARMAsmPrinter.cpp

index efb20d150ed69ded21dc8e6e9465a885c1fefee0..a78e54d0e996fe921b84bc53152c4ddc96e0735e 100644 (file)
@@ -23,6 +23,7 @@
 #include "llvm/CodeGen/MachineFunctionPass.h"
 #include "llvm/CodeGen/MachineConstantPool.h"
 #include "llvm/CodeGen/MachineInstr.h"
+#include "llvm/Target/TargetData.h"
 #include "llvm/Target/TargetMachine.h"
 #include "llvm/Support/Mangler.h"
 #include "llvm/ADT/Statistic.h"
@@ -190,6 +191,34 @@ bool ARMAsmPrinter::doInitialization(Module &M) {
 }
 
 bool ARMAsmPrinter::doFinalization(Module &M) {
+  const TargetData *TD = TM.getTargetData();
+
+  for (Module::const_global_iterator I = M.global_begin(), E = M.global_end();
+       I != E; ++I) {
+    if (!I->hasInitializer())   // External global require no code
+      continue;
+
+    if (EmitSpecialLLVMGlobal(I))
+      continue;
+
+    O << "\n\n";
+    std::string name = Mang->getValueName(I);
+    Constant *C = I->getInitializer();
+    unsigned Size = TD->getTypeSize(C->getType());
+    unsigned Align = TD->getTypeAlignment(C->getType());
+
+    assert (I->getLinkage() == GlobalValue::ExternalLinkage);
+    O << "\t.globl " << name << "\n";
+
+    assert (!C->isNullValue());
+    SwitchToDataSection(".data", I);
+
+    EmitAlignment(Align, I);
+    O << "\t.type " << name << ", %object\n";
+    O << "\t.size " << name << ", " << Size << "\n";
+    O << name << ":\n";
+    EmitGlobalConstant(C);
+  }
   AsmPrinter::doFinalization(M);
   return false; // success
 }