OSDN Git Service

add an API so target-independent codegen can determine if a constant
authorChris Lattner <sabre@nondot.org>
Tue, 21 Jul 2009 23:34:23 +0000 (23:34 +0000)
committerChris Lattner <sabre@nondot.org>
Tue, 21 Jul 2009 23:34:23 +0000 (23:34 +0000)
pool entry will require relocations against it.  I implemented this
conservatively for ARM, someone who is knowledgable about it should
see if this can be improved.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@76678 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/CodeGen/MachineConstantPool.h
lib/CodeGen/MachineFunction.cpp
lib/Target/ARM/ARMConstantPoolValue.h

index 99996cf..acbbc66 100644 (file)
@@ -41,8 +41,22 @@ public:
 
   /// getType - get type of this MachineConstantPoolValue.
   ///
-  inline const Type *getType() const { return Ty; }
+  const Type *getType() const { return Ty; }
 
+  
+  /// getRelocatationInfo - This method classifies the entry according to
+  /// whether or not it may generate a relocation entry.  This must be
+  /// conservative, so if it might codegen to a relocatable entry, it should say
+  /// so.  The return values are:
+  /// 
+  ///  0: This constant pool entry is guaranteed to never have a relocation
+  ///     applied to it (because it holds a simple constant like '4').
+  ///  1: This entry has relocations, but the entries are guaranteed to be
+  ///     resolvable by the static linker, so the dynamic linker will never see
+  ///     them.
+  ///  2: This entry may have arbitrary relocations. 
+  virtual unsigned getRelocatationInfo() const = 0;
+  
   virtual int getExistingMachineCPValue(MachineConstantPool *CP,
                                         unsigned Alignment) = 0;
 
@@ -94,6 +108,19 @@ public:
   }
 
   const Type *getType() const;
+  
+  /// getRelocatationInfo - This method classifies the entry according to
+  /// whether or not it may generate a relocation entry.  This must be
+  /// conservative, so if it might codegen to a relocatable entry, it should say
+  /// so.  The return values are:
+  /// 
+  ///  0: This constant pool entry is guaranteed to never have a relocation
+  ///     applied to it (because it holds a simple constant like '4').
+  ///  1: This entry has relocations, but the entries are guaranteed to be
+  ///     resolvable by the static linker, so the dynamic linker will never see
+  ///     them.
+  ///  2: This entry may have arbitrary relocations. 
+  unsigned getRelocatationInfo() const;
 };
   
 /// The MachineConstantPool class keeps track of constants referenced by a
index 599efb8..e6ae7dc 100644 (file)
@@ -539,10 +539,29 @@ void MachineJumpTableInfo::dump() const { print(*cerr.stream()); }
 
 const Type *MachineConstantPoolEntry::getType() const {
   if (isMachineConstantPoolEntry())
-      return Val.MachineCPVal->getType();
+    return Val.MachineCPVal->getType();
   return Val.ConstVal->getType();
 }
 
+
+unsigned MachineConstantPoolEntry::getRelocatationInfo() const {
+  if (isMachineConstantPoolEntry())
+    return Val.MachineCPVal->getRelocatationInfo();
+  
+  // FIXME: This API sucks.
+  
+  // If no relocations, return 0.
+  if (!Val.ConstVal->ContainsRelocations())
+    return 0;
+
+  // If it contains no global relocations, return 1.
+  if (!Val.ConstVal->ContainsRelocations(Reloc::Global))
+    return 1;
+
+  // Otherwise, it has general relocations.
+  return 2;
+}
+
 MachineConstantPool::~MachineConstantPool() {
   for (unsigned i = 0, e = Constants.size(); i != e; ++i)
     if (Constants[i].isMachineConstantPoolEntry())
index abf7339..a930889 100644 (file)
@@ -65,6 +65,13 @@ public:
   bool isStub() const { return Kind == ARMCP::CPStub; }
   unsigned char getPCAdjustment() const { return PCAdjust; }
 
+  virtual unsigned getRelocatationInfo() const {
+    // FIXME: This is conservatively claiming that these entries require a
+    // relocation, we may be able to do better than this.
+    return 2;
+  }
+
+  
   virtual int getExistingMachineCPValue(MachineConstantPool *CP,
                                         unsigned Alignment);