make the mangler take an MCContext instead of an MAI.

No functionality change.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@98363 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Chris Lattner 2010-03-12 18:44:54 +00:00
parent fdab14b105
commit 5ef31a039d
9 changed files with 65 additions and 60 deletions

View File

@ -48,7 +48,7 @@ namespace llvm {
/// objects. /// objects.
BumpPtrAllocator Allocator; BumpPtrAllocator Allocator;
public: public:
MCContext(const MCAsmInfo &MAI); explicit MCContext(const MCAsmInfo &MAI);
~MCContext(); ~MCContext();
const MCAsmInfo &getAsmInfo() const { return MAI; } const MCAsmInfo &getAsmInfo() const { return MAI; }

View File

@ -23,7 +23,7 @@ class Twine;
class Value; class Value;
class GlobalValue; class GlobalValue;
template <typename T> class SmallVectorImpl; template <typename T> class SmallVectorImpl;
class MCAsmInfo; class MCContext;
class Mangler { class Mangler {
public: public:
@ -34,7 +34,7 @@ public:
}; };
private: private:
const MCAsmInfo &MAI; const MCContext &Context;
/// AnonGlobalIDs - We need to give global values the same name every time /// AnonGlobalIDs - We need to give global values the same name every time
/// they are mangled. This keeps track of the number we give to anonymous /// they are mangled. This keeps track of the number we give to anonymous
@ -47,9 +47,7 @@ private:
unsigned NextAnonGlobalID; unsigned NextAnonGlobalID;
public: public:
// Mangler ctor - if a prefix is specified, it will be prepended onto all Mangler(const MCContext &context) : Context(context), NextAnonGlobalID(1) {}
// symbols.
Mangler(const MCAsmInfo &mai) : MAI(mai), NextAnonGlobalID(1) {}
/// getNameWithPrefix - Fill OutName with the name of the appropriate prefix /// getNameWithPrefix - Fill OutName with the name of the appropriate prefix
/// and the specified global variable's name. If the global variable doesn't /// and the specified global variable's name. If the global variable doesn't

View File

@ -104,7 +104,7 @@ bool AsmPrinter::doInitialization(Module &M) {
const_cast<TargetLoweringObjectFile&>(getObjFileLowering()) const_cast<TargetLoweringObjectFile&>(getObjFileLowering())
.Initialize(OutContext, TM); .Initialize(OutContext, TM);
Mang = new Mangler(*MAI); Mang = new Mangler(OutContext);
// Allow the target to emit any magic that it wants at the start of the file. // Allow the target to emit any magic that it wants at the start of the file.
EmitStartOfAsmFile(M); EmitStartOfAsmFile(M);

View File

@ -109,7 +109,7 @@ bool ELFWriter::doInitialization(Module &M) {
// Initialize TargetLoweringObjectFile. // Initialize TargetLoweringObjectFile.
const_cast<TargetLoweringObjectFile&>(TLOF).Initialize(OutContext, TM); const_cast<TargetLoweringObjectFile&>(TLOF).Initialize(OutContext, TM);
Mang = new Mangler(*MAI); Mang = new Mangler(OutContext);
// ELF Header // ELF Header
// ---------- // ----------

View File

@ -101,14 +101,12 @@ LLVMTargetMachine::LLVMTargetMachine(const Target &T,
// Set the default code model for the JIT for a generic target. // Set the default code model for the JIT for a generic target.
// FIXME: Is small right here? or .is64Bit() ? Large : Small? // FIXME: Is small right here? or .is64Bit() ? Large : Small?
void void LLVMTargetMachine::setCodeModelForJIT() {
LLVMTargetMachine::setCodeModelForJIT() {
setCodeModel(CodeModel::Small); setCodeModel(CodeModel::Small);
} }
// Set the default code model for static compilation for a generic target. // Set the default code model for static compilation for a generic target.
void void LLVMTargetMachine::setCodeModelForStatic() {
LLVMTargetMachine::setCodeModelForStatic() {
setCodeModel(CodeModel::Small); setCodeModel(CodeModel::Small);
} }

View File

@ -36,6 +36,7 @@
#include "llvm/Target/Mangler.h" #include "llvm/Target/Mangler.h"
#include "llvm/Transforms/Scalar.h" #include "llvm/Transforms/Scalar.h"
#include "llvm/MC/MCAsmInfo.h" #include "llvm/MC/MCAsmInfo.h"
#include "llvm/MC/MCContext.h"
#include "llvm/MC/MCSymbol.h" #include "llvm/MC/MCSymbol.h"
#include "llvm/Target/TargetData.h" #include "llvm/Target/TargetData.h"
#include "llvm/Target/TargetRegistry.h" #include "llvm/Target/TargetRegistry.h"
@ -95,6 +96,7 @@ namespace {
LoopInfo *LI; LoopInfo *LI;
const Module *TheModule; const Module *TheModule;
const MCAsmInfo* TAsm; const MCAsmInfo* TAsm;
MCContext *TCtx;
const TargetData* TD; const TargetData* TD;
std::map<const Type *, std::string> TypeNames; std::map<const Type *, std::string> TypeNames;
std::map<const ConstantFP *, unsigned> FPConstantMap; std::map<const ConstantFP *, unsigned> FPConstantMap;
@ -1731,7 +1733,8 @@ bool CWriter::doInitialization(Module &M) {
TAsm = Match->createAsmInfo(Triple); TAsm = Match->createAsmInfo(Triple);
#endif #endif
TAsm = new CBEMCAsmInfo(); TAsm = new CBEMCAsmInfo();
Mang = new Mangler(*TAsm); TCtx = new MCContext(*TAsm);
Mang = new Mangler(*TCtx);
// Keep track of which functions are static ctors/dtors so they can have // Keep track of which functions are static ctors/dtors so they can have
// an attribute added to their prototypes. // an attribute added to their prototypes.

View File

@ -14,6 +14,7 @@
#include "llvm/Target/Mangler.h" #include "llvm/Target/Mangler.h"
#include "llvm/GlobalValue.h" #include "llvm/GlobalValue.h"
#include "llvm/MC/MCAsmInfo.h" #include "llvm/MC/MCAsmInfo.h"
#include "llvm/MC/MCContext.h"
#include "llvm/ADT/SmallString.h" #include "llvm/ADT/SmallString.h"
#include "llvm/ADT/Twine.h" #include "llvm/ADT/Twine.h"
using namespace llvm; using namespace llvm;
@ -59,11 +60,10 @@ static bool NameNeedsEscaping(StringRef Str, const MCAsmInfo &MAI) {
/// appendMangledName - Add the specified string in mangled form if it uses /// appendMangledName - Add the specified string in mangled form if it uses
/// any unusual characters. /// any unusual characters.
static void appendMangledName(SmallVectorImpl<char> &OutName, StringRef Str, static void appendMangledName(SmallVectorImpl<char> &OutName, StringRef Str,
const MCAsmInfo *MAI) { const MCAsmInfo &MAI) {
// The first character is not allowed to be a number unless the target // The first character is not allowed to be a number unless the target
// explicitly allows it. // explicitly allows it.
if ((MAI == 0 || !MAI->doesAllowNameToStartWithDigit()) && if (!MAI.doesAllowNameToStartWithDigit() && Str[0] >= '0' && Str[0] <= '9') {
Str[0] >= '0' && Str[0] <= '9') {
MangleLetter(OutName, Str[0]); MangleLetter(OutName, Str[0]);
Str = Str.substr(1); Str = Str.substr(1);
} }
@ -100,6 +100,8 @@ void Mangler::getNameWithPrefix(SmallVectorImpl<char> &OutName,
StringRef Name = GVName.toStringRef(TmpData); StringRef Name = GVName.toStringRef(TmpData);
assert(!Name.empty() && "getNameWithPrefix requires non-empty name"); assert(!Name.empty() && "getNameWithPrefix requires non-empty name");
const MCAsmInfo &MAI = Context.getAsmInfo();
// If the global name is not led with \1, add the appropriate prefixes. // If the global name is not led with \1, add the appropriate prefixes.
if (Name[0] == '\1') { if (Name[0] == '\1') {
Name = Name.substr(1); Name = Name.substr(1);
@ -134,7 +136,7 @@ void Mangler::getNameWithPrefix(SmallVectorImpl<char> &OutName,
// On systems that do not allow quoted names, we need to mangle most // On systems that do not allow quoted names, we need to mangle most
// strange characters. // strange characters.
if (!MAI.doesAllowQuotesInName()) if (!MAI.doesAllowQuotesInName())
return appendMangledName(OutName, Name, &MAI); return appendMangledName(OutName, Name, MAI);
// Okay, the system allows quoted strings. We can quote most anything, the // Okay, the system allows quoted strings. We can quote most anything, the
// only characters that need escaping are " and \n. // only characters that need escaping are " and \n.

View File

@ -27,6 +27,17 @@
#include "llvm/Analysis/LoopPass.h" #include "llvm/Analysis/LoopPass.h"
#include "llvm/Analysis/Verifier.h" #include "llvm/Analysis/Verifier.h"
#include "llvm/Bitcode/ReaderWriter.h" #include "llvm/Bitcode/ReaderWriter.h"
#include "llvm/MC/MCAsmInfo.h"
#include "llvm/MC/MCContext.h"
#include "llvm/Target/Mangler.h"
#include "llvm/Target/SubtargetFeature.h"
#include "llvm/Target/TargetOptions.h"
#include "llvm/Target/TargetData.h"
#include "llvm/Target/TargetMachine.h"
#include "llvm/Target/TargetRegistry.h"
#include "llvm/Target/TargetSelect.h"
#include "llvm/Transforms/IPO.h"
#include "llvm/Transforms/Scalar.h"
#include "llvm/Support/CommandLine.h" #include "llvm/Support/CommandLine.h"
#include "llvm/Support/FormattedStream.h" #include "llvm/Support/FormattedStream.h"
#include "llvm/Support/MemoryBuffer.h" #include "llvm/Support/MemoryBuffer.h"
@ -35,16 +46,6 @@
#include "llvm/System/Host.h" #include "llvm/System/Host.h"
#include "llvm/System/Program.h" #include "llvm/System/Program.h"
#include "llvm/System/Signals.h" #include "llvm/System/Signals.h"
#include "llvm/Target/Mangler.h"
#include "llvm/Target/SubtargetFeature.h"
#include "llvm/Target/TargetOptions.h"
#include "llvm/MC/MCAsmInfo.h"
#include "llvm/Target/TargetData.h"
#include "llvm/Target/TargetMachine.h"
#include "llvm/Target/TargetRegistry.h"
#include "llvm/Target/TargetSelect.h"
#include "llvm/Transforms/IPO.h"
#include "llvm/Transforms/Scalar.h"
#include "llvm/Config/config.h" #include "llvm/Config/config.h"
#include <cstdlib> #include <cstdlib>
#include <unistd.h> #include <unistd.h>
@ -252,7 +253,8 @@ bool LTOCodeGenerator::assemble(const std::string& asmPath,
args.push_back(arch); args.push_back(arch);
} }
// add -static to assembler command line when code model requires // add -static to assembler command line when code model requires
if ( (_assemblerPath != NULL) && (_codeModel == LTO_CODEGEN_PIC_MODEL_STATIC) ) if ( (_assemblerPath != NULL) &&
(_codeModel == LTO_CODEGEN_PIC_MODEL_STATIC) )
args.push_back("-static"); args.push_back("-static");
} }
if ( needsCompilerOptions ) { if ( needsCompilerOptions ) {
@ -303,44 +305,44 @@ bool LTOCodeGenerator::determineTarget(std::string& errMsg)
// construct LTModule, hand over ownership of module and target // construct LTModule, hand over ownership of module and target
const std::string FeatureStr = const std::string FeatureStr =
SubtargetFeatures::getDefaultSubtargetFeatures(llvm::Triple(Triple)); SubtargetFeatures::getDefaultSubtargetFeatures(llvm::Triple(Triple));
_target = march->createTargetMachine(Triple, FeatureStr); _target = march->createTargetMachine(Triple, FeatureStr);
} }
return false; return false;
} }
void LTOCodeGenerator::applyScopeRestrictions() void LTOCodeGenerator::applyScopeRestrictions() {
{ if (_scopeRestrictionsDone) return;
if ( !_scopeRestrictionsDone ) { Module *mergedModule = _linker.getModule();
Module* mergedModule = _linker.getModule();
// Start off with a verification pass. // Start off with a verification pass.
PassManager passes; PassManager passes;
passes.add(createVerifierPass()); passes.add(createVerifierPass());
// mark which symbols can not be internalized // mark which symbols can not be internalized
if ( !_mustPreserveSymbols.empty() ) { if (!_mustPreserveSymbols.empty()) {
Mangler mangler(*_target->getMCAsmInfo()); MCContext Context(*_target->getMCAsmInfo());
std::vector<const char*> mustPreserveList; Mangler mangler(Context);
for (Module::iterator f = mergedModule->begin(), std::vector<const char*> mustPreserveList;
e = mergedModule->end(); f != e; ++f) { for (Module::iterator f = mergedModule->begin(),
if ( !f->isDeclaration() e = mergedModule->end(); f != e; ++f) {
&& _mustPreserveSymbols.count(mangler.getNameWithPrefix(f)) ) if (!f->isDeclaration() &&
mustPreserveList.push_back(::strdup(f->getNameStr().c_str())); _mustPreserveSymbols.count(mangler.getNameWithPrefix(f)))
} mustPreserveList.push_back(::strdup(f->getNameStr().c_str()));
for (Module::global_iterator v = mergedModule->global_begin(),
e = mergedModule->global_end(); v != e; ++v) {
if ( !v->isDeclaration()
&& _mustPreserveSymbols.count(mangler.getNameWithPrefix(v)) )
mustPreserveList.push_back(::strdup(v->getNameStr().c_str()));
}
passes.add(createInternalizePass(mustPreserveList));
}
// apply scope restrictions
passes.run(*mergedModule);
_scopeRestrictionsDone = true;
} }
for (Module::global_iterator v = mergedModule->global_begin(),
e = mergedModule->global_end(); v != e; ++v) {
if (v->isDeclaration() &&
_mustPreserveSymbols.count(mangler.getNameWithPrefix(v)))
mustPreserveList.push_back(::strdup(v->getNameStr().c_str()));
}
passes.add(createInternalizePass(mustPreserveList));
}
// apply scope restrictions
passes.run(*mergedModule);
_scopeRestrictionsDone = true;
} }
/// Optimize merged modules using various IPO passes /// Optimize merged modules using various IPO passes

View File

@ -1,4 +1,4 @@
//===-LTOModule.cpp - LLVM Link Time Optimizer ----------------------------===// //===-- LTOModule.cpp - LLVM Link Time Optimizer --------------------------===//
// //
// The LLVM Compiler Infrastructure // The LLVM Compiler Infrastructure
// //
@ -29,6 +29,7 @@
#include "llvm/Target/Mangler.h" #include "llvm/Target/Mangler.h"
#include "llvm/Target/SubtargetFeature.h" #include "llvm/Target/SubtargetFeature.h"
#include "llvm/MC/MCAsmInfo.h" #include "llvm/MC/MCAsmInfo.h"
#include "llvm/MC/MCContext.h"
#include "llvm/Target/TargetMachine.h" #include "llvm/Target/TargetMachine.h"
#include "llvm/Target/TargetRegistry.h" #include "llvm/Target/TargetRegistry.h"
#include "llvm/Target/TargetSelect.h" #include "llvm/Target/TargetSelect.h"
@ -437,7 +438,8 @@ void LTOModule::lazyParseSymbols()
_symbolsParsed = true; _symbolsParsed = true;
// Use mangler to add GlobalPrefix to names to match linker names. // Use mangler to add GlobalPrefix to names to match linker names.
Mangler mangler(*_target->getMCAsmInfo()); MCContext Context(*_target->getMCAsmInfo());
Mangler mangler(Context);
// add functions // add functions
for (Module::iterator f = _module->begin(); f != _module->end(); ++f) { for (Module::iterator f = _module->begin(); f != _module->end(); ++f) {