[cfe-commits] r116613 - in /cfe/trunk/lib/CodeGen: CodeGenModule.cpp CodeGenTBAA.cpp CodeGenTBAA.h

Dan Gohman gohman at apple.com
Fri Oct 15 13:23:13 PDT 2010


Author: djg
Date: Fri Oct 15 15:23:12 2010
New Revision: 116613

URL: http://llvm.org/viewvc/llvm-project?rev=116613&view=rev
Log:
Experimental TBAA support for enum types.

Modified:
    cfe/trunk/lib/CodeGen/CodeGenModule.cpp
    cfe/trunk/lib/CodeGen/CodeGenTBAA.cpp
    cfe/trunk/lib/CodeGen/CodeGenTBAA.h

Modified: cfe/trunk/lib/CodeGen/CodeGenModule.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CodeGenModule.cpp?rev=116613&r1=116612&r2=116613&view=diff
==============================================================================
--- cfe/trunk/lib/CodeGen/CodeGenModule.cpp (original)
+++ cfe/trunk/lib/CodeGen/CodeGenModule.cpp Fri Oct 15 15:23:12 2010
@@ -83,7 +83,8 @@
 
   // Enable TBAA unless it's suppressed.
   if (!CodeGenOpts.RelaxedAliasing && CodeGenOpts.OptimizationLevel > 0)
-    TBAA = new CodeGenTBAA(Context, VMContext, getLangOptions());
+    TBAA = new CodeGenTBAA(Context, VMContext, getLangOptions(),
+                           ABI.getMangleContext());
 
   // If debug info generation is enabled, create the CGDebugInfo object.
   DebugInfo = CodeGenOpts.DebugInfo ? new CGDebugInfo(*this) : 0;

Modified: cfe/trunk/lib/CodeGen/CodeGenTBAA.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CodeGenTBAA.cpp?rev=116613&r1=116612&r2=116613&view=diff
==============================================================================
--- cfe/trunk/lib/CodeGen/CodeGenTBAA.cpp (original)
+++ cfe/trunk/lib/CodeGen/CodeGenTBAA.cpp Fri Oct 15 15:23:12 2010
@@ -12,6 +12,7 @@
 //===----------------------------------------------------------------------===//
 
 #include "CodeGenTBAA.h"
+#include "Mangle.h"
 #include "clang/AST/ASTContext.h"
 #include "llvm/LLVMContext.h"
 #include "llvm/Metadata.h"
@@ -19,14 +20,15 @@
 using namespace CodeGen;
 
 CodeGenTBAA::CodeGenTBAA(ASTContext &Ctx, llvm::LLVMContext& VMContext,
-                         const LangOptions &Features)
-  : Context(Ctx), VMContext(VMContext), Features(Features), Root(0), Char(0) {
+                         const LangOptions &Features, MangleContext &MContext)
+  : Context(Ctx), VMContext(VMContext), Features(Features), MContext(MContext),
+    Root(0), Char(0) {
 }
 
 CodeGenTBAA::~CodeGenTBAA() {
 }
 
-llvm::MDNode *CodeGenTBAA::getTBAAInfoForNamedType(const char *NameStr,
+llvm::MDNode *CodeGenTBAA::getTBAAInfoForNamedType(llvm::StringRef NameStr,
                                                    llvm::MDNode *Parent) {
   llvm::Value *Ops[] = {
     llvm::MDString::get(VMContext, NameStr),
@@ -85,6 +87,32 @@
   if (Ty->isPointerType())
     return MetadataCache[Ty] = getTBAAInfoForNamedType("TBAA.pointer", Char);
 
+  // Enum types are distinct types. In C++ they have "underlying types",
+  // however they aren't related for TBAA.
+  if (const EnumType *ETy = dyn_cast<EnumType>(Ty)) {
+    // In C mode, two anonymous enums are compatible iff their members
+    // are the same -- see C99 6.2.7p1. For now, be conservative. We could
+    // theoretically implement this by combining information about all the
+    // members into a single identifying MDNode.
+    if (!Features.CPlusPlus &&
+        ETy->getDecl()->getTypedefForAnonDecl())
+      return MetadataCache[Ty] = Char;
+
+    // In C++ mode, types have linkage, so we can rely on the ODR and
+    // on their mangled names, if they're external.
+    // TODO: Is there a way to get a program-wide unique name for a
+    // decl with local linkage or no linkage?
+    if (Features.CPlusPlus &&
+        ETy->getDecl()->getLinkage() != ExternalLinkage)
+      return MetadataCache[Ty] = Char;
+
+    // TODO: This is using the RTTI name. Is there a better way to get
+    // a unique string for a type?
+    llvm::SmallString<256> OutName;
+    MContext.mangleCXXRTTIName(QualType(ETy, 0), OutName);
+    return MetadataCache[Ty] = getTBAAInfoForNamedType(OutName, Char);
+  }
+
   // For now, handle any other kind of type conservatively.
   return MetadataCache[Ty] = Char;
 }

Modified: cfe/trunk/lib/CodeGen/CodeGenTBAA.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CodeGenTBAA.h?rev=116613&r1=116612&r2=116613&view=diff
==============================================================================
--- cfe/trunk/lib/CodeGen/CodeGenTBAA.h (original)
+++ cfe/trunk/lib/CodeGen/CodeGenTBAA.h Fri Oct 15 15:23:12 2010
@@ -29,7 +29,7 @@
   class Type;
 
 namespace CodeGen {
-  class CGCXXABI;
+  class MangleContext;
   class CGRecordLayout;
 
 /// CodeGenTBAA - This class organizes the cross-module state that is used
@@ -38,6 +38,7 @@
   ASTContext &Context;
   llvm::LLVMContext& VMContext;
   const LangOptions &Features;
+  MangleContext &MContext;
 
   /// MetadataCache - This maps clang::Types to llvm::MDNodes describing them.
   llvm::DenseMap<const Type *, llvm::MDNode *> MetadataCache;
@@ -50,12 +51,13 @@
   /// considered to be equivalent to it.
   llvm::MDNode *Char;
 
-  llvm::MDNode *getTBAAInfoForNamedType(const char *NameStr,
+  llvm::MDNode *getTBAAInfoForNamedType(llvm::StringRef NameStr,
                                         llvm::MDNode *Parent);
 
 public:
   CodeGenTBAA(ASTContext &Ctx, llvm::LLVMContext &VMContext,
-              const LangOptions &Features);
+              const LangOptions &Features,
+              MangleContext &MContext);
   ~CodeGenTBAA();
 
   llvm::MDNode *getTBAAInfo(QualType QTy);





More information about the cfe-commits mailing list