//===-- llvm/Support/Mangler.h - Self-contained name mangler ----*- C++ -*-===//
//
//                     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.
//
//===----------------------------------------------------------------------===//
//
// Unified name mangler for various backends.
//
//===----------------------------------------------------------------------===//

#ifndef LLVM_SUPPORT_MANGLER_H
#define LLVM_SUPPORT_MANGLER_H

#include "llvm/System/IncludeFile.h"
#include <map>
#include <set>
#include <string>

namespace llvm {
class Type;
class Module;
class Value;
class GlobalValue;

class Mangler {
  /// Prefix - This string is added to each symbol that is emitted, unless the
  /// symbol is marked as not needing this prefix.
  const char *Prefix;
  
  /// UseQuotes - If this is set, the target accepts global names in quotes, 
  /// e.g. "foo bar" is a legal name.  This syntax is used instead of escaping
  /// the space character.  By default, this is false.
  bool UseQuotes;
  
  /// PreserveAsmNames - If this is set, the asm escape character is not removed
  /// from names with 'asm' specifiers. 
  bool PreserveAsmNames;
  
  /// Memo - This is used to remember the name that we assign a value.
  ///
  std::map<const Value*, std::string> Memo;

  /// Count - This simple counter is used to unique value names.
  ///
  unsigned Count;
  
  /// TypeMap - If the client wants us to unique types, this keeps track of the
  /// current assignments and TypeCounter keeps track of the next id to assign.
  std::map<const Type*, unsigned> TypeMap;
  unsigned TypeCounter;

  /// This keeps track of which global values have had their names
  /// mangled in the current module.
  ///
  std::set<const GlobalValue*> MangledGlobals;
  
  /// AcceptableChars - This bitfield contains a one for each character that is
  /// allowed to be part of an unmangled name.
  unsigned AcceptableChars[256/32];
public:

  // Mangler ctor - if a prefix is specified, it will be prepended onto all
  // symbols.
  Mangler(Module &M, const char *Prefix = "");

  /// setUseQuotes - If UseQuotes is set to true, this target accepts quoted
  /// strings for assembler labels.
  void setUseQuotes(bool Val) { UseQuotes = Val; }
  
  /// setPreserveAsmNames - If the mangler should not strip off the asm name
  /// @verbatim identifier (\001), this should be set. @endverbatim
  void setPreserveAsmNames(bool Val) { PreserveAsmNames = Val; }
  
  /// Acceptable Characters - This allows the target to specify which characters
  /// are acceptable to the assembler without being mangled.  By default we
  /// allow letters, numbers, '_', '$', and '.', which is what GAS accepts.
  void markCharAcceptable(unsigned char X) {
    AcceptableChars[X/32] |= 1 << (X&31);
  }
  void markCharUnacceptable(unsigned char X) {
    AcceptableChars[X/32] &= ~(1 << (X&31));
  }
  bool isCharAcceptable(unsigned char X) const {
    return (AcceptableChars[X/32] & (1 << (X&31))) != 0;
  }
  
  /// getTypeID - Return a unique ID for the specified LLVM type.
  ///
  unsigned getTypeID(const Type *Ty);

  /// getValueName - Returns the mangled name of V, an LLVM Value,
  /// in the current module.
  ///
  std::string getValueName(const GlobalValue *V, const char *Suffix = "");
  std::string getValueName(const Value *V);

  /// makeNameProper - We don't want identifier names with ., space, or
  /// - in them, so we mangle these characters into the strings "d_",
  /// "s_", and "D_", respectively. This is a very simple mangling that
  /// doesn't guarantee unique names for values. getValueName already
  /// does this for you, so there's no point calling it on the result
  /// from getValueName.
  ///
  std::string makeNameProper(const std::string &x, const char *Prefix = "");
  
private:
  void InsertName(GlobalValue *GV, std::map<std::string, GlobalValue*> &Names);
};

} // End llvm namespace

// Force the Mangler.cpp file to be linked when this header is #included
FORCE_DEFINING_FILE_TO_BE_LINKED(Mangler)

#endif // LLVM_SUPPORT_MANGLER_H
