Skip to content
  1. Apr 04, 2013
    • 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
    • Stepan Dyatkovskiy's avatar
      New-password-test commit. · e58df62e
      Stepan Dyatkovskiy authored
      llvm-svn: 178765
      e58df62e
    • Howard Hinnant's avatar
      Somehow search_n never got tested, so of course it had a bug in it. This... · b13fcad6
      Howard Hinnant authored
      Somehow search_n never got tested, so of course it had a bug in it.  This fixes http://llvm.org/bugs/show_bug.cgi?id=15667.
      
      llvm-svn: 178764
      b13fcad6
    • Vincent Lejeune's avatar
      R600: Use a mask for offsets when encoding instructions · bcbb13d6
      Vincent Lejeune authored
      llvm-svn: 178763
      bcbb13d6
    • Vincent Lejeune's avatar
      R600: Fix wrong address when substituting ENDIF · 8e377fdb
      Vincent Lejeune authored
      llvm-svn: 178762
      8e377fdb
    • Vincent Lejeune's avatar
      R600: Take export into account when computing cf address · c44fa997
      Vincent Lejeune authored
      llvm-svn: 178761
      c44fa997
    • Alexey Samsonov's avatar
      [TSan] Make path to FileCheck configurable · 70a9c263
      Alexey Samsonov authored
      llvm-svn: 178760
      70a9c263
    • Kostya Serebryany's avatar
      [asan] nuke the old unused allocator code · eef8bd43
      Kostya Serebryany authored
      llvm-svn: 178758
      eef8bd43
    • Kostya Serebryany's avatar
      [asan] fill first 4K of malloc-ed memory with garbage, implement flags... · 13b07733
      Kostya Serebryany authored
      [asan] fill first 4K of malloc-ed memory with garbage, implement flags max_malloc_fill_size and malloc_fill_byte
      
      llvm-svn: 178757
      13b07733
    • Evgeniy Stepanov's avatar
      [sanitizer] Android lacks ucontext_t definition. · 24b2169e
      Evgeniy Stepanov authored
      llvm-svn: 178756
      24b2169e
    • Evgeniy Stepanov's avatar
      [sanitizer] Use ucontext_t instead of "struct ucontext". · 7b0e1325
      Evgeniy Stepanov authored
      Fixes Mac build.
      
      llvm-svn: 178755
      7b0e1325
    • Evgeniy Stepanov's avatar
      [msan] Unpoison siginfo_t and ucontext_t in signal handlers. · 1f8b3538
      Evgeniy Stepanov authored
      Add wrappers for all user signal handlers to unpoison the handler's arguments.
      
      llvm-svn: 178754
      1f8b3538
    • Alexey Samsonov's avatar
    • Alexey Samsonov's avatar
    • Kostya Serebryany's avatar
    • Eric Christopher's avatar
      Plumb through the -fsplit-stack option using the existing backend · 006208cf
      Eric Christopher authored
      support.
      
      Caveat: Other than the existing segmented stacks support, no
      claims are made of this working.
      
      llvm-svn: 178744
      006208cf
Loading