diff options
| author | Dimitry Andric <dim@FreeBSD.org> | 2012-12-02 13:10:19 +0000 | 
|---|---|---|
| committer | Dimitry Andric <dim@FreeBSD.org> | 2012-12-02 13:10:19 +0000 | 
| commit | 522600a229b950314b5f4af84eba4f3e8a0ffea1 (patch) | |
| tree | 32b4679ab4b8f28e5228daafc65e9dc436935353 /lib/Transforms/Utils/MetaRenamer.cpp | |
| parent | 902a7b529820e6a0aa85f98f21afaeb1805a22f8 (diff) | |
Notes
Diffstat (limited to 'lib/Transforms/Utils/MetaRenamer.cpp')
| -rw-r--r-- | lib/Transforms/Utils/MetaRenamer.cpp | 132 | 
1 files changed, 132 insertions, 0 deletions
diff --git a/lib/Transforms/Utils/MetaRenamer.cpp b/lib/Transforms/Utils/MetaRenamer.cpp new file mode 100644 index 000000000000..233bc12d3cfd --- /dev/null +++ b/lib/Transforms/Utils/MetaRenamer.cpp @@ -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/ADT/STLExtras.h" +#include "llvm/ADT/SmallString.h" +#include "llvm/Transforms/IPO.h" +#include "llvm/DerivedTypes.h" +#include "llvm/Function.h" +#include "llvm/Module.h" +#include "llvm/Pass.h" +#include "llvm/Type.h" +#include "llvm/TypeFinder.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(); +}  | 
