]> granicus.if.org Git - clang/commitdiff
Move getAccessedFieldNo out of lib/AST/Expr.cpp into
authorDan Gohman <gohman@apple.com>
Thu, 22 May 2008 00:50:06 +0000 (00:50 +0000)
committerDan Gohman <gohman@apple.com>
Thu, 22 May 2008 00:50:06 +0000 (00:50 +0000)
lib/CodeGen/CGExpr.cpp and to change include/clang/AST/Attr.h to
use its own enum for visibility types instead of using
llvm::GlobalValue::VisibilityTypes. These changes eliminate
dependencies in the AST library on LLVM's VMCore library.

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

include/clang/AST/Attr.h
include/clang/AST/Expr.h
lib/AST/Expr.cpp
lib/CodeGen/CGExpr.cpp
lib/CodeGen/CodeGenFunction.cpp
lib/CodeGen/CodeGenFunction.h
lib/CodeGen/CodeGenModule.cpp
lib/CodeGen/CodeGenModule.h
lib/Sema/SemaDecl.cpp

index abdcfb4b05040f6e3e48a31f297a35e342ec9d17..7840d59c3ad105b3d913a91da66b5f73d0c11856 100644 (file)
@@ -14,7 +14,6 @@
 #ifndef LLVM_CLANG_AST_ATTR_H
 #define LLVM_CLANG_AST_ATTR_H
 
-#include "llvm/GlobalValue.h"
 #include <cassert>
 #include <string>
 
@@ -166,12 +165,20 @@ public:
 };
 
 class VisibilityAttr : public Attr {
-  llvm::GlobalValue::VisibilityTypes VisibilityType;
 public:
-  VisibilityAttr(llvm::GlobalValue::VisibilityTypes v) : Attr(Visibility),
+  /// @brief An enumeration for the kinds of visibility of symbols.
+  enum VisibilityTypes {
+    DefaultVisibility = 0,
+    HiddenVisibility,
+    ProtectedVisibility
+  };
+private:
+  VisibilityTypes VisibilityType;
+public:
+  VisibilityAttr(VisibilityTypes v) : Attr(Visibility),
                  VisibilityType(v) {}
 
-  llvm::GlobalValue::VisibilityTypes getVisibility() const { return VisibilityType; }
+  VisibilityTypes getVisibility() const { return VisibilityType; }
 
   // Implement isa/cast/dyncast/etc.
 
index 6f2ff83f5fd1540d73a918a0b21ec03240f4570e..9760b3652f4fef48df6afa31d20fb107377c3f27 100644 (file)
@@ -723,10 +723,6 @@ public:
   /// aggregate Constant of ConstantInt(s).
   void getEncodedElementAccess(llvm::SmallVectorImpl<unsigned> &Elts) const;
   
-  /// getAccessedFieldNo - Given an encoded value and a result number, return
-  /// the input field number being accessed.
-  static unsigned getAccessedFieldNo(unsigned Idx, const llvm::Constant *Elts);
-  
   virtual SourceRange getSourceRange() const {
     return SourceRange(getBase()->getLocStart(), AccessorLoc);
   }
index e7babf42643b69dcd45b9a7eb117eaf1c90219b8..e21686cf4ef10d92d50fd0e48bd0866b095ae0f4 100644 (file)
@@ -16,7 +16,6 @@
 #include "clang/AST/StmtVisitor.h"
 #include "clang/Basic/IdentifierTable.h"
 #include "clang/Basic/TargetInfo.h"
-#include "llvm/Constants.h"
 using namespace clang;
 
 //===----------------------------------------------------------------------===//
@@ -1082,15 +1081,6 @@ void ExtVectorElementExpr::getEncodedElementAccess(
   }
 }
 
