From a3b5b60753667f11977476f2b8b278f3912d7076 Mon Sep 17 00:00:00 2001 From: Rafael Espindola Date: Mon, 17 Nov 2014 02:28:27 +0000 Subject: [PATCH] Add back r222061 with a fix. This adds back r222061, but now calls initializePAEvalPass from the correct library to avoid link problems. Original message: Don't make assumptions about the name of private global variables. Private variables are can be renamed, so it is not reliable to make decisions on the name. The name is also dropped by the assembler before getting to the linker, so using the name causes a disconnect between how llvm makes a decision (var name) and how the linker makes a decision (section it is in). This patch changes one case where we were looking at the variable name to use the section instead. Test tuning by Michael Gottesman. llvm-svn: 222117 --- llvm/include/llvm/Analysis/Passes.h | 2 + llvm/include/llvm/InitializePasses.h | 1 + llvm/include/llvm/LinkAllPasses.h | 1 + llvm/lib/Transforms/ObjCARC/CMakeLists.txt | 1 + llvm/lib/Transforms/ObjCARC/ObjCARC.cpp | 1 + llvm/lib/Transforms/ObjCARC/ObjCARC.h | 14 ++-- .../ObjCARC/ProvenanceAnalysisEvaluator.cpp | 92 ++++++++++++++++++++++ llvm/test/Transforms/ObjCARC/provenance.ll | 52 ++++++++++++ 8 files changed, 159 insertions(+), 5 deletions(-) create mode 100644 llvm/lib/Transforms/ObjCARC/ProvenanceAnalysisEvaluator.cpp create mode 100644 llvm/test/Transforms/ObjCARC/provenance.ll diff --git a/llvm/include/llvm/Analysis/Passes.h b/llvm/include/llvm/Analysis/Passes.h index 98f38e7..10a5605 100644 --- a/llvm/include/llvm/Analysis/Passes.h +++ b/llvm/include/llvm/Analysis/Passes.h @@ -107,6 +107,8 @@ namespace llvm { // ImmutablePass *createObjCARCAliasAnalysisPass(); + FunctionPass *createPAEvalPass(); + //===--------------------------------------------------------------------===// // /// createLazyValueInfoPass - This creates an instance of the LazyValueInfo diff --git a/llvm/include/llvm/InitializePasses.h b/llvm/include/llvm/InitializePasses.h index 2489882..a4bc598 100644 --- a/llvm/include/llvm/InitializePasses.h +++ b/llvm/include/llvm/InitializePasses.h @@ -211,6 +211,7 @@ void initializeObjCARCAPElimPass(PassRegistry&); void initializeObjCARCExpandPass(PassRegistry&); void initializeObjCARCContractPass(PassRegistry&); void initializeObjCARCOptPass(PassRegistry&); +void initializePAEvalPass(PassRegistry &); void initializeOptimizePHIsPass(PassRegistry&); void initializePartiallyInlineLibCallsPass(PassRegistry&); void initializePEIPass(PassRegistry&); diff --git a/llvm/include/llvm/LinkAllPasses.h b/llvm/include/llvm/LinkAllPasses.h index ef354f9..66e4e9c 100644 --- a/llvm/include/llvm/LinkAllPasses.h +++ b/llvm/include/llvm/LinkAllPasses.h @@ -111,6 +111,7 @@ namespace { (void) llvm::createObjCARCExpandPass(); (void) llvm::createObjCARCContractPass(); (void) llvm::createObjCARCOptPass(); + (void) llvm::createPAEvalPass(); (void) llvm::createPromoteMemoryToRegisterPass(); (void) llvm::createDemoteRegisterToMemoryPass(); (void) llvm::createPruneEHPass(); diff --git a/llvm/lib/Transforms/ObjCARC/CMakeLists.txt b/llvm/lib/Transforms/ObjCARC/CMakeLists.txt index 233deb3..b449fac 100644 --- a/llvm/lib/Transforms/ObjCARC/CMakeLists.txt +++ b/llvm/lib/Transforms/ObjCARC/CMakeLists.txt @@ -8,6 +8,7 @@ add_llvm_library(LLVMObjCARCOpts ObjCARCContract.cpp DependencyAnalysis.cpp ProvenanceAnalysis.cpp + ProvenanceAnalysisEvaluator.cpp ) add_dependencies(LLVMObjCARCOpts intrinsics_gen) diff --git a/llvm/lib/Transforms/ObjCARC/ObjCARC.cpp b/llvm/lib/Transforms/ObjCARC/ObjCARC.cpp index 373168e..6ea038b 100644 --- a/llvm/lib/Transforms/ObjCARC/ObjCARC.cpp +++ b/llvm/lib/Transforms/ObjCARC/ObjCARC.cpp @@ -42,6 +42,7 @@ void llvm::initializeObjCARCOpts(PassRegistry &Registry) { initializeObjCARCExpandPass(Registry); initializeObjCARCContractPass(Registry); initializeObjCARCOptPass(Registry); + initializePAEvalPass(Registry); } void LLVMInitializeObjCARCOpts(LLVMPassRegistryRef R) { diff --git a/llvm/lib/Transforms/ObjCARC/ObjCARC.h b/llvm/lib/Transforms/ObjCARC/ObjCARC.h index 9dddd65..7a7eae8 100644 --- a/llvm/lib/Transforms/ObjCARC/ObjCARC.h +++ b/llvm/lib/Transforms/ObjCARC/ObjCARC.h @@ -380,11 +380,15 @@ static inline bool IsObjCIdentifiedObject(const Value *V) { StringRef Name = GV->getName(); // These special variables are known to hold values which are not // reference-counted pointers. - if (Name.startswith("\01L_OBJC_SELECTOR_REFERENCES_") || - Name.startswith("\01L_OBJC_CLASSLIST_REFERENCES_") || - Name.startswith("\01L_OBJC_CLASSLIST_SUP_REFS_$_") || - Name.startswith("\01L_OBJC_METH_VAR_NAME_") || - Name.startswith("\01l_objc_msgSend_fixup_")) + if (Name.startswith("\01l_objc_msgSend_fixup_")) + return true; + + StringRef Section = GV->getSection(); + if (Section.find("__message_refs") != StringRef::npos || + Section.find("__objc_classrefs") != StringRef::npos || + Section.find("__objc_superrefs") != StringRef::npos || + Section.find("__objc_methname") != StringRef::npos || + Section.find("__cstring") != StringRef::npos) return true; } } diff --git a/llvm/lib/Transforms/ObjCARC/ProvenanceAnalysisEvaluator.cpp b/llvm/lib/Transforms/ObjCARC/ProvenanceAnalysisEvaluator.cpp new file mode 100644 index 0000000..d836632 --- /dev/null +++ b/llvm/lib/Transforms/ObjCARC/ProvenanceAnalysisEvaluator.cpp @@ -0,0 +1,92 @@ +//===- ProvenanceAnalysisEvaluator.cpp - ObjC ARC Optimization ------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#include "ProvenanceAnalysis.h" +#include "llvm/Pass.h" +#include "llvm/ADT/SetVector.h" +#include "llvm/Analysis/AliasAnalysis.h" +#include "llvm/Analysis/Passes.h" +#include "llvm/IR/InstIterator.h" +#include "llvm/IR/Function.h" +#include "llvm/Support/raw_ostream.h" + +using namespace llvm; +using namespace llvm::objcarc; + +namespace { +class PAEval : public FunctionPass { + +public: + static char ID; + PAEval(); + void getAnalysisUsage(AnalysisUsage &AU) const override; + bool runOnFunction(Function &F) override; +}; +} + +char PAEval::ID = 0; +PAEval::PAEval() : FunctionPass(ID) {} + +void PAEval::getAnalysisUsage(AnalysisUsage &AU) const { + AU.addRequired(); +} + +static StringRef getName(Value *V) { + StringRef Name = V->getName(); + if (Name.startswith("\1")) + return Name.substr(1); + return Name; +} + +static void insertIfNamed(SetVector &Values, Value *V) { + if (!V->hasName()) + return; + Values.insert(V); +} + +bool PAEval::runOnFunction(Function &F) { + SetVector Values; + + for (auto &Arg : F.args()) + insertIfNamed(Values, &Arg); + + for (auto I = inst_begin(F), E = inst_end(F); I != E; ++I) { + insertIfNamed(Values, &*I); + + for (auto &Op : I->operands()) + insertIfNamed(Values, Op); + } + + ProvenanceAnalysis PA; + PA.setAA(&getAnalysis()); + + for (Value *V1 : Values) { + StringRef NameV1 = getName(V1); + for (Value *V2 : Values) { + StringRef NameV2 = getName(V2); + if (NameV1 >= NameV2) + continue; + errs() << NameV1 << " and " << NameV2; + if (PA.related(V1, V2)) + errs() << " are related.\n"; + else + errs() << " are not related.\n"; + } + } + + return false; +} + +FunctionPass *llvm::createPAEvalPass() { return new PAEval(); } + +INITIALIZE_PASS_BEGIN(PAEval, "pa-eval", + "Evaluate ProvenanceAnalysis on all pairs", false, true) +INITIALIZE_AG_DEPENDENCY(AliasAnalysis) +INITIALIZE_PASS_END(PAEval, "pa-eval", + "Evaluate ProvenanceAnalysis on all pairs", false, true) diff --git a/llvm/test/Transforms/ObjCARC/provenance.ll b/llvm/test/Transforms/ObjCARC/provenance.ll new file mode 100644 index 0000000..937c6892 --- /dev/null +++ b/llvm/test/Transforms/ObjCARC/provenance.ll @@ -0,0 +1,52 @@ +; RUN: opt -disable-output -pa-eval %s 2>&1 | FileCheck %s + +@"\01l_objc_msgSend_fixup_" = global i8 0 +@g1 = global i8 0, section "__OBJC,__message_refs,literal_pointers,no_dead_strip" +@g2 = global i8 0, section "__DATA, __objc_classrefs, regular, no_dead_strip" +@g3 = global i8 0, section "__DATA, __objc_superrefs, regular, no_dead_strip" +@g4 = global i8 0, section "__TEXT,__objc_methname,cstring_literals" +@g5 = global i8 0, section "__TEXT,__cstring,cstring_literals" + +declare void @g(i8) + +define void @f(i8* %a, i8** %b, i8** %c) { + %y1 = load i8* %a + call void @g(i8 %y1) + + %y2 = load i8** %b + %y3 = load i8** %c + + %x0 = load i8* @"\01l_objc_msgSend_fixup_" + call void @g(i8 %x0) + + %x1 = load i8* @g1 + call void @g(i8 %x1) + + %x2 = load i8* @g2 + call void @g(i8 %x2) + + %x3 = load i8* @g3 + call void @g(i8 %x3) + + %x4 = load i8* @g4 + call void @g(i8 %x4) + + %x5 = load i8* @g5 + call void @g(i8 %x5) + ret void +} + +; CHECK: y1 and y2 are related. +; CHECK: y1 and y3 are related. +; CHECK: y2 and y3 are related. +; CHECK: x0 and y1 are not related. +; CHECK: x0 and y2 are not related. +; CHECK: x0 and y3 are not related. +; CHECK: l_objc_msgSend_fixup_ and y1 are not related. +; CHECK: l_objc_msgSend_fixup_ and y2 are not related. +; CHECK: l_objc_msgSend_fixup_ and y3 are not related. +; CHECK: x1 and y1 are not related. +; CHECK: x2 and y1 are not related. +; CHECK: x3 and y1 are not related. +; CHECK: x4 and y1 are not related. +; CHECK: x5 and y1 are not related. -- 2.7.4