[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