Hi Andrey, This commit does not seem to match the description. What is it doing?
Thanks again, Hal ----- Original Message ----- > From: "Andrey Bokhanko via cfe-commits" <cfe-commits@lists.llvm.org> > To: cfe-commits@lists.llvm.org > Sent: Friday, November 27, 2015 6:18:23 AM > Subject: r254195 - [x86] Exclusion of incorrect include headers paths for MCU > target > > Author: asbokhan > Date: Fri Nov 27 06:18:22 2015 > New Revision: 254195 > > URL: http://llvm.org/viewvc/llvm-project?rev=254195&view=rev > Log: > [x86] Exclusion of incorrect include headers paths for MCU target > > Exclusion of /usr/include and /usr/local/include headers paths for > MCU target. > > Differential Revision: http://reviews.llvm.org/D14954 > > Modified: > cfe/trunk/lib/CodeGen/CodeGenModule.cpp > cfe/trunk/lib/CodeGen/CodeGenModule.h > > Modified: cfe/trunk/lib/CodeGen/CodeGenModule.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CodeGenModule.cpp?rev=254195&r1=254194&r2=254195&view=diff > ============================================================================== > --- cfe/trunk/lib/CodeGen/CodeGenModule.cpp (original) > +++ cfe/trunk/lib/CodeGen/CodeGenModule.cpp Fri Nov 27 06:18:22 2015 > @@ -1178,12 +1178,7 @@ void CodeGenModule::EmitDeferred() { > // to get GlobalValue with exactly the type we need, not > something that > // might had been created for another decl with the same mangled > name but > // different type. > - // FIXME: Support for variables is not implemented yet. > - if (isa<FunctionDecl>(D.getDecl())) > - GV = cast<llvm::GlobalValue>(GetAddrOfGlobal(D, > /*IsForDefinition=*/true)); > - else > - if (!GV) > - GV = GetGlobalValue(getMangledName(D)); > + GV = cast<llvm::GlobalValue>(GetAddrOfGlobal(D, > /*IsForDefinition=*/true)); > > // Check to see if we've already emitted this. This is > necessary > // for a couple of reasons: first, decls can end up in the > @@ -1693,8 +1688,8 @@ CodeGenModule::GetOrCreateLLVMFunction(S > // error. > if (IsForDefinition && !Entry->isDeclaration()) { > GlobalDecl OtherGD; > - // Check that GD is not yet in ExplicitDefinitions is required > to make > - // sure that we issue an error only once. > + // Check that GD is not yet in DiagnosedConflictingDefinitions > is required > + // to make sure that we issue an error only once. > if (lookupRepresentativeDecl(MangledName, OtherGD) && > (GD.getCanonicalDecl().getDecl() != > OtherGD.getCanonicalDecl().getDecl()) && > @@ -1904,7 +1899,8 @@ bool CodeGenModule::isTypeConstant(QualT > llvm::Constant * > CodeGenModule::GetOrCreateLLVMGlobal(StringRef MangledName, > llvm::PointerType *Ty, > - const VarDecl *D) { > + const VarDecl *D, > + bool IsForDefinition) { > // Lookup the entry, lazily creating it if necessary. > llvm::GlobalValue *Entry = GetGlobalValue(MangledName); > if (Entry) { > @@ -1920,11 +1916,31 @@ CodeGenModule::GetOrCreateLLVMGlobal(Str > if (Entry->getType() == Ty) > return Entry; > > + // If there are two attempts to define the same mangled name, > issue an > + // error. > + if (IsForDefinition && !Entry->isDeclaration()) { > + GlobalDecl OtherGD; > + // Check that D is not yet in DiagnosedConflictingDefinitions > is required > + // to make sure that we issue an error only once. > + if (lookupRepresentativeDecl(MangledName, OtherGD) && > + (D->getCanonicalDecl() != > OtherGD.getCanonicalDecl().getDecl()) && > + DiagnosedConflictingDefinitions.insert(D).second) { > + getDiags().Report(D->getLocation(), > + diag::err_duplicate_mangled_name); > + getDiags().Report(OtherGD.getDecl()->getLocation(), > + diag::note_previous_definition); > + } > + } > + > // Make sure the result is of the correct type. > if (Entry->getType()->getAddressSpace() != > Ty->getAddressSpace()) > return llvm::ConstantExpr::getAddrSpaceCast(Entry, Ty); > > - return llvm::ConstantExpr::getBitCast(Entry, Ty); > + // Make sure the result is of the correct type. > + // (If global is requested for a definition, we always need to > create a new > + // global, not just return a bitcast.) > + if (!IsForDefinition) > + return llvm::ConstantExpr::getBitCast(Entry, Ty); > } > > unsigned AddrSpace = GetGlobalVarAddressSpace(D, > Ty->getAddressSpace()); > @@ -1933,6 +1949,20 @@ CodeGenModule::GetOrCreateLLVMGlobal(Str > llvm::GlobalValue::ExternalLinkage, nullptr, MangledName, > nullptr, > llvm::GlobalVariable::NotThreadLocal, AddrSpace); > > + // If we already created a global with the same mangled name (but > different > + // type) before, take its name and remove it from its parent. > + if (Entry) { > + GV->takeName(Entry); > + > + if (!Entry->use_empty()) { > + llvm::Constant *NewPtrForOldDecl = > + llvm::ConstantExpr::getBitCast(GV, Entry->getType()); > + Entry->replaceAllUsesWith(NewPtrForOldDecl); > + } > + > + Entry->eraseFromParent(); > + } > + > // This is the first use or definition of a mangled name. If > there is a > // deferred decl with this name, remember that we need to emit it > at the end > // of the file. > @@ -2005,7 +2035,8 @@ CodeGenModule::GetAddrOfGlobal(GlobalDec > return GetAddrOfFunction(GD, Ty, /*ForVTable=*/false, > /*DontDefer=*/false, > IsForDefinition); > } else > - return GetAddrOfGlobalVar(cast<VarDecl>(GD.getDecl())); > + return GetAddrOfGlobalVar(cast<VarDecl>(GD.getDecl()), > /*Ty=*/nullptr, > + IsForDefinition); > } > > llvm::GlobalVariable * > @@ -2055,7 +2086,8 @@ CodeGenModule::CreateOrReplaceCXXRuntime > /// then it will be created with the specified type instead of > whatever the > /// normal requested type would be. > llvm::Constant *CodeGenModule::GetAddrOfGlobalVar(const VarDecl *D, > - llvm::Type *Ty) { > + llvm::Type *Ty, > + bool > IsForDefinition) { > assert(D->hasGlobalStorage() && "Not a global variable"); > QualType ASTTy = D->getType(); > if (!Ty) > @@ -2065,7 +2097,7 @@ llvm::Constant *CodeGenModule::GetAddrOf > llvm::PointerType::get(Ty, > getContext().getTargetAddressSpace(ASTTy)); > > StringRef MangledName = getMangledName(D); > - return GetOrCreateLLVMGlobal(MangledName, PTy, D); > + return GetOrCreateLLVMGlobal(MangledName, PTy, D, > IsForDefinition); > } > > /// CreateRuntimeVariable - Create a new runtime global variable > with the > @@ -2091,7 +2123,7 @@ void CodeGenModule::EmitTentativeDefinit > } > > // The tentative definition is the only definition. > - EmitGlobalVarDefinition(D); > + EmitGlobalVarDefinition(D, true); > } > > CharUnits CodeGenModule::GetTargetTypeStoreSize(llvm::Type *Ty) > const { > @@ -2178,7 +2210,8 @@ void CodeGenModule::maybeSetTrivialComda > GO.setComdat(TheModule.getOrInsertComdat(GO.getName())); > } > > -void CodeGenModule::EmitGlobalVarDefinition(const VarDecl *D) { > +void CodeGenModule::EmitGlobalVarDefinition(const VarDecl *D, > + bool IsTentative) { > llvm::Constant *Init = nullptr; > QualType ASTTy = D->getType(); > CXXRecordDecl *RD = > ASTTy->getBaseElementTypeUnsafe()->getAsCXXRecordDecl(); > @@ -2237,7 +2270,8 @@ void CodeGenModule::EmitGlobalVarDefinit > } > > llvm::Type* InitType = Init->getType(); > - llvm::Constant *Entry = GetAddrOfGlobalVar(D, InitType); > + llvm::Constant *Entry = > + GetAddrOfGlobalVar(D, InitType, > /*IsForDefinition=*/!IsTentative); > > // Strip off a bitcast if we got one back. > if (auto *CE = dyn_cast<llvm::ConstantExpr>(Entry)) { > @@ -2269,7 +2303,8 @@ void CodeGenModule::EmitGlobalVarDefinit > Entry->setName(StringRef()); > > // Make a new global with the correct type, this is now > guaranteed to work. > - GV = cast<llvm::GlobalVariable>(GetAddrOfGlobalVar(D, > InitType)); > + GV = cast<llvm::GlobalVariable>( > + GetAddrOfGlobalVar(D, InitType, > /*IsForDefinition=*/!IsTentative)); > > // Replace all uses of the old global with the new global > llvm::Constant *NewPtrForOldDecl = > > Modified: cfe/trunk/lib/CodeGen/CodeGenModule.h > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CodeGenModule.h?rev=254195&r1=254194&r2=254195&view=diff > ============================================================================== > --- cfe/trunk/lib/CodeGen/CodeGenModule.h (original) > +++ cfe/trunk/lib/CodeGen/CodeGenModule.h Fri Nov 27 06:18:22 2015 > @@ -701,7 +701,8 @@ public: > /// with the specified type instead of whatever the normal > requested type > /// would be. > llvm::Constant *GetAddrOfGlobalVar(const VarDecl *D, > - llvm::Type *Ty = nullptr); > + llvm::Type *Ty = nullptr, > + bool IsForDefinition = false); > > /// Return the address of the given function. If Ty is non-null, > then this > /// function will use the specified type if it has to create it. > @@ -1130,7 +1131,8 @@ private: > > llvm::Constant *GetOrCreateLLVMGlobal(StringRef MangledName, > llvm::PointerType *PTy, > - const VarDecl *D); > + const VarDecl *D, > + bool IsForDefinition = > false); > > void setNonAliasAttributes(const Decl *D, llvm::GlobalObject *GO); > > @@ -1141,7 +1143,7 @@ private: > void EmitGlobalDefinition(GlobalDecl D, llvm::GlobalValue *GV = > nullptr); > > void EmitGlobalFunctionDefinition(GlobalDecl GD, llvm::GlobalValue > *GV); > - void EmitGlobalVarDefinition(const VarDecl *D); > + void EmitGlobalVarDefinition(const VarDecl *D, bool IsTentative = > false); > void EmitAliasDefinition(GlobalDecl GD); > void EmitObjCPropertyImplementations(const ObjCImplementationDecl > *D); > void EmitObjCIvarInitializations(ObjCImplementationDecl *D); > > > _______________________________________________ > cfe-commits mailing list > cfe-commits@lists.llvm.org > http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits > -- Hal Finkel Assistant Computational Scientist Leadership Computing Facility Argonne National Laboratory _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits