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"
234068e1af9ff68b6b5fdb3233f1304e53f1bf179aChandler Carruth#include "llvm/IR/TypeFinder.h"
2495f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenberg#include "llvm/Pass.h"
2595f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenbergusing namespace llvm;
2695f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenberg
2795f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenbergnamespace {
2895f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenberg
2995f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenberg  // This PRNG is from the ISO C spec. It is intentionally simple and
3095f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenberg  // unsuitable for cryptographic use. We're just looking for enough
3195f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenberg  // variety to surprise and delight users.
3295f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenberg  struct PRNG {
3395f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenberg    unsigned long next;
3495f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenberg
3595f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenberg    void srand(unsigned int seed) {
3695f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenberg      next = seed;
3795f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenberg    }
3895f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenberg
3979c07d2a36282b09b9c5d0aa65ebf4bff017621bDmitri Gribenko    int rand() {
4095f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenberg      next = next * 1103515245 + 12345;
4195f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenberg      return (unsigned int)(next / 65536) % 32768;
4295f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenberg    }
4395f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenberg  };
4495f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenberg
4595f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenberg  struct MetaRenamer : public ModulePass {
4695f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenberg    static char ID; // Pass identification, replacement for typeid
4795f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenberg    MetaRenamer() : ModulePass(ID) {
4895f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenberg      initializeMetaRenamerPass(*PassRegistry::getPassRegistry());
4995f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenberg    }
5095f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenberg
5195f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenberg    void getAnalysisUsage(AnalysisUsage &AU) const {
5295f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenberg      AU.setPreservesAll();
5395f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenberg    }
5495f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenberg
5595f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenberg    bool runOnModule(Module &M) {
5695f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenberg      static const char *metaNames[] = {
5795f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenberg        // See http://en.wikipedia.org/wiki/Metasyntactic_variable
5895f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenberg        "foo", "bar", "baz", "quux", "barney", "snork", "zot", "blam", "hoge",
5995f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenberg        "wibble", "wobble", "widget", "wombat", "ham", "eggs", "pluto", "spam"
6095f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenberg      };
6195f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenberg
6295f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenberg      // Seed our PRNG with simple additive sum of ModuleID. We're looking to
6395f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenberg      // simply avoid always having the same function names, and we need to
6495f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenberg      // remain deterministic.
6595f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenberg      unsigned int randSeed = 0;
6695f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenberg      for (std::string::const_iterator I = M.getModuleIdentifier().begin(),
6795f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenberg           E = M.getModuleIdentifier().end(); I != E; ++I)
6895f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenberg        randSeed += *I;
6995f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenberg
7095f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenberg      PRNG prng;
7195f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenberg      prng.srand(randSeed);
7295f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenberg
7395f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenberg      // Rename all aliases
7495f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenberg      for (Module::alias_iterator AI = M.alias_begin(), AE = M.alias_end();
7503f7e727f41bc6e7ed4fd4423ae0c8bb04412219Anton Korobeynikov           AI != AE; ++AI) {
7603f7e727f41bc6e7ed4fd4423ae0c8bb04412219Anton Korobeynikov        StringRef Name = AI->getName();
7703f7e727f41bc6e7ed4fd4423ae0c8bb04412219Anton Korobeynikov        if (Name.startswith("llvm.") || (!Name.empty() && Name[0] == 1))
7803f7e727f41bc6e7ed4fd4423ae0c8bb04412219Anton Korobeynikov          continue;
7995f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenberg
8003f7e727f41bc6e7ed4fd4423ae0c8bb04412219Anton Korobeynikov        AI->setName("alias");
8103f7e727f41bc6e7ed4fd4423ae0c8bb04412219Anton Korobeynikov      }
8203f7e727f41bc6e7ed4fd4423ae0c8bb04412219Anton Korobeynikov
8395f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenberg      // Rename all global variables
8495f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenberg      for (Module::global_iterator GI = M.global_begin(), GE = M.global_end();
8503f7e727f41bc6e7ed4fd4423ae0c8bb04412219Anton Korobeynikov           GI != GE; ++GI) {
8603f7e727f41bc6e7ed4fd4423ae0c8bb04412219Anton Korobeynikov        StringRef Name = GI->getName();
8703f7e727f41bc6e7ed4fd4423ae0c8bb04412219Anton Korobeynikov        if (Name.startswith("llvm.") || (!Name.empty() && Name[0] == 1))
8803f7e727f41bc6e7ed4fd4423ae0c8bb04412219Anton Korobeynikov          continue;
8903f7e727f41bc6e7ed4fd4423ae0c8bb04412219Anton Korobeynikov
9095f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenberg        GI->setName("global");
9103f7e727f41bc6e7ed4fd4423ae0c8bb04412219Anton Korobeynikov      }
9295f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenberg
9395f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenberg      // Rename all struct types
9495f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenberg      TypeFinder StructTypes;
9595f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenberg      StructTypes.run(M, true);
9695f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenberg      for (unsigned i = 0, e = StructTypes.size(); i != e; ++i) {
9795f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenberg        StructType *STy = StructTypes[i];
9895f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenberg        if (STy->isLiteral() || STy->getName().empty()) continue;
9995f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenberg
10095f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenberg        SmallString<128> NameStorage;
10195f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenberg        STy->setName((Twine("struct.") + metaNames[prng.rand() %
10295f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenberg                     array_lengthof(metaNames)]).toStringRef(NameStorage));
10395f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenberg      }
10495f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenberg
10595f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenberg      // Rename all functions
10695f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenberg      for (Module::iterator FI = M.begin(), FE = M.end();
10795f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenberg           FI != FE; ++FI) {
10803f7e727f41bc6e7ed4fd4423ae0c8bb04412219Anton Korobeynikov        StringRef Name = FI->getName();
10903f7e727f41bc6e7ed4fd4423ae0c8bb04412219Anton Korobeynikov        if (Name.startswith("llvm.") || (!Name.empty() && Name[0] == 1))
11003f7e727f41bc6e7ed4fd4423ae0c8bb04412219Anton Korobeynikov          continue;
11103f7e727f41bc6e7ed4fd4423ae0c8bb04412219Anton Korobeynikov
11295f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenberg        FI->setName(metaNames[prng.rand() % array_lengthof(metaNames)]);
11395f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenberg        runOnFunction(*FI);
11495f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenberg      }
11595f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenberg      return true;
11695f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenberg    }
11795f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenberg
11895f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenberg    bool runOnFunction(Function &F) {
11995f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenberg      for (Function::arg_iterator AI = F.arg_begin(), AE = F.arg_end();
12095f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenberg           AI != AE; ++AI)
12195f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenberg        if (!AI->getType()->isVoidTy())
12295f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenberg          AI->setName("arg");
12395f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenberg
12495f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenberg      for (Function::iterator BB = F.begin(), E = F.end(); BB != E; ++BB) {
12595f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenberg        BB->setName("bb");
12695f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenberg
12795f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenberg        for (BasicBlock::iterator I = BB->begin(), E = BB->end(); I != E; ++I)
12895f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenberg          if (!I->getType()->isVoidTy())
12995f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenberg            I->setName("tmp");
13095f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenberg      }
13195f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenberg      return true;
13295f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenberg    }
13395f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenberg  };
13495f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenberg}
13595f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenberg
13695f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenbergchar MetaRenamer::ID = 0;
13795f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex RosenbergINITIALIZE_PASS(MetaRenamer, "metarenamer",
13895f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenberg                "Assign new names to everything", false, false)
13995f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenberg//===----------------------------------------------------------------------===//
14095f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenberg//
14195f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenberg// MetaRenamer - Rename everything with metasyntactic names.
14295f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenberg//
14395f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex RosenbergModulePass *llvm::createMetaRenamerPass() {
14495f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenberg  return new MetaRenamer();
14595f1ef4ac7f3bf7fd0c4636984fe1c5f8e4190a9Alex Rosenberg}
146