Skip to content
  1. Apr 05, 2013
  2. Apr 04, 2013
    • Manman Ren's avatar
      Initial support for struct-path aware TBAA. · c451e576
      Manman Ren authored
      Added TBAABaseType and TBAAOffset in LValue. These two fields are initialized to
      the actual type and 0, and are updated in EmitLValueForField.
      Path-aware TBAA tags are enabled for EmitLoadOfScalar and EmitStoreOfScalar.
      Added command line option -struct-path-tbaa.
      
      llvm-svn: 178797
      c451e576
    • Manman Ren's avatar
      revert r178784 since it does not have a commit message · 092d9e8f
      Manman Ren authored
      llvm-svn: 178796
      092d9e8f
    • Rafael Espindola's avatar
      Don't patch the storage class of static data members. · 8ac2f590
      Rafael Espindola authored
      This removes a bit of patching that survived r178663. Without it we can produce
      better a better error message for
      
      const int a = 5;
      static const int a;
      
      llvm-svn: 178795
      8ac2f590
    • Jyotsna Verma's avatar
      Hexagon: Expand br_cc. · a929ab58
      Jyotsna Verma authored
      It fixes following tests for Hexagon:
      
      CodeGen/Generic/2003-07-29-BadConstSbyte.ll
      CodeGen/Generic/2005-10-21-longlonggtu.ll
      CodeGen/Generic/2009-04-28-i128-cmp-crash.ll
      CodeGen/Generic/MachineBranchProb.ll
      CodeGen/Generic/builtin-expect.ll
      CodeGen/Generic/pr12507.ll
      
      llvm-svn: 178794
      a929ab58
    • Benjamin Kramer's avatar
      Reassociate: Avoid iterator invalidation. · dd67654a
      Benjamin Kramer authored
      OpndPtrs stored pointers into the Opnd vector that became invalid when the
      vector grows. Store indices instead. Sadly I only have a large testcase that
      only triggers under valgrind, so I didn't include it.
      
      llvm-svn: 178793
      dd67654a
    • Jyotsna Verma's avatar
      Disable 2010-10-01-crash.ll for Hexagon as the Hexagon frontend will · bc03a979
      Jyotsna Verma authored
      never produce a byval parameter with size < 8 bytes.
      
      llvm-svn: 178792
      bc03a979
    • Jyotsna Verma's avatar
      XFAIL example-dynarray.cpp test for Hexagon as some of the header files · abb1ed69
      Jyotsna Verma authored
      are unavailable on Hexagon.
      
      llvm-svn: 178791
      abb1ed69
    • Greg Clayton's avatar
      <rdar://problem/13449987> · 85d0c57b
      Greg Clayton authored
      Show thread name and dispatch queue by default in the thread display.
      
      llvm-svn: 178790
      85d0c57b
    • Greg Clayton's avatar
      <rdar://problem/13457391> · b7ad58a0
      Greg Clayton authored
      LLDB now can use a single dash for all long options for all commands form the command line and from the command interpreter. This involved just switching all calls from getopt_long() to getopt_long_only().
      
      llvm-svn: 178789
      b7ad58a0
    • Nick Kledzik's avatar
      temp change to test case to debug buildbot failure · 563d9dc1
      Nick Kledzik authored
      llvm-svn: 178788
      563d9dc1
    • Nick Kledzik's avatar
      fix DEBUG_WITH_TYPE to build without warnings in non-debug builds · f4fa8c0a
      Nick Kledzik authored
      llvm-svn: 178787
      f4fa8c0a
    • Rafael Espindola's avatar
      Add back parsing of header charactestics. · 7733466c
      Rafael Espindola authored
      It had been dropped during the switch to yaml::IO. Also add a test going
      from yaml2obj to llvm-readobj. It can be extended as we add more
      fields/formats to yaml2obj.
      
      llvm-svn: 178786
      7733466c
    • Edwin Vane's avatar
      lib-ified core cpp11-migrate functionality to support unit tests · 85816488
      Edwin Vane authored
      Summary:
      Transform.* and Transforms.* moved to form a new library: libmigrateCore.
      #includes updated to point to new header locations.
      
      To support autoconf build, Cpp11Migrate.cpp moved to new subdirectory 'tool'
      which also contains build files for creating final binary.
      
      CMake and autoconf updated to build the new library and link it with
      cpp11-migrate and with cpp11-migrate unit tests.
      
      Dummy unit tests replaced with simple, but real, tests for Transform's public
      interface.
      
      TODO: Lib-ifying the transforms to further simplify build of cpp11-migrate.
      llvm-svn: 178785
      85816488
    • Manman Ren's avatar
      Index: include/clang/Driver/CC1Options.td · 037d2b25
      Manman Ren authored
      ===================================================================
      --- include/clang/Driver/CC1Options.td	(revision 178718)
      +++ include/clang/Driver/CC1Options.td	(working copy)
      @@ -161,6 +161,8 @@
         HelpText<"Use register sized accesses to bit-fields, when possible.">;
       def relaxed_aliasing : Flag<["-"], "relaxed-aliasing">,
         HelpText<"Turn off Type Based Alias Analysis">;
      +def struct_path_tbaa : Flag<["-"], "struct-path-tbaa">,
      +  HelpText<"Turn on struct-path aware Type Based Alias Analysis">;
       def masm_verbose : Flag<["-"], "masm-verbose">,
         HelpText<"Generate verbose assembly output">;
       def mcode_model : Separate<["-"], "mcode-model">,
      Index: include/clang/Driver/Options.td
      ===================================================================
      --- include/clang/Driver/Options.td	(revision 178718)
      +++ include/clang/Driver/Options.td	(working copy)
      @@ -587,6 +587,7 @@
         Flags<[CC1Option]>, HelpText<"Disable spell-checking">;
       def fno_stack_protector : Flag<["-"], "fno-stack-protector">, Group<f_Group>;
       def fno_strict_aliasing : Flag<["-"], "fno-strict-aliasing">, Group<f_Group>;
      +def fstruct_path_tbaa : Flag<["-"], "fstruct-path-tbaa">, Group<f_Group>;
       def fno_strict_enums : Flag<["-"], "fno-strict-enums">, Group<f_Group>;
       def fno_strict_overflow : Flag<["-"], "fno-strict-overflow">, Group<f_Group>;
       def fno_threadsafe_statics : Flag<["-"], "fno-threadsafe-statics">, Group<f_Group>,
      Index: include/clang/Frontend/CodeGenOptions.def
      ===================================================================
      --- include/clang/Frontend/CodeGenOptions.def	(revision 178718)
      +++ include/clang/Frontend/CodeGenOptions.def	(working copy)
      @@ -85,6 +85,7 @@
       VALUE_CODEGENOPT(OptimizeSize, 2, 0) ///< If -Os (==1) or -Oz (==2) is specified.
       CODEGENOPT(RelaxAll          , 1, 0) ///< Relax all machine code instructions.
       CODEGENOPT(RelaxedAliasing   , 1, 0) ///< Set when -fno-strict-aliasing is enabled.
      +CODEGENOPT(StructPathTBAA    , 1, 0) ///< Whether or not to use struct-path TBAA.
       CODEGENOPT(SaveTempLabels    , 1, 0) ///< Save temporary labels.
       CODEGENOPT(SanitizeAddressZeroBaseShadow , 1, 0) ///< Map shadow memory at zero
                                                        ///< offset in AddressSanitizer.
      Index: lib/CodeGen/CGExpr.cpp
      ===================================================================
      --- lib/CodeGen/CGExpr.cpp	(revision 178718)
      +++ lib/CodeGen/CGExpr.cpp	(working copy)
      @@ -1044,7 +1044,8 @@
       llvm::Value *CodeGenFunction::EmitLoadOfScalar(LValue lvalue) {
         return EmitLoadOfScalar(lvalue.getAddress(), lvalue.isVolatile(),
                                 lvalue.getAlignment().getQuantity(),
      -                          lvalue.getType(), lvalue.getTBAAInfo());
      +                          lvalue.getType(), lvalue.getTBAAInfo(),
      +                          lvalue.getTBAABaseType(), lvalue.getTBAAOffset());
       }
       
       static bool hasBooleanRepresentation(QualType Ty) {
      @@ -1106,7 +1107,9 @@
       
       llvm::Value *CodeGenFunction::EmitLoadOfScalar(llvm::Value *Addr, bool Volatile,
                                                     unsigned Alignment, QualType Ty,
      -                                              llvm::MDNode *TBAAInfo) {
      +                                              llvm::MDNode *TBAAInfo,
      +                                              QualType TBAABaseType,
      +                                              uint64_t TBAAOffset) {
         // For better performance, handle vector loads differently.
         if (Ty->isVectorType()) {
           llvm::Value *V;
      @@ -1158,8 +1161,11 @@
           Load->setVolatile(true);
         if (Alignment)
           Load->setAlignment(Alignment);
      -  if (TBAAInfo)
      -    CGM.DecorateInstruction(Load, TBAAInfo);
      +  if (TBAAInfo) {
      +    llvm::MDNode *TBAAPath = CGM.getTBAAStructTagInfo(TBAABaseType, TBAAInfo,
      +                                                      TBAAOffset);
      +    CGM.DecorateInstruction(Load, TBAAPath);
      +  }
       
         if ((SanOpts->Bool && hasBooleanRepresentation(Ty)) ||
             (SanOpts->Enum && Ty->getAs<EnumType>())) {
      @@ -1217,7 +1223,8 @@
                                               bool Volatile, unsigned Alignment,
                                               QualType Ty,
                                               llvm::MDNode *TBAAInfo,
      -                                        bool isInit) {
      +                                        bool isInit, QualType TBAABaseType,
      +                                        uint64_t TBAAOffset) {
         
         // Handle vectors differently to get better performance.
         if (Ty->isVectorType()) {
      @@ -1268,15 +1275,19 @@
         llvm::StoreInst *Store = Builder.CreateStore(Value, Addr, Volatile);
         if (Alignment)
           Store->setAlignment(Alignment);
      -  if (TBAAInfo)
      -    CGM.DecorateInstruction(Store, TBAAInfo);
      +  if (TBAAInfo) {
      +    llvm::MDNode *TBAAPath = CGM.getTBAAStructTagInfo(TBAABaseType, TBAAInfo,
      +                                                      TBAAOffset);
      +    CGM.DecorateInstruction(Store, TBAAPath);
      +  }
       }
       
       void CodeGenFunction::EmitStoreOfScalar(llvm::Value *value, LValue lvalue,
                                               bool isInit) {
         EmitStoreOfScalar(value, lvalue.getAddress(), lvalue.isVolatile(),
                           lvalue.getAlignment().getQuantity(), lvalue.getType(),
      -                    lvalue.getTBAAInfo(), isInit);
      +                    lvalue.getTBAAInfo(), isInit, lvalue.getTBAABaseType(),
      +                    lvalue.getTBAAOffset());
       }
       
       /// EmitLoadOfLValue - Given an expression that represents a value lvalue, this
      @@ -2494,9 +2505,12 @@
       
         llvm::Value *addr = base.getAddress();
         unsigned cvr = base.getVRQualifiers();
      +  bool TBAAPath = CGM.getCodeGenOpts().StructPathTBAA;
         if (rec->isUnion()) {
           // For unions, there is no pointer adjustment.
           assert(!type->isReferenceType() && "union has reference member");
      +    // TODO: handle path-aware TBAA for union.
      +    TBAAPath = false;
         } else {
           // For structs, we GEP to the field that the record layout suggests.
           unsigned idx = CGM.getTypes().getCGRecordLayout(rec).getLLVMFieldNo(field);
      @@ -2508,6 +2522,8 @@
             if (cvr & Qualifiers::Volatile) load->setVolatile(true);
             load->setAlignment(alignment.getQuantity());
       
      +      // Loading the reference will disable path-aware TBAA.
      +      TBAAPath = false;
             if (CGM.shouldUseTBAA()) {
               llvm::MDNode *tbaa;
               if (mayAlias)
      @@ -2541,6 +2557,16 @@
       
         LValue LV = MakeAddrLValue(addr, type, alignment);
         LV.getQuals().addCVRQualifiers(cvr);
      +  if (TBAAPath) {
      +    const ASTRecordLayout &Layout =
      +        getContext().getASTRecordLayout(field->getParent());
      +    // Set the base type to be the base type of the base LValue and
      +    // update offset to be relative to the base type.
      +    LV.setTBAABaseType(base.getTBAABaseType());
      +    LV.setTBAAOffset(base.getTBAAOffset() +
      +                     Layout.getFieldOffset(field->getFieldIndex()) /
      +                                           getContext().getCharWidth());
      +  }
       
         // __weak attribute on a field is ignored.
         if (LV.getQuals().getObjCGCAttr() == Qualifiers::Weak)
      Index: lib/CodeGen/CGValue.h
      ===================================================================
      --- lib/CodeGen/CGValue.h	(revision 178718)
      +++ lib/CodeGen/CGValue.h	(working copy)
      @@ -157,6 +157,11 @@
       
         Expr *BaseIvarExp;
       
      +  /// Used by struct-path-aware TBAA.
      +  QualType TBAABaseType;
      +  /// Offset relative to the base type.
      +  uint64_t TBAAOffset;
      +
         /// TBAAInfo - TBAA information to attach to dereferences of this LValue.
         llvm::MDNode *TBAAInfo;
       
      @@ -175,6 +180,10 @@
           this->ImpreciseLifetime = false;
           this->ThreadLocalRef = false;
           this->BaseIvarExp = 0;
      +
      +    // Initialize fields for TBAA.
      +    this->TBAABaseType = Type;
      +    this->TBAAOffset = 0;
           this->TBAAInfo = TBAAInfo;
         }
       
      @@ -232,6 +241,12 @@
         Expr *getBaseIvarExp() const { return BaseIvarExp; }
         void setBaseIvarExp(Expr *V) { BaseIvarExp = V; }
       
      +  QualType getTBAABaseType() const { return TBAABaseType; }
      +  void setTBAABaseType(QualType T) { TBAABaseType = T; }
      +
      +  uint64_t getTBAAOffset() const { return TBAAOffset; }
      +  void setTBAAOffset(uint64_t O) { TBAAOffset = O; }
      +
         llvm::MDNode *getTBAAInfo() const { return TBAAInfo; }
         void setTBAAInfo(llvm::MDNode *N) { TBAAInfo = N; }
       
      Index: lib/CodeGen/CodeGenFunction.h
      ===================================================================
      --- lib/CodeGen/CodeGenFunction.h	(revision 178718)
      +++ lib/CodeGen/CodeGenFunction.h	(working copy)
      @@ -2211,7 +2211,9 @@
         /// the LLVM value representation.
         llvm::Value *EmitLoadOfScalar(llvm::Value *Addr, bool Volatile,
                                       unsigned Alignment, QualType Ty,
      -                                llvm::MDNode *TBAAInfo = 0);
      +                                llvm::MDNode *TBAAInfo = 0,
      +                                QualType TBAABaseTy = QualType(),
      +                                uint64_t TBAAOffset = 0);
       
         /// EmitLoadOfScalar - Load a scalar value from an address, taking
         /// care to appropriately convert from the memory representation to
      @@ -2224,7 +2226,9 @@
         /// the LLVM value representation.
         void EmitStoreOfScalar(llvm::Value *Value, llvm::Value *Addr,
                                bool Volatile, unsigned Alignment, QualType Ty,
      -                         llvm::MDNode *TBAAInfo = 0, bool isInit=false);
      +                         llvm::MDNode *TBAAInfo = 0, bool isInit = false,
      +                         QualType TBAABaseTy = QualType(),
      +                         uint64_t TBAAOffset = 0);
       
         /// EmitStoreOfScalar - Store a scalar value to an address, taking
         /// care to appropriately convert from the memory representation to
      Index: lib/CodeGen/CodeGenModule.cpp
      ===================================================================
      --- lib/CodeGen/CodeGenModule.cpp	(revision 178718)
      +++ lib/CodeGen/CodeGenModule.cpp	(working copy)
      @@ -227,6 +227,20 @@
         return TBAA->getTBAAStructInfo(QTy);
       }
       
      +llvm::MDNode *CodeGenModule::getTBAAStructTypeInfo(QualType QTy) {
      +  if (!TBAA)
      +    return 0;
      +  return TBAA->getTBAAStructTypeInfo(QTy);
      +}
      +
      +llvm::MDNode *CodeGenModule::getTBAAStructTagInfo(QualType BaseTy,
      +                                                  llvm::MDNode *AccessN,
      +                                                  uint64_t O) {
      +  if (!TBAA)
      +    return 0;
      +  return TBAA->getTBAAStructTagInfo(BaseTy, AccessN, O);
      +}
      +
       void CodeGenModule::DecorateInstruction(llvm::Instruction *Inst,
                                               llvm::MDNode *TBAAInfo) {
         Inst->setMetadata(llvm::LLVMContext::MD_tbaa, TBAAInfo);
      Index: lib/CodeGen/CodeGenModule.h
      ===================================================================
      --- lib/CodeGen/CodeGenModule.h	(revision 178718)
      +++ lib/CodeGen/CodeGenModule.h	(working copy)
      @@ -501,6 +501,11 @@
         llvm::MDNode *getTBAAInfo(QualType QTy);
         llvm::MDNode *getTBAAInfoForVTablePtr();
         llvm::MDNode *getTBAAStructInfo(QualType QTy);
      +  /// Return the MDNode in the type DAG for the given struct type.
      +  llvm::MDNode *getTBAAStructTypeInfo(QualType QTy);
      +  /// Return the path-aware tag for given base type, access node and offset.
      +  llvm::MDNode *getTBAAStructTagInfo(QualType BaseTy, llvm::MDNode *AccessN,
      +                                     uint64_t O);
       
         bool isTypeConstant(QualType QTy, bool ExcludeCtorDtor);
       
      Index: lib/CodeGen/CodeGenTBAA.cpp
      ===================================================================
      --- lib/CodeGen/CodeGenTBAA.cpp	(revision 178718)
      +++ lib/CodeGen/CodeGenTBAA.cpp	(working copy)
      @@ -21,6 +21,7 @@
       #include "clang/AST/Mangle.h"
       #include "clang/AST/RecordLayout.h"
       #include "clang/Frontend/CodeGenOptions.h"
      +#include "llvm/ADT/SmallSet.h"
       #include "llvm/IR/Constants.h"
       #include "llvm/IR/LLVMContext.h"
       #include "llvm/IR/Metadata.h"
      @@ -225,3 +226,87 @@
         // For now, handle any other kind of type conservatively.
         return StructMetadataCache[Ty] = NULL;
       }
      +
      +/// Check if the given type can be handled by path-aware TBAA.
      +static bool isTBAAPathStruct(QualType QTy) {
      +  if (const RecordType *TTy = QTy->getAs<RecordType>()) {
      +    const RecordDecl *RD = TTy->getDecl()->getDefinition();
      +    // RD can be struct, union, class, interface or enum.
      +    // For now, we only handle struct.
      +    if (RD->isStruct() && !RD->hasFlexibleArrayMember())
      +      return true;
      +  }
      +  return false;
      +}
      +
      +llvm::MDNode *
      +CodeGenTBAA::getTBAAStructTypeInfo(QualType QTy) {
      +  const Type *Ty = Context.getCanonicalType(QTy).getTypePtr();
      +  assert(isTBAAPathStruct(QTy));
      +
      +  if (llvm::MDNode *N = StructTypeMetadataCache[Ty])
      +    return N;
      +
      +  if (const RecordType *TTy = QTy->getAs<RecordType>()) {
      +    const RecordDecl *RD = TTy->getDecl()->getDefinition();
      +
      +    const ASTRecordLayout &Layout = Context.getASTRecordLayout(RD);
      +    SmallVector <std::pair<uint64_t, llvm::MDNode*>, 4> Fields;
      +    // To reduce the size of MDNode for a given struct type, we only output
      +    // once for all the fields with the same scalar types.
      +    // Offsets for scalar fields in the type DAG are not used.
      +    llvm::SmallSet <llvm::MDNode*, 4> ScalarFieldTypes;
      +    unsigned idx = 0;
      +    for (RecordDecl::field_iterator i = RD->field_begin(),
      +         e = RD->field_end(); i != e; ++i, ++idx) {
      +      QualType FieldQTy = i->getType();
      +      llvm::MDNode *FieldNode;
      +      if (isTBAAPathStruct(FieldQTy))
      +        FieldNode = getTBAAStructTypeInfo(FieldQTy);
      +      else {
      +        FieldNode = getTBAAInfo(FieldQTy);
      +        // Ignore this field if the type already exists.
      +        if (ScalarFieldTypes.count(FieldNode))
      +          continue;
      +        ScalarFieldTypes.insert(FieldNode);
      +       }
      +      if (!FieldNode)
      +        return StructTypeMetadataCache[Ty] = NULL;
      +      Fields.push_back(std::make_pair(
      +          Layout.getFieldOffset(idx) / Context.getCharWidth(), FieldNode));
      +    }
      +
      +    // TODO: This is using the RTTI name. Is there a better way to get
      +    // a unique string for a type?
      +    SmallString<256> OutName;
      +    llvm::raw_svector_ostream Out(OutName);
      +    MContext.mangleCXXRTTIName(QualType(Ty, 0), Out);
      +    Out.flush();
      +    // Create the struct type node with a vector of pairs (offset, type).
      +    return StructTypeMetadataCache[Ty] =
      +      MDHelper.createTBAAStructTypeNode(OutName, Fields);
      +  }
      +
      +  return StructMetadataCache[Ty] = NULL;
      +}
      +
      +llvm::MDNode *
      +CodeGenTBAA::getTBAAStructTagInfo(QualType BaseQTy, llvm::MDNode *AccessNode,
      +                                  uint64_t Offset) {
      +  if (!CodeGenOpts.StructPathTBAA)
      +    return AccessNode;
      +
      +  const Type *BTy = Context.getCanonicalType(BaseQTy).getTypePtr();
      +  TBAAPathTag PathTag = TBAAPathTag(BTy, AccessNode, Offset);
      +  if (llvm::MDNode *N = StructTagMetadataCache[PathTag])
      +    return N;
      +
      +  llvm::MDNode *BNode = 0;
      +  if (isTBAAPathStruct(BaseQTy))
      +    BNode  = getTBAAStructTypeInfo(BaseQTy);
      +  if (!BNode)
      +    return StructTagMetadataCache[PathTag] = AccessNode;
      +
      +  return StructTagMetadataCache[PathTag] =
      +    MDHelper.createTBAAStructTagNode(BNode, AccessNode, Offset);
      +}
      Index: lib/CodeGen/CodeGenTBAA.h
      ===================================================================
      --- lib/CodeGen/CodeGenTBAA.h	(revision 178718)
      +++ lib/CodeGen/CodeGenTBAA.h	(working copy)
      @@ -35,6 +35,14 @@
       namespace CodeGen {
         class CGRecordLayout;
       
      +  struct TBAAPathTag {
      +    TBAAPathTag(const Type *B, const llvm::MDNode *A, uint64_t O)
      +      : BaseT(B), AccessN(A), Offset(O) {}
      +    const Type *BaseT;
      +    const llvm::MDNode *AccessN;
      +    uint64_t Offset;
      +  };
      +
       /// CodeGenTBAA - This class organizes the cross-module state that is used
       /// while lowering AST types to LLVM types.
       class CodeGenTBAA {
      @@ -46,8 +54,13 @@
         // MDHelper - Helper for creating metadata.
         llvm::MDBuilder MDHelper;
       
      -  /// MetadataCache - This maps clang::Types to llvm::MDNodes describing them.
      +  /// MetadataCache - This maps clang::Types to scalar llvm::MDNodes describing
      +  /// them.
         llvm::DenseMap<const Type *, llvm::MDNode *> MetadataCache;
      +  /// This maps clang::Types to a struct node in the type DAG.
      +  llvm::DenseMap<const Type *, llvm::MDNode *> StructTypeMetadataCache;
      +  /// This maps TBAAPathTags to a tag node.
      +  llvm::DenseMap<TBAAPathTag, llvm::MDNode *> StructTagMetadataCache;
       
         /// StructMetadataCache - This maps clang::Types to llvm::MDNodes describing
         /// them for struct assignments.
      @@ -89,9 +102,49 @@
         /// getTBAAStructInfo - Get the TBAAStruct MDNode to be used for a memcpy of
         /// the given type.
         llvm::MDNode *getTBAAStructInfo(QualType QTy);
      +
      +  /// Get the MDNode in the type DAG for given struct type QType.
      +  llvm::MDNode *getTBAAStructTypeInfo(QualType QType);
      +  /// Get the tag MDNode for a given base type, the actual sclar access MDNode
      +  /// and offset into the base type.
      +  llvm::MDNode *getTBAAStructTagInfo(QualType BaseQType,
      +                                     llvm::MDNode *AccessNode, uint64_t Offset);
       };
       
       }  // end namespace CodeGen
       }  // end namespace clang
       
      +namespace llvm {
      +
      +template<> struct DenseMapInfo<clang::CodeGen::TBAAPathTag> {
      +  static clang::CodeGen::TBAAPathTag getEmptyKey() {
      +    return clang::CodeGen::TBAAPathTag(
      +      DenseMapInfo<const clang::Type *>::getEmptyKey(),
      +      DenseMapInfo<const MDNode *>::getEmptyKey(),
      +      DenseMapInfo<uint64_t>::getEmptyKey());
      +  }
      +
      +  static clang::CodeGen::TBAAPathTag getTombstoneKey() {
      +    return clang::CodeGen::TBAAPathTag(
      +      DenseMapInfo<const clang::Type *>::getTombstoneKey(),
      +      DenseMapInfo<const MDNode *>::getTombstoneKey(),
      +      DenseMapInfo<uint64_t>::getTombstoneKey());
      +  }
      +
      +  static unsigned getHashValue(const clang::CodeGen::TBAAPathTag &Val) {
      +    return DenseMapInfo<const clang::Type *>::getHashValue(Val.BaseT) ^
      +           DenseMapInfo<const MDNode *>::getHashValue(Val.AccessN) ^
      +           DenseMapInfo<uint64_t>::getHashValue(Val.Offset);
      +  }
      +
      +  static bool isEqual(const clang::CodeGen::TBAAPathTag &LHS,
      +                      const clang::CodeGen::TBAAPathTag &RHS) {
      +    return LHS.BaseT == RHS.BaseT &&
      +           LHS.AccessN == RHS.AccessN &&
      +           LHS.Offset == RHS.Offset;
      +  }
      +};
      +
      +}  // end namespace llvm
      +
       #endif
      Index: lib/Driver/Tools.cpp
      ===================================================================
      --- lib/Driver/Tools.cpp	(revision 178718)
      +++ lib/Driver/Tools.cpp	(working copy)
      @@ -2105,6 +2105,8 @@
                           options::OPT_fno_strict_aliasing,
                           getToolChain().IsStrictAliasingDefault()))
           CmdArgs.push_back("-relaxed-aliasing");
      +  if (Args.hasArg(options::OPT_fstruct_path_tbaa))
      +    CmdArgs.push_back("-struct-path-tbaa");
         if (Args.hasFlag(options::OPT_fstrict_enums, options::OPT_fno_strict_enums,
                          false))
           CmdArgs.push_back("-fstrict-enums");
      Index: lib/Frontend/CompilerInvocation.cpp
      ===================================================================
      --- lib/Frontend/CompilerInvocation.cpp	(revision 178718)
      +++ lib/Frontend/CompilerInvocation.cpp	(working copy)
      @@ -324,6 +324,7 @@
         Opts.UseRegisterSizedBitfieldAccess = Args.hasArg(
           OPT_fuse_register_sized_bitfield_access);
         Opts.RelaxedAliasing = Args.hasArg(OPT_relaxed_aliasing);
      +  Opts.StructPathTBAA = Args.hasArg(OPT_struct_path_tbaa);
         Opts.DwarfDebugFlags = Args.getLastArgValue(OPT_dwarf_debug_flags);
         Opts.MergeAllConstants = !Args.hasArg(OPT_fno_merge_all_constants);
         Opts.NoCommon = Args.hasArg(OPT_fno_common);
      Index: test/CodeGen/tbaa.cpp
      ===================================================================
      --- test/CodeGen/tbaa.cpp	(revision 0)
      +++ test/CodeGen/tbaa.cpp	(working copy)
      @@ -0,0 +1,217 @@
      +// RUN: %clang_cc1 -O1 -disable-llvm-optzns %s -emit-llvm -o - | FileCheck %s
      +// RUN: %clang_cc1 -O1 -struct-path-tbaa -disable-llvm-optzns %s -emit-llvm -o - | FileCheck %s -check-prefix=PATH
      +// Test TBAA metadata generated by front-end.
      +
      +#include <stdint.h>
      +typedef struct
      +{
      +   uint16_t f16;
      +   uint32_t f32;
      +   uint16_t f16_2;
      +   uint32_t f32_2;
      +} StructA;
      +typedef struct
      +{
      +   uint16_t f16;
      +   StructA a;
      +   uint32_t f32;
      +} StructB;
      +typedef struct
      +{
      +   uint16_t f16;
      +   StructB b;
      +   uint32_t f32;
      +} StructC;
      +typedef struct
      +{
      +   uint16_t f16;
      +   StructB b;
      +   uint32_t f32;
      +   uint8_t f8;
      +} StructD;
      +
      +typedef struct
      +{
      +   uint16_t f16;
      +   uint32_t f32;
      +} StructS;
      +typedef struct
      +{
      +   uint16_t f16;
      +   uint32_t f32;
      +} StructS2;
      +
      +uint32_t g(uint32_t *s, StructA *A, uint64_t count) {
      +// CHECK: define i32 @{{.*}}(
      +// CHECK: store i32 1, i32* %{{.*}}, align 4, !tbaa !4
      +// CHECK: store i32 4, i32* %{{.*}}, align 4, !tbaa !4
      +// PATH: define i32 @{{.*}}(
      +// PATH: store i32 1, i32* %{{.*}}, align 4, !tbaa !4
      +// PATH: store i32 4, i32* %{{.*}}, align 4, !tbaa !5
      +  *s = 1;
      +  A->f32 = 4;
      +  return *s;
      +}
      +
      +uint32_t g2(uint32_t *s, StructA *A, uint64_t count) {
      +// CHECK: define i32 @{{.*}}(
      +// CHECK: store i32 1, i32* %{{.*}}, align 4, !tbaa !4
      +// CHECK: store i16 4, i16* %{{.*}}, align 2, !tbaa !5
      +// PATH: define i32 @{{.*}}(
      +// PATH: store i32 1, i32* %{{.*}}, align 4, !tbaa !4
      +// PATH: store i16 4, i16* %{{.*}}, align 2, !tbaa !8
      +  *s = 1;
      +  A->f16 = 4;
      +  return *s;
      +}
      +
      +uint32_t g3(StructA *A, StructB *B, uint64_t count) {
      +// CHECK: define i32 @{{.*}}(
      +// CHECK: store i32 1, i32* %{{.*}}, align 4, !tbaa !4
      +// CHECK: store i32 4, i32* %{{.*}}, align 4, !tbaa !4
      +// PATH: define i32 @{{.*}}(
      +// PATH: store i32 1, i32* %{{.*}}, align 4, !tbaa !5
      +// PATH: store i32 4, i32* %{{.*}}, align 4, !tbaa !9
      +  A->f32 = 1;
      +  B->a.f32 = 4;
      +  return A->f32;
      +}
      +
      +uint32_t g4(StructA *A, StructB *B, uint64_t count) {
      +// CHECK: define i32 @{{.*}}(
      +// CHECK: store i32 1, i32* %{{.*}}, align 4, !tbaa !4
      +// CHECK: store i16 4, i16* %{{.*}}, align 2, !tbaa !5
      +// PATH: define i32 @{{.*}}(
      +// PATH: store i32 1, i32* %{{.*}}, align 4, !tbaa !5
      +// PATH: store i16 4, i16* %{{.*}}, align 2, !tbaa !11
      +  A->f32 = 1;
      +  B->a.f16 = 4;
      +  return A->f32;
      +}
      +
      +uint32_t g5(StructA *A, StructB *B, uint64_t count) {
      +// CHECK: define i32 @{{.*}}(
      +// CHECK: store i32 1, i32* %{{.*}}, align 4, !tbaa !4
      +// CHECK: store i32 4, i32* %{{.*}}, align 4, !tbaa !4
      +// PATH: define i32 @{{.*}}(
      +// PATH: store i32 1, i32* %{{.*}}, align 4, !tbaa !5
      +// PATH: store i32 4, i32* %{{.*}}, align 4, !tbaa !12
      +  A->f32 = 1;
      +  B->f32 = 4;
      +  return A->f32;
      +}
      +
      +uint32_t g6(StructA *A, StructB *B, uint64_t count) {
      +// CHECK: define i32 @{{.*}}(
      +// CHECK: store i32 1, i32* %{{.*}}, align 4, !tbaa !4
      +// CHECK: store i32 4, i32* %{{.*}}, align 4, !tbaa !4
      +// PATH: define i32 @{{.*}}(
      +// PATH: store i32 1, i32* %{{.*}}, align 4, !tbaa !5
      +// PATH: store i32 4, i32* %{{.*}}, align 4, !tbaa !13
      +  A->f32 = 1;
      +  B->a.f32_2 = 4;
      +  return A->f32;
      +}
      +
      +uint32_t g7(StructA *A, StructS *S, uint64_t count) {
      +// CHECK: define i32 @{{.*}}(
      +// CHECK: store i32 1, i32* %{{.*}}, align 4, !tbaa !4
      +// CHECK: store i32 4, i32* %{{.*}}, align 4, !tbaa !4
      +// PATH: define i32 @{{.*}}(
      +// PATH: store i32 1, i32* %{{.*}}, align 4, !tbaa !5
      +// PATH: store i32 4, i32* %{{.*}}, align 4, !tbaa !14
      +  A->f32 = 1;
      +  S->f32 = 4;
      +  return A->f32;
      +}
      +
      +uint32_t g8(StructA *A, StructS *S, uint64_t count) {
      +// CHECK: define i32 @{{.*}}(
      +// CHECK: store i32 1, i32* %{{.*}}, align 4, !tbaa !4
      +// CHECK: store i16 4, i16* %{{.*}}, align 2, !tbaa !5
      +// PATH: define i32 @{{.*}}(
      +// PATH: store i32 1, i32* %{{.*}}, align 4, !tbaa !5
      +// PATH: store i16 4, i16* %{{.*}}, align 2, !tbaa !16
      +  A->f32 = 1;
      +  S->f16 = 4;
      +  return A->f32;
      +}
      +
      +uint32_t g9(StructS *S, StructS2 *S2, uint64_t count) {
      +// CHECK: define i32 @{{.*}}(
      +// CHECK: store i32 1, i32* %{{.*}}, align 4, !tbaa !4
      +// CHECK: store i32 4, i32* %{{.*}}, align 4, !tbaa !4
      +// PATH: define i32 @{{.*}}(
      +// PATH: store i32 1, i32* %{{.*}}, align 4, !tbaa !14
      +// PATH: store i32 4, i32* %{{.*}}, align 4, !tbaa !17
      +  S->f32 = 1;
      +  S2->f32 = 4;
      +  return S->f32;
      +}
      +
      +uint32_t g10(StructS *S, StructS2 *S2, uint64_t count) {
      +// CHECK: define i32 @{{.*}}(
      +// CHECK: store i32 1, i32* %{{.*}}, align 4, !tbaa !4
      +// CHECK: store i16 4, i16* %{{.*}}, align 2, !tbaa !5
      +// PATH: define i32 @{{.*}}(
      +// PATH: store i32 1, i32* %{{.*}}, align 4, !tbaa !14
      +// PATH: store i16 4, i16* %{{.*}}, align 2, !tbaa !19
      +  S->f32 = 1;
      +  S2->f16 = 4;
      +  return S->f32;
      +}
      +
      +uint32_t g11(StructC *C, StructD *D, uint64_t count) {
      +// CHECK: define i32 @{{.*}}(
      +// CHECK: store i32 1, i32* %{{.*}}, align 4, !tbaa !4
      +// CHECK: store i32 4, i32* %{{.*}}, align 4, !tbaa !4
      +// PATH: define i32 @{{.*}}(
      +// PATH: store i32 1, i32* %{{.*}}, align 4, !tbaa !20
      +// PATH: store i32 4, i32* %{{.*}}, align 4, !tbaa !22
      +  C->b.a.f32 = 1;
      +  D->b.a.f32 = 4;
      +  return C->b.a.f32;
      +}
      +
      +uint32_t g12(StructC *C, StructD *D, uint64_t count) {
      +// CHECK: define i32 @{{.*}}(
      +// CHECK: store i32 1, i32* %{{.*}}, align 4, !tbaa !4
      +// CHECK: store i32 4, i32* %{{.*}}, align 4, !tbaa !4
      +// TODO: differentiate the two accesses.
      +// PATH: define i32 @{{.*}}(
      +// PATH: store i32 1, i32* %{{.*}}, align 4, !tbaa !9
      +// PATH: store i32 4, i32* %{{.*}}, align 4, !tbaa !9
      +  StructB *b1 = &(C->b);
      +  StructB *b2 = &(D->b);
      +  // b1, b2 have different context.
      +  b1->a.f32 = 1;
      +  b2->a.f32 = 4;
      +  return b1->a.f32;
      +}
      +
      +// CHECK: !1 = metadata !{metadata !"omnipotent char", metadata !2}
      +// CHECK: !2 = metadata !{metadata !"Simple C/C++ TBAA"}
      +// CHECK: !4 = metadata !{metadata !"int", metadata !1}
      +// CHECK: !5 = metadata !{metadata !"short", metadata !1}
      +
      +// PATH: !1 = metadata !{metadata !"omnipotent char", metadata !2}
      +// PATH: !4 = metadata !{metadata !"int", metadata !1}
      +// PATH: !5 = metadata !{metadata !6, metadata !4, i64 4}
      +// PATH: !6 = metadata !{metadata !"_ZTS7StructA", i64 0, metadata !7, i64 4, metadata !4}
      +// PATH: !7 = metadata !{metadata !"short", metadata !1}
      +// PATH: !8 = metadata !{metadata !6, metadata !7, i64 0}
      +// PATH: !9 = metadata !{metadata !10, metadata !4, i64 8}
      +// PATH: !10 = metadata !{metadata !"_ZTS7StructB", i64 0, metadata !7, i64 4, metadata !6, i64 20, metadata !4}
      +// PATH: !11 = metadata !{metadata !10, metadata !7, i64 4}
      +// PATH: !12 = metadata !{metadata !10, metadata !4, i64 20}
      +// PATH: !13 = metadata !{metadata !10, metadata !4, i64 16}
      +// PATH: !14 = metadata !{metadata !15, metadata !4, i64 4}
      +// PATH: !15 = metadata !{metadata !"_ZTS7StructS", i64 0, metadata !7, i64 4, metadata !4}
      +// PATH: !16 = metadata !{metadata !15, metadata !7, i64 0}
      +// PATH: !17 = metadata !{metadata !18, metadata !4, i64 4}
      +// PATH: !18 = metadata !{metadata !"_ZTS8StructS2", i64 0, metadata !7, i64 4, metadata !4}
      +// PATH: !19 = metadata !{metadata !18, metadata !7, i64 0}
      +// PATH: !20 = metadata !{metadata !21, metadata !4, i64 12}
      +// PATH: !21 = metadata !{metadata !"_ZTS7StructC", i64 0, metadata !7, i64 4, metadata !10, i64 28, metadata !4}
      +// PATH: !22 = metadata !{metadata !23, metadata !4, i64 12}
      +// PATH: !23 = metadata !{metadata !"_ZTS7StructD", i64 0, metadata !7, i64 4, metadata !10, i64 28, metadata !4, i64 32, metadata !1}
      
      llvm-svn: 178784
      037d2b25
    • Richard Osborne's avatar
      [XCore] Add bru instruction. · 0c12d185
      Richard Osborne authored
      llvm-svn: 178783
      0c12d185
    • Richard Osborne's avatar
      [XCore] The RRegs register class is a superset of GRRegs. · f18d95f7
      Richard Osborne authored
      At the time when the XCore backend was added there were some issues with
      with overlapping register classes but these all seem to be fixed now.
      Describing the register classes correctly allow us to get rid of a
      codegen only instruction (LDAWSP_lru6_RRegs) and it means we can
      disassemble ru6 instructions that use registers above r11.
      
      llvm-svn: 178782
      f18d95f7
    • Michael J. Spencer's avatar
      Fix MSVC build. · 3ab4db67
      Michael J. Spencer authored
      llvm-svn: 178781
      3ab4db67
    • Argyrios Kyrtzidis's avatar
      Remove the unused MemoryBuffers, no functionality change. · 3446ee03
      Argyrios Kyrtzidis authored
      llvm-svn: 178780
      3446ee03
    • Daniel Jasper's avatar
      Fix bug discovered with address sanitizer. · 6daabe37
      Daniel Jasper authored
      Now, this works again with an empty stack.
      
      llvm-svn: 178779
      6daabe37
    • Nick Kledzik's avatar
      fix darwin driver to validate command line options · be7b005d
      Nick Kledzik authored
      llvm-svn: 178778
      be7b005d
    • Nick Kledzik's avatar
      fix command line option to use -o · 9a632dbe
      Nick Kledzik authored
      llvm-svn: 178777
      9a632dbe
    • Nick Kledzik's avatar
      This is my Driver refactoring patch. · c314b46e
      Nick Kledzik authored
      The major changes are:
      1) LinkerOptions has been merged into TargetInfo
      2) LinkerInvocation has been merged into Driver
      3) Drivers no longer convert arguments into an intermediate (core) argument 
         list, but instead create a TargetInfo object and call setter methods on 
         it. This is only how in-process linking would work. That is, you can 
         programmatically set up a TargetInfo object which controls the linking.
      4) Lots of tweaks to test suite to work with driver changes
      5) Add the DarwinDriver
      6) I heavily doxygen commented TargetInfo.h
      
      Things to do after this patch is committed:
      a) Consider renaming TargetInfo, given its new roll. 
      b) Consider pulling the list of input files out of TargetInfo. This will 
         enable in-process clients to create one TargetInfo the re-use it with 
         different input file lists.
      c) Work out a way for Drivers to format the warnings and error done in 
         core linking.
      
      llvm-svn: 178776
      c314b46e
    • Fariborz Jahanian's avatar
      Objective-C: Issue deprecated warning when using a · 83f1be1b
      Fariborz Jahanian authored
      deprecated typedef to subclass or invoke a class method.
      // rdar://13569424
      
      llvm-svn: 178775
      83f1be1b
    • Eli Bendersky's avatar
      Missing word · 4ee93cd4
      Eli Bendersky authored
      llvm-svn: 178774
      4ee93cd4
    • Jakob Stoklund Olesen's avatar
      Avoid high-latency false CPSR dependencies even for tMOVSi. · 299475e0
      Jakob Stoklund Olesen authored
      The Thumb2SizeReduction pass avoids false CPSR dependencies, except it
      still aggressively creates tMOVi8 instructions because they are so
      common.
      
      Avoid creating false CPSR dependencies even for tMOVi8 instructions when
      the the CPSR flags are known to have high latency. This allows integer
      computation to overlap floating point computations.
      
      Also process blocks in a reverse post-order and propagate high-latency
      flags to successors.
      
      <rdar://problem/13468102>
      
      llvm-svn: 178773
      299475e0
    • Eli Bendersky's avatar
      Formatting · fc186358
      Eli Bendersky authored
      llvm-svn: 178771
      fc186358
    • Ted Kremenek's avatar
      Add test case to show that 'availability' and 'deprecated' do *not* inherit... · f5603128
      Ted Kremenek authored
      Add test case to show that 'availability' and 'deprecated' do *not* inherit when redeclaring ObjC properties.
      
      llvm-svn: 178770
      f5603128
    • Evan Cheng's avatar
      Revert r178713 · 2e254d04
      Evan Cheng authored
      llvm-svn: 178769
      2e254d04
    • Rafael Espindola's avatar
      Use isExternalLinkage instead of hasExternalLinkage. · 8f45ddf5
      Rafael Espindola authored
      Having these not be the same makes an easy to misuse API. We should audit the
      uses and probably rename to something like
      
      foo->hasExternalLinkage():
        The c++ standard one. That is UniqueExternalLinkage or ExternalLinkage.
      
      foo->hasUniqueExternalLinkage():
        Is UniqueExternalLinkage.
      
      foo->hasCogeGenExternalLinkage():
        Is ExternalLinkage.
      
      llvm-svn: 178768
      8f45ddf5
    • Benjamin Kramer's avatar
      Make helpers static & 80 cols. · 08db461c
      Benjamin Kramer authored
      llvm-svn: 178767
      08db461c
    • Rafael Espindola's avatar
      Fix a recent linkage regression. · 2b0b13bc
      Rafael Espindola authored
      Now that we don't have a semantic storage class, use the linkage.
      
      Thanks to Bruce Stephens for reporting this.
      
      llvm-svn: 178766
      2b0b13bc
Loading