[llvm-commits] CVS: llvm/lib/Target/SparcV9/InternalGlobalMapper.cpp

Brian Gaeke gaeke at cs.uiuc.edu
Thu Jun 3 00:12:48 PDT 2004


Changes in directory llvm/lib/Target/SparcV9:

InternalGlobalMapper.cpp added (r1.1)

---
Log message:

Add new internal-global-symbol mapping info pass... may its life be short
and sweet.


---
Diffs of the changes:  (+80 -0)

Index: llvm/lib/Target/SparcV9/InternalGlobalMapper.cpp
diff -c /dev/null llvm/lib/Target/SparcV9/InternalGlobalMapper.cpp:1.1
*** /dev/null	Thu Jun  3 00:03:47 2004
--- llvm/lib/Target/SparcV9/InternalGlobalMapper.cpp	Thu Jun  3 00:03:37 2004
***************
*** 0 ****
--- 1,80 ----
+ //===-- InternalGlobalMapper.cpp - Mapping Info for Internal Globals ------===//
+ // 
+ //                     The LLVM Compiler Infrastructure
+ //
+ // This file was developed by the LLVM research group and is distributed under
+ // the University of Illinois Open Source License. See LICENSE.TXT for details.
+ // 
+ //===----------------------------------------------------------------------===//
+ //
+ // InternalGlobalMapper is a pass that helps the runtime trace optimizer map
+ // the names of internal GlobalValues (which may have mangled,
+ // unreconstructible names in the executable) to pointers. If the name mangler
+ // is changed at some point in the future to allow its results to be
+ // reconstructible (for instance, by making the type mangling symbolic instead
+ // of using a UniqueID) this pass should probably be phased out.
+ //
+ //===----------------------------------------------------------------------===//
+ 
+ #include "llvm/Constants.h"
+ #include "llvm/Module.h"
+ #include "llvm/Pass.h"
+ #include "llvm/Type.h"
+ #include "llvm/DerivedTypes.h"
+ using namespace llvm;
+ 
+ namespace llvm {
+ 
+ typedef std::vector<Constant *> GVVectorTy;
+ 
+ class InternalGlobalMapper : public Pass {
+ public:
+   bool run (Module &M);
+ };
+ 
+ Pass *llvm::createInternalGlobalMapperPass () {
+   return new InternalGlobalMapper ();
+ }
+ 
+ static void maybeAddInternalValueToVector (GVVectorTy &Vector, GlobalValue &GV){
+   // If it's a GlobalValue with internal linkage and a name (i.e. it's going to
+   // be mangled), then put the GV, casted to sbyte*, in the vector. Otherwise
+   // add a null.
+   if (GV.hasInternalLinkage () && GV.hasName ())
+     Vector.push_back (ConstantExpr::getCast
+       (ConstantPointerRef::get (&GV), PointerType::get (Type::SByteTy)));
+   else
+     Vector.push_back (ConstantPointerNull::get (PointerType::get
+                                                 (Type::SByteTy)));
+ }
+ 
+ bool InternalGlobalMapper::run (Module &M) {
+   GVVectorTy gvvector;
+ 
+   // Populate the vector with internal global values and their names.
+   for (Module::giterator i = M.gbegin (), e = M.gend (); i != e; ++i)
+     maybeAddInternalValueToVector (gvvector, *i);
+   for (Module::iterator i = M.begin (), e = M.end (); i != e; ++i)
+     maybeAddInternalValueToVector (gvvector, *i);
+ 
+   // Convert the vector to a constant struct of type {Size, [Size x sbyte*]}.
+   ArrayType *ATy = ArrayType::get (PointerType::get (Type::SByteTy),
+                                   gvvector.size ());
+   std::vector<const Type *> FieldTypes;
+   FieldTypes.push_back (Type::UIntTy);
+   FieldTypes.push_back (ATy);
+   StructType *STy = StructType::get (FieldTypes);
+   std::vector<Constant *> FieldValues;
+   FieldValues.push_back (ConstantUInt::get (Type::UIntTy, gvvector.size ()));
+   FieldValues.push_back (ConstantArray::get (ATy, gvvector));
+   
+   // Add the constant struct to M as an external global symbol named
+   // "_llvm_internalGlobals".
+   new GlobalVariable (STy, true, GlobalValue::ExternalLinkage,
+                       ConstantStruct::get (STy, FieldValues),
+                       "_llvm_internalGlobals", &M);
+ 
+   return true; // Module was modified.
+ }
+ 
+ } // end namespace llvm





More information about the llvm-commits mailing list