[llvm] r266132 - Add a pass to name anonymous/nameless function
Sean Silva via llvm-commits
llvm-commits at lists.llvm.org
Tue May 24 20:21:33 PDT 2016
On Tue, Apr 12, 2016 at 2:35 PM, Mehdi Amini via llvm-commits <
llvm-commits at lists.llvm.org> wrote:
> Author: mehdi_amini
> Date: Tue Apr 12 16:35:28 2016
> New Revision: 266132
>
> URL: http://llvm.org/viewvc/llvm-project?rev=266132&view=rev
> Log:
> Add a pass to name anonymous/nameless function
>
> Summary:
> For correct handling of alias to nameless
> function, we need to be able to refer them through a GUID in the summary.
> Here we name them using a hash of the non-private global names in the
> module.
>
> Reviewers: tejohnson
>
> Subscribers: joker.eph, llvm-commits
>
> Differential Revision: http://reviews.llvm.org/D18883
>
> From: Mehdi Amini <mehdi.amini at apple.com>
>
> Added:
> llvm/trunk/lib/Transforms/Utils/NameAnonFunctions.cpp
> llvm/trunk/test/Transforms/NameAnonFunctions/
> llvm/trunk/test/Transforms/NameAnonFunctions/rename.ll
> Modified:
> llvm/trunk/include/llvm/InitializePasses.h
> llvm/trunk/include/llvm/Transforms/Scalar.h
> llvm/trunk/include/llvm/Transforms/Utils/ModuleUtils.h
> llvm/trunk/lib/Transforms/IPO/PassManagerBuilder.cpp
> llvm/trunk/lib/Transforms/Utils/CMakeLists.txt
> llvm/trunk/lib/Transforms/Utils/Utils.cpp
>
> Modified: llvm/trunk/include/llvm/InitializePasses.h
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/InitializePasses.h?rev=266132&r1=266131&r2=266132&view=diff
>
> ==============================================================================
> --- llvm/trunk/include/llvm/InitializePasses.h (original)
> +++ llvm/trunk/include/llvm/InitializePasses.h Tue Apr 12 16:35:28 2016
> @@ -221,6 +221,7 @@ void initializeMergedLoadStoreMotionPass
> void initializeMetaRenamerPass(PassRegistry&);
> void initializeMergeFunctionsPass(PassRegistry&);
> void initializeModuleDebugInfoPrinterPass(PassRegistry&);
> +void initializeNameAnonFunctionPass(PassRegistry &);
> void initializeNaryReassociatePass(PassRegistry&);
> void initializeNoAAPass(PassRegistry&);
> void initializeObjCARCAAWrapperPassPass(PassRegistry&);
>
> Modified: llvm/trunk/include/llvm/Transforms/Scalar.h
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Transforms/Scalar.h?rev=266132&r1=266131&r2=266132&view=diff
>
> ==============================================================================
> --- llvm/trunk/include/llvm/Transforms/Scalar.h (original)
> +++ llvm/trunk/include/llvm/Transforms/Scalar.h Tue Apr 12 16:35:28 2016
> @@ -503,6 +503,9 @@ FunctionPass *createLoopVersioningPass()
> //
> FunctionPass *createLoopDataPrefetchPass();
>
>
> +///===---------------------------------------------------------------------===//
> +ModulePass *createNameAnonFunctionPass();
> +
> } // End llvm namespace
>
> #endif
>
> Modified: llvm/trunk/include/llvm/Transforms/Utils/ModuleUtils.h
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Transforms/Utils/ModuleUtils.h?rev=266132&r1=266131&r2=266132&view=diff
>
> ==============================================================================
> --- llvm/trunk/include/llvm/Transforms/Utils/ModuleUtils.h (original)
> +++ llvm/trunk/include/llvm/Transforms/Utils/ModuleUtils.h Tue Apr 12
> 16:35:28 2016
> @@ -61,6 +61,11 @@ std::pair<Function *, Function *> create
> Module &M, StringRef CtorName, StringRef InitName,
> ArrayRef<Type *> InitArgTypes, ArrayRef<Value *> InitArgs,
> StringRef VersionCheckName = StringRef());
> +
> +/// Rename all the anon functions in the module using a hash computed from
> +/// the list of public globals in the module.
> +bool nameUnamedFunctions(Module &M);
> +
> } // End llvm namespace
>
> #endif // LLVM_TRANSFORMS_UTILS_MODULEUTILS_H
>
> Modified: llvm/trunk/lib/Transforms/IPO/PassManagerBuilder.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/IPO/PassManagerBuilder.cpp?rev=266132&r1=266131&r2=266132&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/Transforms/IPO/PassManagerBuilder.cpp (original)
> +++ llvm/trunk/lib/Transforms/IPO/PassManagerBuilder.cpp Tue Apr 12
> 16:35:28 2016
> @@ -247,6 +247,8 @@ void PassManagerBuilder::addFunctionSimp
> if (PrepareForThinLTO) {
> MPM.add(createAggressiveDCEPass()); // Delete dead instructions
> addInstructionCombiningPass(MPM); // Combine silly seq's
> + // Rename anon function to export them
> + MPM.add(createNameAnonFunctionPass());
> return;
> }
> // Rotate Loop - disable header duplication at -Oz
>
> Modified: llvm/trunk/lib/Transforms/Utils/CMakeLists.txt
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Utils/CMakeLists.txt?rev=266132&r1=266131&r2=266132&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/Transforms/Utils/CMakeLists.txt (original)
> +++ llvm/trunk/lib/Transforms/Utils/CMakeLists.txt Tue Apr 12 16:35:28 2016
> @@ -31,6 +31,7 @@ add_llvm_library(LLVMTransformUtils
> MemorySSA.cpp
> MetaRenamer.cpp
> ModuleUtils.cpp
> + NameAnonFunctions.cpp
> PromoteMemoryToRegister.cpp
> SSAUpdater.cpp
> SanitizerStats.cpp
>
> Added: llvm/trunk/lib/Transforms/Utils/NameAnonFunctions.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Utils/NameAnonFunctions.cpp?rev=266132&view=auto
>
> ==============================================================================
> --- llvm/trunk/lib/Transforms/Utils/NameAnonFunctions.cpp (added)
> +++ llvm/trunk/lib/Transforms/Utils/NameAnonFunctions.cpp Tue Apr 12
> 16:35:28 2016
> @@ -0,0 +1,102 @@
> +//===- NameAnonFunctions.cpp - ThinLTO Summary-based Function Import
> ------===//
> +//
> +// The LLVM Compiler Infrastructure
> +//
> +// This file is distributed under the University of Illinois Open Source
> +// License. See LICENSE.TXT for details.
> +//
>
> +//===----------------------------------------------------------------------===//
> +//
> +// This file implements naming anonymous function to make sure they can be
> +// refered to by ThinLTO.
> +//
>
> +//===----------------------------------------------------------------------===//
> +
> +#include "llvm/ADT/SmallString.h"
> +#include "llvm/IR/Module.h"
> +#include "llvm/Support/MD5.h"
> +#include "llvm/Transforms/Utils/ModuleUtils.h"
> +
> +using namespace llvm;
> +
> +// Compute a "unique" hash for the module based on the name of the public
> +// functions.
> +class ModuleHasher {
> + Module &TheModule;
> + std::string TheHash;
> +
> +public:
> + ModuleHasher(Module &M) : TheModule(M) {}
> +
> + /// Return the lazily computed hash.
> + std::string &get() {
> + if (!TheHash.empty())
> + // Cache hit :)
> + return TheHash;
> +
> + MD5 Hasher;
> + for (auto &F : TheModule) {
> + if (F.isDeclaration() || F.hasLocalLinkage() || !F.hasName())
> + continue;
> + auto Name = F.getName();
> + Hasher.update(Name);
> + }
> + for (auto &GV : TheModule.globals()) {
> + if (GV.isDeclaration() || GV.hasLocalLinkage() || !GV.hasName())
> + continue;
> + auto Name = GV.getName();
> + Hasher.update(Name);
> + }
> +
> + // Now return the result.
> + MD5::MD5Result Hash;
> + Hasher.final(Hash);
> + SmallString<32> Result;
> + MD5::stringifyResult(Hash, Result);
> + TheHash = Result.str();
> + return TheHash;
> + }
> +};
> +
> +// Rename all the anon functions in the module
> +bool llvm::nameUnamedFunctions(Module &M) {
> + bool Changed = false;
> + ModuleHasher ModuleHash(M);
> + int count = 0;
>
s/count/Count/
-- Sean Silva
> + for (auto &F : M) {
> + if (F.hasName())
> + continue;
> + F.setName(Twine("anon.") + ModuleHash.get() + "." + Twine(count++));
> + Changed = true;
> + }
> + return Changed;
> +}
> +
> +namespace {
> +
> +// Simple pass that provides a name to every anon function.
> +class NameAnonFunction : public ModulePass {
> +
> +public:
> + /// Pass identification, replacement for typeid
> + static char ID;
> +
> + /// Specify pass name for debug output
> + const char *getPassName() const override { return "Name Anon
> Functions"; }
> +
> + explicit NameAnonFunction() : ModulePass(ID) {}
> +
> + bool runOnModule(Module &M) override { return nameUnamedFunctions(M); }
> +};
> +char NameAnonFunction::ID = 0;
> +
> +} // anonymous namespace
> +
> +INITIALIZE_PASS_BEGIN(NameAnonFunction, "name-anon-functions",
> + "Provide a name to nameless functions", false,
> false)
> +INITIALIZE_PASS_END(NameAnonFunction, "name-anon-functions",
> + "Provide a name to nameless functions", false, false)
> +
> +namespace llvm {
> +Pass *createNameAnonFunctionPass() { return new NameAnonFunction(); }
> +}
>
> Modified: llvm/trunk/lib/Transforms/Utils/Utils.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Utils/Utils.cpp?rev=266132&r1=266131&r2=266132&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/Transforms/Utils/Utils.cpp (original)
> +++ llvm/trunk/lib/Transforms/Utils/Utils.cpp Tue Apr 12 16:35:28 2016
> @@ -28,6 +28,7 @@ void llvm::initializeTransformUtils(Pass
> initializeLoopSimplifyPass(Registry);
> initializeLowerInvokePass(Registry);
> initializeLowerSwitchPass(Registry);
> + initializeNameAnonFunctionPass(Registry);
> initializePromotePassPass(Registry);
> initializeUnifyFunctionExitNodesPass(Registry);
> initializeInstSimplifierPass(Registry);
>
> Added: llvm/trunk/test/Transforms/NameAnonFunctions/rename.ll
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/NameAnonFunctions/rename.ll?rev=266132&view=auto
>
> ==============================================================================
> --- llvm/trunk/test/Transforms/NameAnonFunctions/rename.ll (added)
> +++ llvm/trunk/test/Transforms/NameAnonFunctions/rename.ll Tue Apr 12
> 16:35:28 2016
> @@ -0,0 +1,27 @@
> +; RUN: opt -S -name-anon-functions < %s | FileCheck %s
> +
> +
> +; foo contribute to the unique hash for the module
> +define void @foo() {
> + ret void
> +}
> +
> +; bar is internal, and does not contribute to the unique hash for the
> module
> +define internal void @bar() {
> + ret void
> +}
> +
> +; CHECK: define void @anon.acbd18db4cc2f85cedef654fccc4a4d8.0()
> +; CHECK: define void @anon.acbd18db4cc2f85cedef654fccc4a4d8.1()
> +; CHECK: define void @anon.acbd18db4cc2f85cedef654fccc4a4d8.2()
> +
> +define void @0() {
> + ret void
> +}
> +define void @1() {
> + ret void
> +}
> +define void @2() {
> + ret void
> +}
> +
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20160524/03a9119a/attachment.html>
More information about the llvm-commits
mailing list