<commit_before>//===- SymbolStripping.cpp - Strip symbols for functions and modules ------===//
// 
//                     The LLVM Compiler Infrastructure
//
// This file was developed by the LLVM research group and is distributed under
// the University of Illinois Open Source License. See LICENSE.TXT for details.
// 
//===----------------------------------------------------------------------===//
//
// This file implements stripping symbols out of symbol tables.
//
// Specifically, this allows you to strip all of the symbols out of:
//   * A function
//   * All functions in a module
//   * All symbols in a module (all function symbols + all module scope symbols)
//
// Notice that:
//   * This pass makes code much less readable, so it should only be used in
//     situations where the 'strip' utility would be used (such as reducing 
//     code size, and making it harder to reverse engineer code).
//
//===----------------------------------------------------------------------===//

#include "llvm/Transforms/Scalar.h"
#include "llvm/Module.h"
#include "llvm/SymbolTable.h"
#include "llvm/Pass.h"
using namespace llvm;

static bool StripSymbolTable(SymbolTable &SymTab) {
  bool RemovedSymbol = false;

  for (SymbolTable::iterator I = SymTab.begin(); I != SymTab.end(); ++I) {
    std::map<const std::string, Value *> &Plane = I->second;
    
    SymbolTable::type_iterator B = Plane.begin();
    while (B != Plane.end()) {   // Found nonempty type plane!
      Value *V = B->second;
      if (isa<Constant>(V) || isa<Type>(V)) {
	SymTab.type_remove(B++);
        RemovedSymbol = true;
      } else {
        ++B;
        if (!isa<GlobalValue>(V) || cast<GlobalValue>(V)->hasInternalLinkage()){
          // Set name to "", removing from symbol table!
          V->setName("", &SymTab);
          RemovedSymbol = true;
        }
      }
    }
  }
 
  return RemovedSymbol;<commit_msg>Update obsolete comments Fix iterator invalidation problems which was causing -mstrip to miss some entries, and read free'd memory.  This shrinks the symbol table of 254.gap from 333 to 284 bytes!  :)<commit_after>//===- SymbolStripping.cpp - Strip symbols for functions and modules ------===//
// 
//                     The LLVM Compiler Infrastructure
//
// This file was developed by the LLVM research group and is distributed under
// the University of Illinois Open Source License. See LICENSE.TXT for details.
// 
//===----------------------------------------------------------------------===//
//
// This file implements stripping symbols out of symbol tables.
//
// Specifically, this allows you to strip all of the symbols out of:
//   * All functions in a module
//   * All non-essential symbols in a module (all function symbols + all module
//     scope symbols)
//
// Notice that:
//   * This pass makes code much less readable, so it should only be used in
//     situations where the 'strip' utility would be used (such as reducing 
//     code size, and making it harder to reverse engineer code).
//
//===----------------------------------------------------------------------===//

#include "llvm/Transforms/Scalar.h"
#include "llvm/Module.h"
#include "llvm/SymbolTable.h"
#include "llvm/Pass.h"
using namespace llvm;

static bool StripSymbolTable(SymbolTable &SymTab) {
  bool RemovedSymbol = false;

  for (SymbolTable::iterator I = SymTab.begin(); I != SymTab.end();) {
    // Removing items from the plane can cause the plane itself to get deleted.
    // If this happens, make sure we incremented our plane iterator already!
    std::map<const std::string, Value *> &Plane = (I++)->second;
    
    SymbolTable::type_iterator B = Plane.begin(), Bend = Plane.end();
    while (B != Bend) {   // Found nonempty type plane!
      Value *V = B->second;

      if (isa<Constant>(V) || isa<Type>(V)) {
	SymTab.type_remove(B++);
        RemovedSymbol = true;
      } else {
        ++B;
        if (!isa<GlobalValue>(V) || cast<GlobalValue>(V)->hasInternalLinkage()){
          // Set name to "", removing from symbol table!
          V->setName("", &SymTab);
          RemovedSymbol = true;
        }
      }
    }
  }
 
  return RemovedSymbol;
{'fraction_non_alphanumeric': 0.19154049507329968, 'fraction_numerical': 0.0021629416005767843, 'mean_word_length': 2.153030303030303, 'pattern_counts': {'":': 0, '<': 13, '<?xml version=': 0, '>': 21, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '3387812', 'n_tokens_mistral': 1143, 'n_tokens_neox': 1107, 'n_words': 414}