]> granicus.if.org Git - clang/commitdiff
codegen constant data as such. add QualType::isConstant()
authorNuno Lopes <nunoplopes@sapo.pt>
Mon, 1 Sep 2008 11:33:04 +0000 (11:33 +0000)
committerNuno Lopes <nunoplopes@sapo.pt>
Mon, 1 Sep 2008 11:33:04 +0000 (11:33 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@55603 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/AST/Type.h
lib/AST/Type.cpp
lib/CodeGen/CodeGenModule.cpp

index 2921132becbb9bc0acd714bbab2176f291fd8c65..b3fefb265e903e9e24272a69ef26829e27f18716 100644 (file)
@@ -131,6 +131,8 @@ public:
   bool isRestrictQualified() const {
     return (ThePtr & Restrict) ? true : false;
   }
+
+  bool isConstant(ASTContext& Ctx) const;
   
   /// addConst/addVolatile/addRestrict - add the specified type qual to this
   /// QualType.
index 2c5a3f41bf9fec6e5ac30817036d93cd5a696c0e..41cd828f01c2493b97f349425dad7b2fd3e476a1 100644 (file)
@@ -11,6 +11,7 @@
 //
 //===----------------------------------------------------------------------===//
 
+#include "clang/AST/ASTContext.h"
 #include "clang/AST/Type.h"
 #include "clang/AST/DeclCXX.h"
 #include "clang/AST/DeclObjC.h"
 #include <sstream>
 using namespace clang;
 
+bool QualType::isConstant(ASTContext& Ctx) const {
+  if (isConstQualified())
+    return true;
+
+  if (getTypePtr()->isArrayType())
+    return Ctx.getAsArrayType(*this)->getElementType().isConstant(Ctx);
+
+  return false;
+}
+
 void Type::Destroy(ASTContext& C) { delete this; }
 
 void FunctionTypeProto::Destroy(ASTContext& C) {
index 27dd600f0a2b32b4dd406779fecfa3c629663247..5b784aada3f0ab633da70767e1ddf21419ec7c75 100644 (file)
@@ -449,6 +449,7 @@ void CodeGenModule::EmitGlobalVarDefinition(const VarDecl *D) {
   }
 
   GV->setInitializer(Init);
+  GV->setConstant(D->getType().isConstant(Context));
 
   // FIXME: This is silly; getTypeAlign should just work for incomplete arrays
   unsigned Align;