MetaRenamer.cpp revision 0b8c9a80f20772c3793201ab5b251d3520b9cea3
195f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenberg//===- MetaRenamer.cpp - Rename everything with metasyntatic names --------===//
295f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenberg//
395f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenberg//                     The LLVM Compiler Infrastructure
495f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenberg//
595f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenberg// This file is distributed under the University of Illinois Open Source
695f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenberg// License. See LICENSE.TXT for details.
795f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenberg//
895f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenberg//===----------------------------------------------------------------------===//
995f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenberg//
1095f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenberg// This pass renames everything with metasyntatic names. The intent is to use
1195f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenberg// this pass after bugpoint reduction to conceal the nature of the original
1295f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenberg// program.
1395f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenberg//
1495f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenberg//===----------------------------------------------------------------------===//
1595f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenberg
16d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/Transforms/IPO.h"
17eee94b343293eeaa927e0f12d809ea86b0835528Alex Rosenberg#include "llvm/ADT/STLExtras.h"
18eee94b343293eeaa927e0f12d809ea86b0835528Alex Rosenberg#include "llvm/ADT/SmallString.h"
190b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/DerivedTypes.h"
200b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/Function.h"
210b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/Module.h"
220b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/Type.h"
2395f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenberg#include "llvm/Pass.h"
2495f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenberg#include "llvm/TypeFinder.h"
2595f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenberg
2695f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenbergusing namespace llvm;
2795f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenberg
2895f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenbergnamespace {
2995f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenberg
3095f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenberg  // This PRNG is from the ISO C spec. It is intentionally simple and
3195f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenberg  // unsuitable for cryptographic use. We're just looking for enough
3295f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenberg  // variety to surprise and delight users.
3395f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenberg  struct PRNG {
3495f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenberg    unsigned long next;
3595f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenberg
3695f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenberg    void srand(unsigned int seed) {
3795f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenberg      next = seed;
3895f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenberg    }
3995f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenberg
4079c07d2a36282b09b9c5d0aa65ebf4bff017621bDmitri Gribenko    int rand() {
4195f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenberg      next = next * 1103515245 + 12345;
4295f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenberg      return (unsigned int)(next / 65536) % 32768;
4395f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenberg    }
4495f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenberg  };
4595f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenberg
4695f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenberg  struct MetaRenamer : public ModulePass {
4795f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenberg    static char ID; // Pass identification, replacement for typeid
4895f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenberg    MetaRenamer() : ModulePass(ID) {
4995f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenberg      initializeMetaRenamerPass(*PassRegistry::getPassRegistry());
5095f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenberg    }
5195f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenberg
5295f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenberg    void getAnalysisUsage(AnalysisUsage &AU) const {
5395f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenberg      AU.setPreservesAll();
5495f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenberg    }
5595f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenberg
5695f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenberg    bool runOnModule(Module &M) {
5795f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenberg      static const char *metaNames[] = {
5895f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenberg        // See http://en.wikipedia.org/wiki/Metasyntactic_variable
5995f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenberg        "foo", "bar", "baz", "quux", "barney", "snork", "zot", "blam", "hoge",
6095f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenberg        "wibble", "wobble", "widget", "wombat", "ham", "eggs", "pluto", "spam"
6195f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenberg      };
6295f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenberg
6395f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenberg      // Seed our PRNG with simple additive sum of ModuleID. We're looking to
6495f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenberg      // simply avoid always having the same function names, and we need to
6595f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenberg      // remain deterministic.
6695f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenberg      unsigned int randSeed = 0;
6795f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenberg      for (std::string::const_iterator I = M.getModuleIdentifier().begin(),
6895f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenberg           E = M.getModuleIdentifier().end(); I != E; ++I)
6995f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenberg        randSeed += *I;
7095f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenberg
7195f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenberg      PRNG prng;
7295f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenberg      prng.srand(randSeed);
7395f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenberg
7495f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenberg      // Rename all aliases
7595f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenberg      for (Module::alias_iterator AI = M.alias_begin(), AE = M.alias_end();
7695f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenberg           AI != AE; ++AI)
7795f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenberg        AI->setName("alias");
7895f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenberg
7995f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenberg      // Rename all global variables
8095f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenberg      for (Module::global_iterator GI = M.global_begin(), GE = M.global_end();
8195f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenberg           GI != GE; ++GI)
8295f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenberg        GI->setName("global");
8395f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenberg
8495f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenberg      // Rename all struct types
8595f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenberg      TypeFinder StructTypes;
8695f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenberg      StructTypes.run(M, true);
8795f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenberg      for (unsigned i = 0, e = StructTypes.size(); i != e; ++i) {
8895f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenberg        StructType *STy = StructTypes[i];
8995f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenberg        if (STy->isLiteral() || STy->getName().empty()) continue;
9095f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenberg
9195f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenberg        SmallString<128> NameStorage;
9295f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenberg        STy->setName((Twine("struct.") + metaNames[prng.rand() %
9395f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenberg                     array_lengthof(metaNames)]).toStringRef(NameStorage));
9495f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenberg      }
9595f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenberg
9695f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenberg      // Rename all functions
9795f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenberg      for (Module::iterator FI = M.begin(), FE = M.end();
9895f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenberg           FI != FE; ++FI) {
9995f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenberg        FI->setName(metaNames[prng.rand() % array_lengthof(metaNames)]);
10095f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenberg        runOnFunction(*FI);
10195f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenberg      }
10295f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenberg      return true;
10395f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenberg    }
10495f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenberg
10595f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenberg    bool runOnFunction(Function &F) {
10695f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenberg      for (Function::arg_iterator AI = F.arg_begin(), AE = F.arg_end();
10795f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenberg           AI != AE; ++AI)
10895f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenberg        if (!AI->getType()->isVoidTy())
10995f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenberg          AI->setName("arg");
11095f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenberg
11195f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenberg      for (Function::iterator BB = F.begin(), E = F.end(); BB != E; ++BB) {
11295f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenberg        BB->setName("bb");
11395f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenberg
11495f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenberg        for (BasicBlock::iterator I = BB->begin(), E = BB->end(); I != E; ++I)
11595f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenberg          if (!I->getType()->isVoidTy())
11695f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenberg            I->setName("tmp");
11795f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenberg      }
11895f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenberg      return true;
11995f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenberg    }
12095f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenberg  };
12195f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenberg}
12295f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenberg
12395f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenbergchar MetaRenamer::ID = 0;
12495f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex RosenbergINITIALIZE_PASS(MetaRenamer, "metarenamer",
12595f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenberg                "Assign new names to everything", false, false)
12695f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenberg//===----------------------------------------------------------------------===//
12795f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenberg//
12895f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenberg// MetaRenamer - Rename everything with metasyntactic names.
12995f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenberg//
13095f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex RosenbergModulePass *llvm::createMetaRenamerPass() {
13195f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenberg  return new MetaRenamer();
13295f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenberg}
133