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) { 563c70fcf02b367f517e93c1bd4ce237966383ebf8Craig Topper static const char *const 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