[llvm-commits] [llvm] r163592 - in /llvm/trunk: include/llvm/InitializePasses.h include/llvm/LinkAllPasses.h include/llvm/Transforms/IPO.h lib/Transforms/Utils/MetaRenamer.cpp lib/Transforms/Utils/Utils.cpp test/Transforms/MetaRenamer/ test/Trans

Chandler Carruth chandlerc at google.com
Mon Sep 10 20:08:44 PDT 2012


Any chance you're up for teaching bug point to run this automatically at
the end? ;]
On Sep 10, 2012 7:49 PM, "Alex Rosenberg" <alexr at leftfield.org> wrote:

> Author: alexr
> Date: Mon Sep 10 21:46:18 2012
> New Revision: 163592
>
> URL: http://llvm.org/viewvc/llvm-project?rev=163592&view=rev
> Log:
> Add a pass that renames everything with metasyntatic names. This works
> well after using bugpoint to reduce the confusion presented by the original
> names, which no longer mean what they used to.
>
> Added:
>     llvm/trunk/lib/Transforms/Utils/MetaRenamer.cpp
>     llvm/trunk/test/Transforms/MetaRenamer/
>     llvm/trunk/test/Transforms/MetaRenamer/lit.local.cfg
>     llvm/trunk/test/Transforms/MetaRenamer/metarenamer.ll
> Modified:
>     llvm/trunk/include/llvm/InitializePasses.h
>     llvm/trunk/include/llvm/LinkAllPasses.h
>     llvm/trunk/include/llvm/Transforms/IPO.h
>     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=163592&r1=163591&r2=163592&view=diff
>
> ==============================================================================
> --- llvm/trunk/include/llvm/InitializePasses.h (original)
> +++ llvm/trunk/include/llvm/InitializePasses.h Mon Sep 10 21:46:18 2012
> @@ -178,6 +178,7 @@
>  void initializeMemCpyOptPass(PassRegistry&);
>  void initializeMemDepPrinterPass(PassRegistry&);
>  void initializeMemoryDependenceAnalysisPass(PassRegistry&);
> +void initializeMetaRenamerPass(PassRegistry&);
>  void initializeMergeFunctionsPass(PassRegistry&);
>  void initializeModuleDebugInfoPrinterPass(PassRegistry&);
>  void initializeNoAAPass(PassRegistry&);
>
> Modified: llvm/trunk/include/llvm/LinkAllPasses.h
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/LinkAllPasses.h?rev=163592&r1=163591&r2=163592&view=diff
>
> ==============================================================================
> --- llvm/trunk/include/llvm/LinkAllPasses.h (original)
> +++ llvm/trunk/include/llvm/LinkAllPasses.h Mon Sep 10 21:46:18 2012
> @@ -141,6 +141,7 @@
>        (void) llvm::createLoopDeletionPass();
>        (void) llvm::createPostDomTree();
>        (void) llvm::createInstructionNamerPass();
> +      (void) llvm::createMetaRenamerPass();
>        (void) llvm::createFunctionAttrsPass();
>        (void) llvm::createMergeFunctionsPass();
>        (void) llvm::createPrintModulePass(0);
>
> Modified: llvm/trunk/include/llvm/Transforms/IPO.h
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Transforms/IPO.h?rev=163592&r1=163591&r2=163592&view=diff
>
> ==============================================================================
> --- llvm/trunk/include/llvm/Transforms/IPO.h (original)
> +++ llvm/trunk/include/llvm/Transforms/IPO.h Mon Sep 10 21:46:18 2012
> @@ -192,6 +192,11 @@
>  /// createPartialInliningPass - This pass inlines parts of functions.
>  ///
>  ModulePass *createPartialInliningPass();
> +
>
> +//===----------------------------------------------------------------------===//
> +// createMetaRenamerPass - Rename everything with metasyntatic names.
> +//
> +ModulePass *createMetaRenamerPass();
>
>  } // End llvm namespace
>
>
> Added: llvm/trunk/lib/Transforms/Utils/MetaRenamer.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Utils/MetaRenamer.cpp?rev=163592&view=auto
>
> ==============================================================================
> --- llvm/trunk/lib/Transforms/Utils/MetaRenamer.cpp (added)
> +++ llvm/trunk/lib/Transforms/Utils/MetaRenamer.cpp Mon Sep 10 21:46:18
> 2012
> @@ -0,0 +1,132 @@
> +//===- MetaRenamer.cpp - Rename everything with metasyntatic names
> --------===//
> +//
> +//                     The LLVM Compiler Infrastructure
> +//
> +// This file is distributed under the University of Illinois Open Source
> +// License. See LICENSE.TXT for details.
> +//
>
> +//===----------------------------------------------------------------------===//
> +//
> +// This pass renames everything with metasyntatic names. The intent is to
> use
> +// this pass after bugpoint reduction to conceal the nature of the
> original
> +// program.
> +//
>
> +//===----------------------------------------------------------------------===//
> +
> +#include "llvm/Transforms/IPO.h"
> +#include "llvm/Function.h"
> +#include "llvm/Module.h"
> +#include "llvm/Pass.h"
> +#include "llvm/Type.h"
> +#include "llvm/TypeFinder.h"
> +#include "llvm/DerivedTypes.h"
> +#include "llvm/ADT/STLExtras.h"
> +#include "llvm/ADT/SmallString.h"
> +
> +using namespace llvm;
> +
> +namespace {
> +
> +  // This PRNG is from the ISO C spec. It is intentionally simple and
> +  // unsuitable for cryptographic use. We're just looking for enough
> +  // variety to surprise and delight users.
> +  struct PRNG {
> +    unsigned long next;
> +
> +    void srand(unsigned int seed) {
> +      next = seed;
> +    }
> +
> +    int rand(void) {
> +      next = next * 1103515245 + 12345;
> +      return (unsigned int)(next / 65536) % 32768;
> +    }
> +  };
> +
> +  struct MetaRenamer : public ModulePass {
> +    static char ID; // Pass identification, replacement for typeid
> +    MetaRenamer() : ModulePass(ID) {
> +      initializeMetaRenamerPass(*PassRegistry::getPassRegistry());
> +    }
> +
> +    void getAnalysisUsage(AnalysisUsage &AU) const {
> +      AU.setPreservesAll();
> +    }
> +
> +    bool runOnModule(Module &M) {
> +      static const char *metaNames[] = {
> +        // See http://en.wikipedia.org/wiki/Metasyntactic_variable
> +        "foo", "bar", "baz", "quux", "barney", "snork", "zot", "blam",
> "hoge",
> +        "wibble", "wobble", "widget", "wombat", "ham", "eggs", "pluto",
> "spam"
> +      };
> +
> +      // Seed our PRNG with simple additive sum of ModuleID. We're
> looking to
> +      // simply avoid always having the same function names, and we need
> to
> +      // remain deterministic.
> +      unsigned int randSeed = 0;
> +      for (std::string::const_iterator I =
> M.getModuleIdentifier().begin(),
> +           E = M.getModuleIdentifier().end(); I != E; ++I)
> +        randSeed += *I;
> +
> +      PRNG prng;
> +      prng.srand(randSeed);
> +
> +      // Rename all aliases
> +      for (Module::alias_iterator AI = M.alias_begin(), AE =
> M.alias_end();
> +           AI != AE; ++AI)
> +        AI->setName("alias");
> +
> +      // Rename all global variables
> +      for (Module::global_iterator GI = M.global_begin(), GE =
> M.global_end();
> +           GI != GE; ++GI)
> +        GI->setName("global");
> +
> +      // Rename all struct types
> +      TypeFinder StructTypes;
> +      StructTypes.run(M, true);
> +      for (unsigned i = 0, e = StructTypes.size(); i != e; ++i) {
> +        StructType *STy = StructTypes[i];
> +        if (STy->isLiteral() || STy->getName().empty()) continue;
> +
> +        SmallString<128> NameStorage;
> +        STy->setName((Twine("struct.") + metaNames[prng.rand() %
> +
> array_lengthof(metaNames)]).toStringRef(NameStorage));
> +      }
> +
> +      // Rename all functions
> +      for (Module::iterator FI = M.begin(), FE = M.end();
> +           FI != FE; ++FI) {
> +        FI->setName(metaNames[prng.rand() % array_lengthof(metaNames)]);
> +        runOnFunction(*FI);
> +      }
> +      return true;
> +    }
> +
> +    bool runOnFunction(Function &F) {
> +      for (Function::arg_iterator AI = F.arg_begin(), AE = F.arg_end();
> +           AI != AE; ++AI)
> +        if (!AI->getType()->isVoidTy())
> +          AI->setName("arg");
> +
> +      for (Function::iterator BB = F.begin(), E = F.end(); BB != E; ++BB)
> {
> +        BB->setName("bb");
> +
> +        for (BasicBlock::iterator I = BB->begin(), E = BB->end(); I != E;
> ++I)
> +          if (!I->getType()->isVoidTy())
> +            I->setName("tmp");
> +      }
> +      return true;
> +    }
> +  };
> +}
> +
> +char MetaRenamer::ID = 0;
> +INITIALIZE_PASS(MetaRenamer, "metarenamer",
> +                "Assign new names to everything", false, false)
>
> +//===----------------------------------------------------------------------===//
> +//
> +// MetaRenamer - Rename everything with metasyntactic names.
> +//
> +ModulePass *llvm::createMetaRenamerPass() {
> +  return new MetaRenamer();
> +}
>
> Modified: llvm/trunk/lib/Transforms/Utils/Utils.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Utils/Utils.cpp?rev=163592&r1=163591&r2=163592&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/Transforms/Utils/Utils.cpp (original)
> +++ llvm/trunk/lib/Transforms/Utils/Utils.cpp Mon Sep 10 21:46:18 2012
> @@ -29,6 +29,7 @@
>    initializePromotePassPass(Registry);
>    initializeUnifyFunctionExitNodesPass(Registry);
>    initializeInstSimplifierPass(Registry);
> +  initializeMetaRenamerPass(Registry);
>  }
>
>  /// LLVMInitializeTransformUtils - C binding for
> initializeTransformUtilsPasses.
>
> Added: llvm/trunk/test/Transforms/MetaRenamer/lit.local.cfg
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/MetaRenamer/lit.local.cfg?rev=163592&view=auto
>
> ==============================================================================
> --- llvm/trunk/test/Transforms/MetaRenamer/lit.local.cfg (added)
> +++ llvm/trunk/test/Transforms/MetaRenamer/lit.local.cfg Mon Sep 10
> 21:46:18 2012
> @@ -0,0 +1 @@
> +config.suffixes = ['.ll', '.c', '.cpp']
>
> Added: llvm/trunk/test/Transforms/MetaRenamer/metarenamer.ll
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/MetaRenamer/metarenamer.ll?rev=163592&view=auto
>
> ==============================================================================
> --- llvm/trunk/test/Transforms/MetaRenamer/metarenamer.ll (added)
> +++ llvm/trunk/test/Transforms/MetaRenamer/metarenamer.ll Mon Sep 10
> 21:46:18 2012
> @@ -0,0 +1,96 @@
> +; RUN: opt %s -metarenamer -S | FileCheck %s
> +
> +; CHECK: target triple {{.*}}
> +; CHECK-NOT: {{^x*}}xxx{{^x*}}
> +; CHECK: ret i32 6
> +
> +target triple = "x86_64-pc-linux-gnu"
> +
> +%struct.bar_xxx = type { i32, double }
> +%struct.foo_xxx = type { i32, float, %struct.bar_xxx }
> +
> + at func_5_xxx.static_local_3_xxx = internal global i32 3, align 4
> + at global_3_xxx = common global i32 0, align 4
> +
> + at func_7_xxx = alias weak i32 (...)* @aliased_func_7_xxx
> +
> +declare i32 @aliased_func_7_xxx(...)
> +
> +define i32 @func_3_xxx() nounwind uwtable ssp {
> +  ret i32 3
> +}
> +
> +define void @func_4_xxx(%struct.foo_xxx* sret %agg.result) nounwind
> uwtable ssp {
> +  %1 = alloca %struct.foo_xxx, align 8
> +  %2 = getelementptr inbounds %struct.foo_xxx* %1, i32 0, i32 0
> +  store i32 1, i32* %2, align 4
> +  %3 = getelementptr inbounds %struct.foo_xxx* %1, i32 0, i32 1
> +  store float 2.000000e+00, float* %3, align 4
> +  %4 = getelementptr inbounds %struct.foo_xxx* %1, i32 0, i32 2
> +  %5 = getelementptr inbounds %struct.bar_xxx* %4, i32 0, i32 0
> +  store i32 3, i32* %5, align 4
> +  %6 = getelementptr inbounds %struct.bar_xxx* %4, i32 0, i32 1
> +  store double 4.000000e+00, double* %6, align 8
> +  %7 = bitcast %struct.foo_xxx* %agg.result to i8*
> +  %8 = bitcast %struct.foo_xxx* %1 to i8*
> +  call void @llvm.memcpy.p0i8.p0i8.i64(i8* %7, i8* %8, i64 24, i32 8, i1
> false)
> +  ret void
> +}
> +
> +declare void @llvm.memcpy.p0i8.p0i8.i64(i8* nocapture, i8* nocapture,
> i64, i32, i1) nounwind
> +
> +define i32 @func_5_xxx(i32 %arg_1_xxx, i32 %arg_2_xxx, i32 %arg_3_xxx,
> i32 %arg_4_xxx) nounwind uwtable ssp {
> +  %1 = alloca i32, align 4
> +  %2 = alloca i32, align 4
> +  %3 = alloca i32, align 4
> +  %4 = alloca i32, align 4
> +  %local_1_xxx = alloca i32, align 4
> +  %local_2_xxx = alloca i32, align 4
> +  %i = alloca i32, align 4
> +  store i32 %arg_1_xxx, i32* %1, align 4
> +  store i32 %arg_2_xxx, i32* %2, align 4
> +  store i32 %arg_3_xxx, i32* %3, align 4
> +  store i32 %arg_4_xxx, i32* %4, align 4
> +  store i32 1, i32* %local_1_xxx, align 4
> +  store i32 2, i32* %local_2_xxx, align 4
> +  store i32 0, i32* %i, align 4
> +  br label %5
> +
> +; <label>:5                                       ; preds = %9, %0
> +  %6 = load i32* %i, align 4
> +  %7 = icmp slt i32 %6, 10
> +  br i1 %7, label %8, label %12
> +
> +; <label>:8                                       ; preds = %5
> +  br label %9
> +
> +; <label>:9                                       ; preds = %8
> +  %10 = load i32* %i, align 4
> +  %11 = add nsw i32 %10, 1
> +  store i32 %11, i32* %i, align 4
> +  br label %5
> +
> +; <label>:12                                      ; preds = %5
> +  %13 = load i32* %local_1_xxx, align 4
> +  %14 = load i32* %1, align 4
> +  %15 = add nsw i32 %13, %14
> +  %16 = load i32* %local_2_xxx, align 4
> +  %17 = add nsw i32 %15, %16
> +  %18 = load i32* %2, align 4
> +  %19 = add nsw i32 %17, %18
> +  %20 = load i32* @func_5_xxx.static_local_3_xxx, align 4
> +  %21 = add nsw i32 %19, %20
> +  %22 = load i32* %3, align 4
> +  %23 = add nsw i32 %21, %22
> +  %24 = load i32* %4, align 4
> +  %25 = add nsw i32 %23, %24
> +  ret i32 %25
> +}
> +
> +define i32 @varargs_func_6_xxx(i32 %arg_1_xxx, i32 %arg_2_xxx, ...)
> nounwind uwtable ssp {
> +  %1 = alloca i32, align 4
> +  %2 = alloca i32, align 4
> +  store i32 %arg_1_xxx, i32* %1, align 4
> +  store i32 %arg_2_xxx, i32* %2, align 4
> +  ret i32 6
> +}
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20120910/7721f181/attachment.html>


More information about the llvm-commits mailing list