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