[PATCH] D40176: [CodeGen] Collect information about sizes of accesses and access types for TBAA
This revision was automatically updated to reflect the committed changes. Closed by commit rL319012: [CodeGen] Collect information about sizes of accesses and access types for TBAA (authored by kosarev). Changed prior to commit: https://reviews.llvm.org/D40176?vs=124084&id=124332#toc Repository: rL LLVM https://reviews.llvm.org/D40176 Files: cfe/trunk/lib/CodeGen/CGClass.cpp cfe/trunk/lib/CodeGen/CodeGenModule.cpp cfe/trunk/lib/CodeGen/CodeGenModule.h cfe/trunk/lib/CodeGen/CodeGenTBAA.cpp cfe/trunk/lib/CodeGen/CodeGenTBAA.h Index: cfe/trunk/lib/CodeGen/CodeGenTBAA.h === --- cfe/trunk/lib/CodeGen/CodeGenTBAA.h +++ cfe/trunk/lib/CodeGen/CodeGenTBAA.h @@ -36,40 +36,53 @@ enum class TBAAAccessKind : unsigned { Ordinary, MayAlias, + Incomplete, }; // TBAAAccessInfo - Describes a memory access in terms of TBAA. struct TBAAAccessInfo { TBAAAccessInfo(TBAAAccessKind Kind, llvm::MDNode *BaseType, - llvm::MDNode *AccessType, uint64_t Offset) -: Kind(Kind), BaseType(BaseType), AccessType(AccessType), Offset(Offset) + llvm::MDNode *AccessType, uint64_t Offset, uint64_t Size) +: Kind(Kind), BaseType(BaseType), AccessType(AccessType), + Offset(Offset), Size(Size) {} TBAAAccessInfo(llvm::MDNode *BaseType, llvm::MDNode *AccessType, - uint64_t Offset) -: TBAAAccessInfo(TBAAAccessKind::Ordinary, BaseType, AccessType, Offset) + uint64_t Offset, uint64_t Size) +: TBAAAccessInfo(TBAAAccessKind::Ordinary, BaseType, AccessType, + Offset, Size) {} - explicit TBAAAccessInfo(llvm::MDNode *AccessType) -: TBAAAccessInfo(/* BaseType= */ nullptr, AccessType, /* Offset= */ 0) + explicit TBAAAccessInfo(llvm::MDNode *AccessType, uint64_t Size) +: TBAAAccessInfo(/* BaseType= */ nullptr, AccessType, /* Offset= */ 0, Size) {} TBAAAccessInfo() -: TBAAAccessInfo(/* AccessType= */ nullptr) +: TBAAAccessInfo(/* AccessType= */ nullptr, /* Size= */ 0) {} static TBAAAccessInfo getMayAliasInfo() { -return TBAAAccessInfo(TBAAAccessKind::MayAlias, /* BaseType= */ nullptr, - /* AccessType= */ nullptr, /* Offset= */ 0); +return TBAAAccessInfo(TBAAAccessKind::MayAlias, + /* BaseType= */ nullptr, /* AccessType= */ nullptr, + /* Offset= */ 0, /* Size= */ 0); } bool isMayAlias() const { return Kind == TBAAAccessKind::MayAlias; } + static TBAAAccessInfo getIncompleteInfo() { +return TBAAAccessInfo(TBAAAccessKind::Incomplete, + /* BaseType= */ nullptr, /* AccessType= */ nullptr, + /* Offset= */ 0, /* Size= */ 0); + } + + bool isIncomplete() const { return Kind == TBAAAccessKind::Incomplete; } + bool operator==(const TBAAAccessInfo &Other) const { return Kind == Other.Kind && BaseType == Other.BaseType && AccessType == Other.AccessType && - Offset == Other.Offset; + Offset == Other.Offset && + Size == Other.Size; } bool operator!=(const TBAAAccessInfo &Other) const { @@ -95,12 +108,16 @@ /// Offset - The byte offset of the final access within the base one. Must be /// zero if the base access type is not specified. uint64_t Offset; + + /// Size - The size of access, in bytes. + uint64_t Size; }; /// CodeGenTBAA - This class organizes the cross-module state that is used /// while lowering AST types to LLVM types. class CodeGenTBAA { ASTContext &Context; + llvm::Module &Module; const CodeGenOptions &CodeGenOpts; const LangOptions &Features; MangleContext &MContext; @@ -138,10 +155,10 @@ SmallVectorImpl &Fields, bool MayAlias); - /// A wrapper function to create a scalar type. For struct-path aware TBAA, - /// the scalar type has the same format as the struct type: name, offset, - /// pointer to another node in the type DAG. - llvm::MDNode *createTBAAScalarType(StringRef Name, llvm::MDNode *Parent); + /// createScalarTypeNode - A wrapper function to create a metadata node + /// describing a scalar type. + llvm::MDNode *createScalarTypeNode(StringRef Name, llvm::MDNode *Parent, + uint64_t Size); /// getTypeInfoHelper - An internal helper function to generate metadata used /// to describe accesses to objects of the given type. @@ -152,19 +169,17 @@ llvm::MDNode *getBaseTypeInfoHelper(const Type *Ty); public: - CodeGenTBAA(ASTContext &Ctx, llvm::LLVMContext &VMContext, - const CodeGenOptions &CGO, - const LangOptions &Features, - MangleContext &MContext); + CodeGenTBAA(ASTContext &Ctx, llvm::Module &M, const CodeGenOptions &CGO, + const LangOptions &Features, MangleContext &MContext); ~CodeGenTBAA(); /// getTypeI
[PATCH] D40176: [CodeGen] Collect information about sizes of accesses and access types for TBAA
rjmccall accepted this revision. rjmccall added a comment. This revision is now accepted and ready to land. Alright, I guess this all makes sense. We do have some extensions that are playing around with v-table pointers, so it's probably fair to require the v-table pointer type to be passed down instead of assuming it's just the generic pointer size. https://reviews.llvm.org/D40176 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D40176: [CodeGen] Collect information about sizes of accesses and access types for TBAA
kosarev updated this revision to Diff 124084. kosarev added a comment. Rebased. https://reviews.llvm.org/D40176 Files: lib/CodeGen/CGClass.cpp lib/CodeGen/CodeGenModule.cpp lib/CodeGen/CodeGenModule.h lib/CodeGen/CodeGenTBAA.cpp lib/CodeGen/CodeGenTBAA.h Index: lib/CodeGen/CodeGenTBAA.h === --- lib/CodeGen/CodeGenTBAA.h +++ lib/CodeGen/CodeGenTBAA.h @@ -36,40 +36,53 @@ enum class TBAAAccessKind : unsigned { Ordinary, MayAlias, + Incomplete, }; // TBAAAccessInfo - Describes a memory access in terms of TBAA. struct TBAAAccessInfo { TBAAAccessInfo(TBAAAccessKind Kind, llvm::MDNode *BaseType, - llvm::MDNode *AccessType, uint64_t Offset) -: Kind(Kind), BaseType(BaseType), AccessType(AccessType), Offset(Offset) + llvm::MDNode *AccessType, uint64_t Offset, uint64_t Size) +: Kind(Kind), BaseType(BaseType), AccessType(AccessType), + Offset(Offset), Size(Size) {} TBAAAccessInfo(llvm::MDNode *BaseType, llvm::MDNode *AccessType, - uint64_t Offset) -: TBAAAccessInfo(TBAAAccessKind::Ordinary, BaseType, AccessType, Offset) + uint64_t Offset, uint64_t Size) +: TBAAAccessInfo(TBAAAccessKind::Ordinary, BaseType, AccessType, + Offset, Size) {} - explicit TBAAAccessInfo(llvm::MDNode *AccessType) -: TBAAAccessInfo(/* BaseType= */ nullptr, AccessType, /* Offset= */ 0) + explicit TBAAAccessInfo(llvm::MDNode *AccessType, uint64_t Size) +: TBAAAccessInfo(/* BaseType= */ nullptr, AccessType, /* Offset= */ 0, Size) {} TBAAAccessInfo() -: TBAAAccessInfo(/* AccessType= */ nullptr) +: TBAAAccessInfo(/* AccessType= */ nullptr, /* Size= */ 0) {} static TBAAAccessInfo getMayAliasInfo() { -return TBAAAccessInfo(TBAAAccessKind::MayAlias, /* BaseType= */ nullptr, - /* AccessType= */ nullptr, /* Offset= */ 0); +return TBAAAccessInfo(TBAAAccessKind::MayAlias, + /* BaseType= */ nullptr, /* AccessType= */ nullptr, + /* Offset= */ 0, /* Size= */ 0); } bool isMayAlias() const { return Kind == TBAAAccessKind::MayAlias; } + static TBAAAccessInfo getIncompleteInfo() { +return TBAAAccessInfo(TBAAAccessKind::Incomplete, + /* BaseType= */ nullptr, /* AccessType= */ nullptr, + /* Offset= */ 0, /* Size= */ 0); + } + + bool isIncomplete() const { return Kind == TBAAAccessKind::Incomplete; } + bool operator==(const TBAAAccessInfo &Other) const { return Kind == Other.Kind && BaseType == Other.BaseType && AccessType == Other.AccessType && - Offset == Other.Offset; + Offset == Other.Offset && + Size == Other.Size; } bool operator!=(const TBAAAccessInfo &Other) const { @@ -95,12 +108,16 @@ /// Offset - The byte offset of the final access within the base one. Must be /// zero if the base access type is not specified. uint64_t Offset; + + /// Size - The size of access, in bytes. + uint64_t Size; }; /// CodeGenTBAA - This class organizes the cross-module state that is used /// while lowering AST types to LLVM types. class CodeGenTBAA { ASTContext &Context; + llvm::Module &Module; const CodeGenOptions &CodeGenOpts; const LangOptions &Features; MangleContext &MContext; @@ -138,10 +155,10 @@ SmallVectorImpl &Fields, bool MayAlias); - /// A wrapper function to create a scalar type. For struct-path aware TBAA, - /// the scalar type has the same format as the struct type: name, offset, - /// pointer to another node in the type DAG. - llvm::MDNode *createTBAAScalarType(StringRef Name, llvm::MDNode *Parent); + /// createScalarTypeNode - A wrapper function to create a metadata node + /// describing a scalar type. + llvm::MDNode *createScalarTypeNode(StringRef Name, llvm::MDNode *Parent, + uint64_t Size); /// getTypeInfoHelper - An internal helper function to generate metadata used /// to describe accesses to objects of the given type. @@ -152,19 +169,17 @@ llvm::MDNode *getBaseTypeInfoHelper(const Type *Ty); public: - CodeGenTBAA(ASTContext &Ctx, llvm::LLVMContext &VMContext, - const CodeGenOptions &CGO, - const LangOptions &Features, - MangleContext &MContext); + CodeGenTBAA(ASTContext &Ctx, llvm::Module &M, const CodeGenOptions &CGO, + const LangOptions &Features, MangleContext &MContext); ~CodeGenTBAA(); /// getTypeInfo - Get metadata used to describe accesses to objects of the /// given type. llvm::MDNode *getTypeInfo(QualType QTy); /// getVTablePtrAccessInfo - Get the TBAA information that describes an /// access to a virtual table pointer. - TBAAAccessInfo getVTablePtrAccessInfo(); + TBAAAccessInfo get
[PATCH] D40176: [CodeGen] Collect information about sizes of accesses and access types for TBAA
kosarev added inline comments. Comment at: lib/CodeGen/CGClass.cpp:2426 llvm::StoreInst *Store = Builder.CreateStore(VTableAddressPoint, VTableField); - CGM.DecorateInstructionWithTBAA(Store, CGM.getTBAAVTablePtrAccessInfo()); + TBAAAccessInfo TBAAInfo = CGM.getTBAAVTablePtrAccessInfo(VTablePtrTy); + CGM.DecorateInstructionWithTBAA(Store, TBAAInfo); Now that type and access descriptors include information about sizes, the function needs to know the type of the virtual table pointer to access. Comment at: lib/CodeGen/CodeGenModule.cpp:139 (!CodeGenOpts.RelaxedAliasing && CodeGenOpts.OptimizationLevel > 0)) -TBAA.reset(new CodeGenTBAA(Context, VMContext, CodeGenOpts, getLangOpts(), +TBAA.reset(new CodeGenTBAA(Context, TheModule, CodeGenOpts, getLangOpts(), getCXXABI().getMangleContext())); To clarify why we pass the module instead of LLVM context: we need it to compute the size of virtual table pointers as their types are llvm::Type types and not clang::Type or QualType ones. Comment at: lib/CodeGen/CodeGenModule.cpp:585 + if (AccessType->isIncompleteType()) +return TBAAAccessInfo::getIncompleteInfo(); + getAccessTagInfo() will raise an assertion failure if such an access descriptor is passed to it. This way we explicitly claim that generating access tags for incomplete objects is not allowed. Repository: rL LLVM https://reviews.llvm.org/D40176 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D40176: [CodeGen] Collect information about sizes of accesses and access types for TBAA
kosarev created this revision. kosarev added a project: clang. The information about access and type sizes is necessary for producing TBAA metadata in the new size-aware format. With this patch, https://reviews.llvm.org/D39955 and https://reviews.llvm.org/D39956 in place we should be able to change CodeGenTBAA::createScalarTypeNode() and CodeGenTBAA::getBaseTypeInfo() to generate metadata in the new format under the -new-struct-path-tbaa command-line option. For now, this new information remains unused. Repository: rL LLVM https://reviews.llvm.org/D40176 Files: lib/CodeGen/CGClass.cpp lib/CodeGen/CodeGenModule.cpp lib/CodeGen/CodeGenModule.h lib/CodeGen/CodeGenTBAA.cpp lib/CodeGen/CodeGenTBAA.h Index: lib/CodeGen/CodeGenTBAA.h === --- lib/CodeGen/CodeGenTBAA.h +++ lib/CodeGen/CodeGenTBAA.h @@ -36,40 +36,53 @@ enum class TBAAAccessKind : unsigned { Ordinary, MayAlias, + Incomplete, }; // TBAAAccessInfo - Describes a memory access in terms of TBAA. struct TBAAAccessInfo { TBAAAccessInfo(TBAAAccessKind Kind, llvm::MDNode *BaseType, - llvm::MDNode *AccessType, uint64_t Offset) -: Kind(Kind), BaseType(BaseType), AccessType(AccessType), Offset(Offset) + llvm::MDNode *AccessType, uint64_t Offset, uint64_t Size) +: Kind(Kind), BaseType(BaseType), AccessType(AccessType), + Offset(Offset), Size(Size) {} TBAAAccessInfo(llvm::MDNode *BaseType, llvm::MDNode *AccessType, - uint64_t Offset) -: TBAAAccessInfo(TBAAAccessKind::Ordinary, BaseType, AccessType, Offset) + uint64_t Offset, uint64_t Size) +: TBAAAccessInfo(TBAAAccessKind::Ordinary, BaseType, AccessType, + Offset, Size) {} - explicit TBAAAccessInfo(llvm::MDNode *AccessType) -: TBAAAccessInfo(/* BaseType= */ nullptr, AccessType, /* Offset= */ 0) + explicit TBAAAccessInfo(llvm::MDNode *AccessType, uint64_t Size) +: TBAAAccessInfo(/* BaseType= */ nullptr, AccessType, /* Offset= */ 0, Size) {} TBAAAccessInfo() -: TBAAAccessInfo(/* AccessType= */ nullptr) +: TBAAAccessInfo(/* AccessType= */ nullptr, /* Size= */ 0) {} static TBAAAccessInfo getMayAliasInfo() { -return TBAAAccessInfo(TBAAAccessKind::MayAlias, /* BaseType= */ nullptr, - /* AccessType= */ nullptr, /* Offset= */ 0); +return TBAAAccessInfo(TBAAAccessKind::MayAlias, + /* BaseType= */ nullptr, /* AccessType= */ nullptr, + /* Offset= */ 0, /* Size= */ 0); } bool isMayAlias() const { return Kind == TBAAAccessKind::MayAlias; } + static TBAAAccessInfo getIncompleteInfo() { +return TBAAAccessInfo(TBAAAccessKind::Incomplete, + /* BaseType= */ nullptr, /* AccessType= */ nullptr, + /* Offset= */ 0, /* Size= */ 0); + } + + bool isIncomplete() const { return Kind == TBAAAccessKind::Incomplete; } + bool operator==(const TBAAAccessInfo &Other) const { return Kind == Other.Kind && BaseType == Other.BaseType && AccessType == Other.AccessType && - Offset == Other.Offset; + Offset == Other.Offset && + Size == Other.Size; } bool operator!=(const TBAAAccessInfo &Other) const { @@ -95,12 +108,16 @@ /// Offset - The byte offset of the final access within the base one. Must be /// zero if the base access type is not specified. uint64_t Offset; + + /// Size - The size of access, in bytes. + uint64_t Size; }; /// CodeGenTBAA - This class organizes the cross-module state that is used /// while lowering AST types to LLVM types. class CodeGenTBAA { ASTContext &Context; + llvm::Module &Module; const CodeGenOptions &CodeGenOpts; const LangOptions &Features; MangleContext &MContext; @@ -138,25 +155,23 @@ SmallVectorImpl &Fields, bool MayAlias); - /// A wrapper function to create a scalar type. For struct-path aware TBAA, - /// the scalar type has the same format as the struct type: name, offset, - /// pointer to another node in the type DAG. - llvm::MDNode *createTBAAScalarType(StringRef Name, llvm::MDNode *Parent); + /// createScalarTypeNode - A wrapper function to create metadata nodes + /// describing scalar types. + llvm::MDNode *createScalarTypeNode(StringRef Name, llvm::MDNode *Parent, + uint64_t Size); public: - CodeGenTBAA(ASTContext &Ctx, llvm::LLVMContext &VMContext, - const CodeGenOptions &CGO, - const LangOptions &Features, - MangleContext &MContext); + CodeGenTBAA(ASTContext &Ctx, llvm::Module &M, const CodeGenOptions &CGO, + const LangOptions &Features, MangleContext &MContext); ~CodeGenTBAA(); /// getTypeInfo - Get metadata used to describe accesses to objects of the /// giv