mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-05-24 18:38:50 +00:00
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:
parent
fdab14b105
commit
5ef31a039d
@ -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; }
|
||||||
|
@ -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
|
||||||
|
@ -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);
|
||||||
|
@ -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
|
||||||
// ----------
|
// ----------
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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.
|
||||||
|
@ -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.
|
||||||
|
@ -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
|
||||||
|
@ -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) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user