WOW, function calls still seem to work after this.
authorAndrew Lenharth <andrewl@lenharth.org>
Wed, 13 Apr 2005 17:17:28 +0000 (17:17 +0000)
committerAndrew Lenharth <andrewl@lenharth.org>
Wed, 13 Apr 2005 17:17:28 +0000 (17:17 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@21286 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/Alpha/AlphaAsmPrinter.cpp
lib/Target/Alpha/AlphaISelPattern.cpp
lib/Target/Alpha/AlphaRegisterInfo.cpp

index 4d4fb94ded2ac14e3f4552ab76e0edf1c2389494..3e7d5e7bbcbf5de2624adde3addaf52736df21a7 100644 (file)
@@ -49,6 +49,7 @@ namespace {
     ///
     typedef std::map<const Value *, unsigned> ValueMapTy;
     ValueMapTy NumberForBB;
+    std::string CurSection;
 
     virtual const char *getPassName() const {
       return "Alpha Assembly Printer";
@@ -62,6 +63,7 @@ namespace {
     bool runOnMachineFunction(MachineFunction &F);    
     bool doInitialization(Module &M);
     bool doFinalization(Module &M);
+    void SwitchSection(std::ostream &OS, const char *NewSection);
   };
 } // end of anonymous namespace
 
@@ -134,8 +136,13 @@ void AlphaAsmPrinter::printOp(const MachineOperand &MO, bool IsCallOp) {
     O << MO.getSymbolName();
     return;
 
-  case MachineOperand::MO_GlobalAddress: 
-    O << Mang->getValueName(MO.getGlobal());
+  case MachineOperand::MO_GlobalAddress:
+    //Abuse PCrel to specify pcrel calls
+    //calls are the only thing that use this flag
+    if (MO.isPCRelative())
+      O << "$" << Mang->getValueName(MO.getGlobal()) << "..ng";
+    else
+      O << Mang->getValueName(MO.getGlobal());
     return;
     
   default:
@@ -169,8 +176,8 @@ bool AlphaAsmPrinter::runOnMachineFunction(MachineFunction &MF) {
   printConstantPool(MF.getConstantPool());
 
   // Print out labels for the function.
-  O << "\t.text\n";
-  emitAlignment(3);
+  SwitchSection(O, "text");
+  emitAlignment(4);
   O << "\t.globl\t" << CurrentFnName << "\n";
   O << "\t.ent\t" << CurrentFnName << "\n";
 
@@ -209,8 +216,9 @@ void AlphaAsmPrinter::printConstantPool(MachineConstantPool *MCP) {
  
   if (CP.empty()) return;
 
+  SwitchSection(O, "section .rodata");
   for (unsigned i = 0, e = CP.size(); i != e; ++i) {
-    O << "\t.section\t.rodata\n";
+    //    SwitchSection(O, "section .rodata, \"dr\"");
     emitAlignment(TD.getTypeAlignmentShift(CP[i]->getType()));
     O << "CPI" << CurrentFnName << "_" << i << ":\t\t\t\t\t" << CommentString
       << *CP[i] << "\n";
@@ -229,18 +237,17 @@ bool AlphaAsmPrinter::doInitialization(Module &M)
 // SwitchSection - Switch to the specified section of the executable if we are
 // not already in it!
 //
-static void SwitchSection(std::ostream &OS, std::string &CurSection,
-                          const char *NewSection) {
+void AlphaAsmPrinter::SwitchSection(std::ostream &OS, const char *NewSection) 
+{
   if (CurSection != NewSection) {
     CurSection = NewSection;
     if (!CurSection.empty())
-      OS << "\t" << NewSection << "\n";
+      OS << "\t." << NewSection << "\n";
   }
 }
 
 bool AlphaAsmPrinter::doFinalization(Module &M) {
   const TargetData &TD = TM.getTargetData();
-  std::string CurSection;
   
   for (Module::const_global_iterator I = M.global_begin(), E = M.global_end(); I != E; ++I)
     if (I->hasInitializer()) {   // External global require no code
@@ -253,7 +260,7 @@ bool AlphaAsmPrinter::doFinalization(Module &M) {
       if (C->isNullValue() && 
           (I->hasLinkOnceLinkage() || I->hasInternalLinkage() ||
            I->hasWeakLinkage() /* FIXME: Verify correct */)) {
-        SwitchSection(O, CurSection, ".data");
+        SwitchSection(O, "data");
         if (I->hasInternalLinkage())
           O << "\t.local " << name << "\n";
         
@@ -268,7 +275,7 @@ bool AlphaAsmPrinter::doFinalization(Module &M) {
         case GlobalValue::WeakLinkage:   // FIXME: Verify correct for weak.
           // Nonnull linkonce -> weak
           O << "\t.weak " << name << "\n";
-          SwitchSection(O, CurSection, "");
+          SwitchSection(O, "");
           O << "\t.section\t.llvm.linkonce.d." << name << ",\"aw\",@progbits\n";
           break;
         case GlobalValue::AppendingLinkage:
@@ -280,9 +287,9 @@ bool AlphaAsmPrinter::doFinalization(Module &M) {
           // FALL THROUGH
         case GlobalValue::InternalLinkage:
           if (C->isNullValue())
-            SwitchSection(O, CurSection, ".data"); //was .bss
+            SwitchSection(O, "bss"); //was .bss
           else
-            SwitchSection(O, CurSection, ".data");
+            SwitchSection(O, "data");
           break;
         case GlobalValue::GhostLinkage:
           std::cerr << "GhostLinkage cannot appear in AlphaAsmPrinter!\n";
index 8f3752f964b863ecf698ebd18e0eba9ca5820917..e594c8664afc76b2cae7a8155dcff25b0938598b 100644 (file)
@@ -1411,15 +1411,15 @@ unsigned ISel::SelectExpr(SDOperand N) {
       if (GlobalAddressSDNode *GASD =
           dyn_cast<GlobalAddressSDNode>(N.getOperand(1))) 
       {
-        //if (GASD->getGlobal()->isExternal()) {
+        if (GASD->getGlobal()->isExternal()) {
           //use safe calling convention
           AlphaLowering.restoreGP(BB);
           has_sym = true;
-          BuildMI(BB, Alpha::CALL, 1).addGlobalAddress(GASD->getGlobal(),true);
-          //} else {
+          BuildMI(BB, Alpha::CALL, 1).addGlobalAddress(GASD->getGlobal());
+        } else {
           //use PC relative branch call
-          //BuildMI(BB, Alpha::BSR, 1, Alpha::R26).addGlobalAddress(GASD->getGlobal(),true);
-          //}
+          BuildMI(BB, Alpha::BSR, 1, Alpha::R26).addGlobalAddress(GASD->getGlobal(),true);
+        }
       } 
       else if (ExternalSymbolSDNode *ESSDN =
                dyn_cast<ExternalSymbolSDNode>(N.getOperand(1))) 
index 96a05938f1a59f32fe447963f64885a67c82443a..eb208a2f2b43b48d06ca4af6d7439caccc9ef328 100644 (file)
@@ -16,6 +16,7 @@
 #include "AlphaRegisterInfo.h"
 #include "llvm/Constants.h"
 #include "llvm/Type.h"
+#include "llvm/Function.h"
 #include "llvm/CodeGen/ValueTypes.h"
 #include "llvm/CodeGen/MachineInstrBuilder.h"
 #include "llvm/CodeGen/MachineFunction.h"
@@ -213,7 +214,10 @@ void AlphaRegisterInfo::emitPrologue(MachineFunction &MF) const {
   //handle GOP offset
   MI = BuildMI(Alpha::LDGP, 0);
   MBB.insert(MBBI, MI);
-
+  //evil const_cast until MO stuff setup to handle const
+  MI = BuildMI(Alpha::ALTENT, 1).addGlobalAddress(const_cast<Function*>(MF.getFunction()), true);
+  MBB.insert(MBBI, MI);
+                                                  
   // Get the number of bytes to allocate from the FrameInfo
   long NumBytes = MFI->getStackSize();