-unsigned 
-ExtVectorElementExpr::getAccessedFieldNo(unsigned Idx, 
-                                         const llvm::Constant *Elts) {
-  if (isa<llvm::ConstantAggregateZero>(Elts))
-    return 0;
-  
-  return cast<llvm::ConstantInt>(Elts->getOperand(Idx))->getZExtValue();
-}
-
 // constructor for instance messages.
 ObjCMessageExpr::ObjCMessageExpr(Expr *receiver, Selector selInfo,
                 QualType retType, ObjCMethodDecl *mproto,
index 7fa2e37d9eb0bfeffd036a926918dd7e7ad7a748..b124e34be33a459d26d8dd09ce9a3e312288a6ed 100644 (file)
@@ -60,6 +60,16 @@ RValue CodeGenFunction::EmitAnyExpr(const Expr *E, llvm::Value *AggLoc,
   return RValue::getAggregate(AggLoc);
 }
 
+/// getAccessedFieldNo - Given an encoded value and a result number, return
+/// the input field number being accessed.
+unsigned CodeGenFunction::getAccessedFieldNo(unsigned Idx, 
+                                             const llvm::Constant *Elts) {
+  if (isa<llvm::ConstantAggregateZero>(Elts))
+    return 0;
+  
+  return cast<llvm::ConstantInt>(Elts->getOperand(Idx))->getZExtValue();
+}
+
 
 //===----------------------------------------------------------------------===//
 //                         LValue Expression Emission
@@ -197,7 +207,7 @@ RValue CodeGenFunction::EmitLoadOfExtVectorElementLValue(LValue LV,
   // extracting a single element.  Just codegen as an extractelement.
   const VectorType *ExprVT = ExprType->getAsVectorType();
   if (!ExprVT) {
-    unsigned InIdx = ExtVectorElementExpr::getAccessedFieldNo(0, Elts);
+    unsigned InIdx = getAccessedFieldNo(0, Elts);
     llvm::Value *Elt = llvm::ConstantInt::get(llvm::Type::Int32Ty, InIdx);
     return RValue::get(Builder.CreateExtractElement(Vec, Elt, "tmp"));
   }
@@ -211,7 +221,7 @@ RValue CodeGenFunction::EmitLoadOfExtVectorElementLValue(LValue LV,
   if (NumResultElts == NumSourceElts) {
     llvm::SmallVector<llvm::Constant*, 4> Mask;
     for (unsigned i = 0; i != NumResultElts; ++i) {
-      unsigned InIdx = ExtVectorElementExpr::getAccessedFieldNo(i, Elts);
+      unsigned InIdx = getAccessedFieldNo(i, Elts);
       Mask.push_back(llvm::ConstantInt::get(llvm::Type::Int32Ty, InIdx));
     }
     
@@ -227,7 +237,7 @@ RValue CodeGenFunction::EmitLoadOfExtVectorElementLValue(LValue LV,
   
   // Extract/Insert each element of the result.
   for (unsigned i = 0; i != NumResultElts; ++i) {
-    unsigned InIdx = ExtVectorElementExpr::getAccessedFieldNo(i, Elts);
+    unsigned InIdx = getAccessedFieldNo(i, Elts);
     llvm::Value *Elt = llvm::ConstantInt::get(llvm::Type::Int32Ty, InIdx);
     Elt = Builder.CreateExtractElement(Vec, Elt, "tmp");
     
@@ -338,13 +348,13 @@ void CodeGenFunction::EmitStoreThroughExtVectorComponentLValue(RValue Src,
       llvm::Value *Elt = llvm::ConstantInt::get(llvm::Type::Int32Ty, i);
       Elt = Builder.CreateExtractElement(SrcVal, Elt, "tmp");
       
-      unsigned Idx = ExtVectorElementExpr::getAccessedFieldNo(i, Elts);
+      unsigned Idx = getAccessedFieldNo(i, Elts);
       llvm::Value *OutIdx = llvm::ConstantInt::get(llvm::Type::Int32Ty, Idx);
       Vec = Builder.CreateInsertElement(Vec, Elt, OutIdx, "tmp");
     }
   } else {
     // If the Src is a scalar (not a vector) it must be updating one element.
-    unsigned InIdx = ExtVectorElementExpr::getAccessedFieldNo(0, Elts);
+    unsigned InIdx = getAccessedFieldNo(0, Elts);
     llvm::Value *Elt = llvm::ConstantInt::get(llvm::Type::Int32Ty, InIdx);
     Vec = Builder.CreateInsertElement(Vec, SrcVal, Elt, "tmp");
   }
index 9c5c45de5e909c082717c12379bbc9fb11cfe8ee..e4332f6e7fbf67ea7979e2b160ea503b5c4a50ad 100644 (file)
@@ -171,7 +171,7 @@ void CodeGenFunction::GenerateCode(const FunctionDecl *FD) {
     CurFn->setCallingConv(llvm::CallingConv::Fast);
 
   if (const VisibilityAttr *attr = FD->getAttr<VisibilityAttr>())
-    CurFn->setVisibility(attr->getVisibility());
+    CodeGenModule::setVisibility(CurFn, attr->getVisibility());
   // FIXME: else handle -fvisibility
 
 
index 0693781bce8f7364b80b8d6b800a4b1a17134c71..63d89a78c72c118af392afd1e11af25195f25b9c 100644 (file)
@@ -350,6 +350,11 @@ public:
 
   /// GetAddrOfStaticLocalVar - Return the address of a static local variable.
   llvm::Constant *GetAddrOfStaticLocalVar(const VarDecl *BVD);
+
+  /// getAccessedFieldNo - Given an encoded value and a result number, return
+  /// the input field number being accessed.
+  static unsigned getAccessedFieldNo(unsigned Idx, const llvm::Constant *Elts);
+
   //===--------------------------------------------------------------------===//
   //                            Declaration Emission
   //===--------------------------------------------------------------------===//
index 7bf1e01b27e9e1b2e5937f701ea04980377cba50..ec61d667eed035adc36dc8c73028e7ad326bb728 100644 (file)
@@ -82,6 +82,24 @@ void CodeGenModule::WarnUnsupported(const Decl *D, const char *Type) {
                     &Msg, 1);
 }
 
+/// setVisibility - Set the visibility for the given LLVM GlobalValue
+/// according to the given clang AST visibility value.
+void CodeGenModule::setVisibility(llvm::GlobalValue *GV,
+                                  VisibilityAttr::VisibilityTypes Vis) {
+  switch (Vis) {
+  default: assert(0 && "Unknown visibility!");
+  case VisibilityAttr::DefaultVisibility:
+    GV->setVisibility(llvm::GlobalValue::DefaultVisibility);
+    break;
+  case VisibilityAttr::HiddenVisibility:
+    GV->setVisibility(llvm::GlobalValue::HiddenVisibility);
+    break;
+  case VisibilityAttr::ProtectedVisibility:
+    GV->setVisibility(llvm::GlobalValue::ProtectedVisibility);
+    break;
+  }
+}
+
 /// AddGlobalCtor - Add a function to the list that will be called before
 /// main() runs.
 void CodeGenModule::AddGlobalCtor(llvm::Function * Ctor) {
@@ -467,7 +485,7 @@ void CodeGenModule::EmitGlobalVarInit(const VarDecl *D) {
   GV->setInitializer(Init);
 
   if (const VisibilityAttr *attr = D->getAttr<VisibilityAttr>())
-    GV->setVisibility(attr->getVisibility());
+    setVisibility(GV, attr->getVisibility());
   // FIXME: else handle -fvisibility
   
   // Set the llvm linkage type as appropriate.
index 8a3069e648b866ffabc1d9f2aed4cf8267db8b9a..bc216e4f4852728a0bb5ae76a9a5dfc386d96f6e 100644 (file)
@@ -16,6 +16,7 @@
 
 #include "CodeGenTypes.h"
 #include "CGObjCRuntime.h"
+#include "clang/AST/Attr.h"
 #include "llvm/ADT/DenseMap.h"
 #include "llvm/ADT/StringMap.h"
 
@@ -130,6 +131,11 @@ public:
   /// specified decl yet.
   void WarnUnsupported(const Decl *D, const char *Type);
   
+  /// setVisibility - Set the visibility for the given LLVM GlobalValue
+  /// according to the given clang AST visibility value.
+  static void setVisibility(llvm::GlobalValue *GV,
+                            VisibilityAttr::VisibilityTypes);
+
 private:
   /// ReplaceMapValuesWith - This is a really slow and bad function that
   /// searches for any entries in GlobalDeclMap that point to OldVal, changing
index b0b50bab962aab8632cc73702624c6db11b264f6..35f12c7207bb156f5614c2fd89f980776fa5ba3d 100644 (file)
@@ -2621,16 +2621,16 @@ void Sema::HandleVisibilityAttribute(Decl *d, AttributeList *rawAttr) {
 
   const char *TypeStr = Str->getStrData();
   unsigned TypeLen = Str->getByteLength();
-  llvm::GlobalValue::VisibilityTypes type;
+  VisibilityAttr::VisibilityTypes type;
 
   if (TypeLen == 7 && !memcmp(TypeStr, "default", 7))
-    type = llvm::GlobalValue::DefaultVisibility;
+    type = VisibilityAttr::DefaultVisibility;
   else if (TypeLen == 6 && !memcmp(TypeStr, "hidden", 6))
-    type = llvm::GlobalValue::HiddenVisibility;
+    type = VisibilityAttr::HiddenVisibility;
   else if (TypeLen == 8 && !memcmp(TypeStr, "internal", 8))
-    type = llvm::GlobalValue::HiddenVisibility; // FIXME
+    type = VisibilityAttr::HiddenVisibility; // FIXME
   else if (TypeLen == 9 && !memcmp(TypeStr, "protected", 9))
-    type = llvm::GlobalValue::ProtectedVisibility;
+    type = VisibilityAttr::ProtectedVisibility;
   else {
     Diag(rawAttr->getLoc(), diag::warn_attribute_type_not_supported,
            "visibility", TypeStr);