Function temporaries can not overlap with retval or args.See the comment in source...
[oota-llvm.git] / lib / Target / PowerPC / PPCSubtarget.cpp
index dff53baa16b16d3257b968e8a2e9055dcb88a623..425d8e6195c6a5cd7491ba481d7d96bb7ad8b712 100644 (file)
@@ -16,6 +16,7 @@
 #include "llvm/Module.h"
 #include "llvm/Target/TargetMachine.h"
 #include "PPCGenSubtarget.inc"
+#include <cstdlib>
 using namespace llvm;
 
 #if defined(__APPLE__)
@@ -60,6 +61,7 @@ PPCSubtarget::PPCSubtarget(const TargetMachine &tm, const Module &M,
                            const std::string &FS, bool is64Bit)
   : TM(tm)
   , StackAlignment(16)
+  , DarwinDirective(PPC::DIR_NONE)
   , IsGigaProcessor(false)
   , Has64BitSupport(false)
   , Use64BitRegs(false)
@@ -81,22 +83,15 @@ PPCSubtarget::PPCSubtarget(const TargetMachine &tm, const Module &M,
 
   // If we are generating code for ppc64, verify that options make sense.
   if (is64Bit) {
-    if (!has64BitSupport()) {
-      cerr << "PPC: Generation of 64-bit code for a 32-bit processor "
-           << "requested.  Ignoring 32-bit processor feature.\n";
-      Has64BitSupport = true;
-    }
+    Has64BitSupport = true;
     // Silently force 64-bit register use on ppc64.
     Use64BitRegs = true;
   }
   
   // If the user requested use of 64-bit regs, but the cpu selected doesn't
-  // support it, warn and ignore.
-  if (use64BitRegs() && !has64BitSupport()) {
-    cerr << "PPC: 64-bit registers requested on CPU without support.  "
-         << "Disabling 64-bit register use.\n";
+  // support it, ignore.
+  if (use64BitRegs() && !has64BitSupport())
     Use64BitRegs = false;
-  }
   
   // Set the boolean corresponding to the current target triple, or the default
   // if one cannot be determined, to true.
@@ -147,7 +142,11 @@ bool PPCSubtarget::hasLazyResolverStub(const GlobalValue *GV) const {
   // We never hae stubs if HasLazyResolverStubs=false or if in static mode.
   if (!HasLazyResolverStubs || TM.getRelocationModel() == Reloc::Static)
     return false;
-  
+  // If symbol visibility is hidden, the extra load is not needed if
+  // the symbol is definitely defined in the current translation unit.
+  bool isDecl = GV->isDeclaration() && !GV->hasNotBeenReadFromBitcode();
+  if (GV->hasHiddenVisibility() && !isDecl && !GV->hasCommonLinkage())
+    return false;
   return GV->hasWeakLinkage() || GV->hasLinkOnceLinkage() ||
-         (GV->isDeclaration() && !GV->hasNotBeenReadFromBitcode());
+         GV->hasCommonLinkage() || isDecl;
 }