diff options
author | Misha Brukman <brukman+llvm@gmail.com> | 2004-08-16 19:04:36 +0000 |
---|---|---|
committer | Misha Brukman <brukman+llvm@gmail.com> | 2004-08-16 19:04:36 +0000 |
commit | cdc4b86e35e8f091ec3f24c9205f6d645b4d03d6 (patch) | |
tree | 6d6c54b9ebd369d1e9ebcb871063b906b6982724 /lib/Support | |
parent | 52b77edbbd8df167910927091fa9882adf394721 (diff) | |
download | external_llvm-cdc4b86e35e8f091ec3f24c9205f6d645b4d03d6.zip external_llvm-cdc4b86e35e8f091ec3f24c9205f6d645b4d03d6.tar.gz external_llvm-cdc4b86e35e8f091ec3f24c9205f6d645b4d03d6.tar.bz2 |
Move these files (which are dependent on VMCore) into VMCore
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@15825 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Support')
-rw-r--r-- | lib/Support/LeakDetector.cpp | 125 | ||||
-rw-r--r-- | lib/Support/Mangler.cpp | 127 |
2 files changed, 0 insertions, 252 deletions
diff --git a/lib/Support/LeakDetector.cpp b/lib/Support/LeakDetector.cpp deleted file mode 100644 index dbdb7dd..0000000 --- a/lib/Support/LeakDetector.cpp +++ /dev/null @@ -1,125 +0,0 @@ -//===-- LeakDetector.cpp - Implement LeakDetector interface ---------------===// -// -// 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 the LeakDetector class. -// -//===----------------------------------------------------------------------===// - -#include "Support/LeakDetector.h" -#include "llvm/Value.h" -#include <iostream> -#include <set> -using namespace llvm; - -namespace { - template <class T> - struct PrinterTrait { - static void print(const T* P) { std::cerr << P; } - }; - - template<> - struct PrinterTrait<Value> { - static void print(const Value* P) { std::cerr << *P; } - }; - - template <typename T> - struct LeakDetectorImpl { - LeakDetectorImpl(const char* const name) : Cache(0), Name(name) { } - - // Because the most common usage pattern, by far, is to add a - // garbage object, then remove it immediately, we optimize this - // case. When an object is added, it is not added to the set - // immediately, it is added to the CachedValue Value. If it is - // immediately removed, no set search need be performed. - void addGarbage(const T* o) { - if (Cache) { - assert(Ts.count(Cache) == 0 && "Object already in set!"); - Ts.insert(Cache); - } - Cache = o; - } - - void removeGarbage(const T* o) { - if (o == Cache) - Cache = 0; // Cache hit - else - Ts.erase(o); - } - - bool hasGarbage(const std::string& Message) { - addGarbage(0); // Flush the Cache - - assert(Cache == 0 && "No value should be cached anymore!"); - - if (!Ts.empty()) { - std::cerr - << "Leaked " << Name << " objects found: " << Message << ":\n"; - for (typename std::set<const T*>::iterator I = Ts.begin(), - E = Ts.end(); I != E; ++I) { - std::cerr << "\t"; - PrinterTrait<T>::print(*I); - std::cerr << "\n"; - } - std::cerr << '\n'; - - // Clear out results so we don't get duplicate warnings on - // next call... - Ts.clear(); - return true; - } - return false; - } - - private: - std::set<const T*> Ts; - const T* Cache; - const char* const Name; - }; - - typedef LeakDetectorImpl<void> Objects; - typedef LeakDetectorImpl<Value> LLVMObjects; - - Objects& getObjects() { - static Objects *o = 0; - if (o == 0) - o = new Objects("GENERIC"); - return *o; - } - - LLVMObjects& getLLVMObjects() { - static LLVMObjects *o = 0; - if (o == 0) - o = new LLVMObjects("LLVM"); - return *o; - } -} - -void LeakDetector::addGarbageObjectImpl(void *Object) { - getObjects().addGarbage(Object); -} - -void LeakDetector::addGarbageObjectImpl(const Value *Object) { - getLLVMObjects().addGarbage(Object); -} - -void LeakDetector::removeGarbageObjectImpl(void *Object) { - getObjects().removeGarbage(Object); -} - -void LeakDetector::removeGarbageObjectImpl(const Value *Object) { - getLLVMObjects().removeGarbage(Object); -} - -void LeakDetector::checkForGarbageImpl(const std::string &Message) { - // use non-short-circuit version so that both checks are performed - if (getObjects().hasGarbage(Message) | - getLLVMObjects().hasGarbage(Message)) - std::cerr << "\nThis is probably because you removed an object, but didn't " - "delete it. Please check your code for memory leaks.\n"; -} diff --git a/lib/Support/Mangler.cpp b/lib/Support/Mangler.cpp deleted file mode 100644 index bf989b4..0000000 --- a/lib/Support/Mangler.cpp +++ /dev/null @@ -1,127 +0,0 @@ -//===-- Mangler.cpp - Self-contained c/asm llvm name mangler --------------===// -// -// 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 CWriter and assembly backends. -// -//===----------------------------------------------------------------------===// - -#include "llvm/Support/Mangler.h" -#include "llvm/Module.h" -#include "llvm/Type.h" -#include "Support/StringExtras.h" -using namespace llvm; - -static char HexDigit(int V) { - return V < 10 ? V+'0' : V+'A'-10; -} - -static std::string MangleLetter(unsigned char C) { - return std::string("_")+HexDigit(C >> 4) + HexDigit(C & 15) + "_"; -} - -/// makeNameProper - We don't want identifier names non-C-identifier characters -/// in them, so mangle them as appropriate. -/// -std::string Mangler::makeNameProper(const std::string &X) { - std::string Result; - - // Mangle the first letter specially, don't allow numbers... - if ((X[0] < 'a' || X[0] > 'z') && (X[0] < 'A' || X[0] > 'Z') && X[0] != '_') - Result += MangleLetter(X[0]); - else - Result += X[0]; - - for (std::string::const_iterator I = X.begin()+1, E = X.end(); I != E; ++I) - if ((*I < 'a' || *I > 'z') && (*I < 'A' || *I > 'Z') && - (*I < '0' || *I > '9') && *I != '_') - Result += MangleLetter(*I); - else - Result += *I; - return Result; -} - -/// getTypeID - Return a unique ID for the specified LLVM type. -/// -unsigned Mangler::getTypeID(const Type *Ty) { - unsigned &E = TypeMap[Ty]; - if (E == 0) E = ++TypeCounter; - return E; -} - - -std::string Mangler::getValueName(const Value *V) { - // Check to see whether we've already named V. - ValueMap::iterator VI = Memo.find(V); - if (VI != Memo.end()) { - return VI->second; // Return the old name for V. - } - - std::string name; - if (V->hasName()) { // Print out the label if it exists... - // Name mangling occurs as follows: - // - If V is an intrinsic function, do not change name at all - // - If V is not a global, mangling always occurs. - // - Otherwise, mangling occurs when any of the following are true: - // 1) V has internal linkage - // 2) V's name would collide if it is not mangled. - // - const GlobalValue* gv = dyn_cast<GlobalValue>(V); - if (gv && isa<Function>(gv) && cast<Function>(gv)->getIntrinsicID()) { - name = gv->getName(); // Is an intrinsic function - } else if (gv && !gv->hasInternalLinkage() && !MangledGlobals.count(gv)) { - name = makeNameProper(gv->getName()); - if (AddUnderscorePrefix) name = "_" + name; - } else { - // Non-global, or global with internal linkage / colliding name - // -> mangle. - unsigned TypeUniqueID = getTypeID(V->getType()); - name = "l" + utostr(TypeUniqueID) + "_" + makeNameProper(V->getName()); - } - } else { - name = "ltmp_" + utostr(Count++) + "_" + utostr(getTypeID(V->getType())); - } - - Memo[V] = name; - return name; -} - -void Mangler::InsertName(GlobalValue *GV, - std::map<std::string, GlobalValue*> &Names) { - if (!GV->hasName()) { // We must mangle unnamed globals. - MangledGlobals.insert(GV); - return; - } - - // Figure out if this is already used. - GlobalValue *&ExistingValue = Names[GV->getName()]; - if (!ExistingValue) { - ExistingValue = GV; - } else { - // If GV is external but the existing one is static, mangle the existing one - if (GV->hasExternalLinkage() && !ExistingValue->hasExternalLinkage()) { - MangledGlobals.insert(ExistingValue); - ExistingValue = GV; - } else { - // Otherwise, mangle GV - MangledGlobals.insert(GV); - } - } -} - - -Mangler::Mangler(Module &m, bool addUnderscorePrefix) - : M(m), AddUnderscorePrefix(addUnderscorePrefix), TypeCounter(0), Count(0) { - // Calculate which global values have names that will collide when we throw - // away type information. - std::map<std::string, GlobalValue*> Names; - for (Module::iterator I = M.begin(), E = M.end(); I != E; ++I) - InsertName(I, Names); - for (Module::giterator I = M.gbegin(), E = M.gend(); I != E; ++I) - InsertName(I, Names); -} |