mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-01-02 17:09:05 +00:00
eliminate the string form of DecorateCygMingName
llvm-svn: 98373
This commit is contained in:
parent
2fd7c89502
commit
63328f1348
@ -61,7 +61,8 @@ MCSymbol *X86AsmPrinter::GetGlobalValueSymbol(const GlobalValue *GV) const {
|
||||
|
||||
X86COFFMachineModuleInfo &COFFMMI =
|
||||
MMI->getObjFileInfo<X86COFFMachineModuleInfo>();
|
||||
COFFMMI.DecorateCygMingName(Symb, OutContext, GV, *TM.getTargetData());
|
||||
COFFMMI.DecorateCygMingName(Symb, OutContext, cast<Function>(GV),
|
||||
*TM.getTargetData());
|
||||
|
||||
return Symb;
|
||||
}
|
||||
|
@ -23,6 +23,7 @@
|
||||
#include "llvm/MC/MCExpr.h"
|
||||
#include "llvm/MC/MCInst.h"
|
||||
#include "llvm/MC/MCStreamer.h"
|
||||
#include "llvm/MC/MCSymbol.h"
|
||||
#include "llvm/Target/Mangler.h"
|
||||
#include "llvm/Support/FormattedStream.h"
|
||||
#include "llvm/ADT/SmallString.h"
|
||||
@ -54,7 +55,21 @@ GetSymbolFromOperand(const MachineOperand &MO) const {
|
||||
|
||||
SmallString<128> Name;
|
||||
|
||||
if (MO.isGlobal()) {
|
||||
if (!MO.isGlobal()) {
|
||||
assert(MO.isSymbol());
|
||||
Name += AsmPrinter.MAI->getGlobalPrefix();
|
||||
Name += MO.getSymbolName();
|
||||
} else if (getSubtarget().isTargetCygMing() &&
|
||||
isa<Function>(MO.getGlobal())) {
|
||||
const GlobalValue *GV = MO.getGlobal();
|
||||
MCSymbol *Sym = Mang->getSymbol(GV);
|
||||
X86COFFMachineModuleInfo &COFFMMI =
|
||||
AsmPrinter.MMI->getObjFileInfo<X86COFFMachineModuleInfo>();
|
||||
COFFMMI.DecorateCygMingName(Sym, Ctx, cast<Function>(GV),
|
||||
*AsmPrinter.TM.getTargetData());
|
||||
Name.append(Sym->getName().begin(), Sym->getName().end());
|
||||
} else {
|
||||
const GlobalValue *GV = MO.getGlobal();
|
||||
bool isImplicitlyPrivate = false;
|
||||
if (MO.getTargetFlags() == X86II::MO_DARWIN_STUB ||
|
||||
MO.getTargetFlags() == X86II::MO_DARWIN_NONLAZY ||
|
||||
@ -62,18 +77,7 @@ GetSymbolFromOperand(const MachineOperand &MO) const {
|
||||
MO.getTargetFlags() == X86II::MO_DARWIN_HIDDEN_NONLAZY_PIC_BASE)
|
||||
isImplicitlyPrivate = true;
|
||||
|
||||
const GlobalValue *GV = MO.getGlobal();
|
||||
Mang->getNameWithPrefix(Name, GV, isImplicitlyPrivate);
|
||||
|
||||
if (getSubtarget().isTargetCygMing()) {
|
||||
X86COFFMachineModuleInfo &COFFMMI =
|
||||
AsmPrinter.MMI->getObjFileInfo<X86COFFMachineModuleInfo>();
|
||||
COFFMMI.DecorateCygMingName(Name, GV, *AsmPrinter.TM.getTargetData());
|
||||
}
|
||||
} else {
|
||||
assert(MO.isSymbol());
|
||||
Name += AsmPrinter.MAI->getGlobalPrefix();
|
||||
Name += MO.getSymbolName();
|
||||
}
|
||||
|
||||
// If the target flags on the operand changes the name of the symbol, do that
|
||||
|
@ -22,65 +22,50 @@
|
||||
#include "llvm/Support/raw_ostream.h"
|
||||
using namespace llvm;
|
||||
|
||||
X86COFFMachineModuleInfo::X86COFFMachineModuleInfo(const MachineModuleInfo &) {
|
||||
}
|
||||
|
||||
X86COFFMachineModuleInfo::~X86COFFMachineModuleInfo() {
|
||||
}
|
||||
|
||||
void X86COFFMachineModuleInfo::addExternalFunction(const StringRef& Name) {
|
||||
CygMingStubs.insert(Name);
|
||||
}
|
||||
|
||||
/// DecorateCygMingName - Apply various name decorations if the function uses
|
||||
/// stdcall or fastcall calling convention.
|
||||
void X86COFFMachineModuleInfo::DecorateCygMingName(SmallVectorImpl<char> &Name,
|
||||
const GlobalValue *GV,
|
||||
/// DecorateCygMingName - Query FunctionInfoMap and use this information for
|
||||
/// various name decorations for Cygwin and MingW.
|
||||
void X86COFFMachineModuleInfo::DecorateCygMingName(MCSymbol *&NameSym,
|
||||
MCContext &Ctx,
|
||||
const Function *F,
|
||||
const TargetData &TD) {
|
||||
const Function *F = dyn_cast<Function>(GV);
|
||||
if (!F) return;
|
||||
|
||||
SmallString<128> Name(NameSym->getName().begin(), NameSym->getName().end());
|
||||
|
||||
// We don't want to decorate non-stdcall or non-fastcall functions right now
|
||||
CallingConv::ID CC = F->getCallingConv();
|
||||
if (CC != CallingConv::X86_StdCall && CC != CallingConv::X86_FastCall)
|
||||
return;
|
||||
|
||||
|
||||
unsigned ArgWords = 0;
|
||||
|
||||
// Calculate arguments sizes
|
||||
for (Function::const_arg_iterator AI = F->arg_begin(), AE = F->arg_end();
|
||||
AI != AE; ++AI) {
|
||||
const Type *Ty = AI->getType();
|
||||
|
||||
|
||||
// 'Dereference' type in case of byval parameter attribute
|
||||
if (AI->hasByValAttr())
|
||||
Ty = cast<PointerType>(Ty)->getElementType();
|
||||
|
||||
|
||||
// Size should be aligned to DWORD boundary
|
||||
ArgWords += ((TD.getTypeAllocSize(Ty) + 3)/4)*4;
|
||||
}
|
||||
|
||||
|
||||
const FunctionType *FT = F->getFunctionType();
|
||||
// "Pure" variadic functions do not receive @0 suffix.
|
||||
if (!FT->isVarArg() || FT->getNumParams() == 0 ||
|
||||
(FT->getNumParams() == 1 && F->hasStructRetAttr()))
|
||||
raw_svector_ostream(Name) << '@' << ArgWords;
|
||||
|
||||
|
||||
if (CC == CallingConv::X86_FastCall) {
|
||||
if (Name[0] == '_')
|
||||
Name[0] = '@';
|
||||
else
|
||||
Name.insert(Name.begin(), '@');
|
||||
}
|
||||
}
|
||||
|
||||
/// DecorateCygMingName - Query FunctionInfoMap and use this information for
|
||||
/// various name decorations for Cygwin and MingW.
|
||||
void X86COFFMachineModuleInfo::DecorateCygMingName(MCSymbol *&Name,
|
||||
MCContext &Ctx,
|
||||
const GlobalValue *GV,
|
||||
const TargetData &TD) {
|
||||
SmallString<128> NameStr(Name->getName().begin(), Name->getName().end());
|
||||
DecorateCygMingName(NameStr, GV, TD);
|
||||
|
||||
Name = Ctx.GetOrCreateSymbol(NameStr.str());
|
||||
|
||||
NameSym = Ctx.GetOrCreateSymbol(Name.str());
|
||||
}
|
||||
|
@ -27,15 +27,16 @@ namespace llvm {
|
||||
class X86COFFMachineModuleInfo : public MachineModuleInfoImpl {
|
||||
StringSet<> CygMingStubs;
|
||||
public:
|
||||
X86COFFMachineModuleInfo(const MachineModuleInfo &);
|
||||
~X86COFFMachineModuleInfo();
|
||||
X86COFFMachineModuleInfo(const MachineModuleInfo &) {}
|
||||
virtual ~X86COFFMachineModuleInfo();
|
||||
|
||||
void DecorateCygMingName(MCSymbol* &Name, MCContext &Ctx,
|
||||
const GlobalValue *GV, const TargetData &TD);
|
||||
void DecorateCygMingName(SmallVectorImpl<char> &Name, const GlobalValue *GV,
|
||||
const TargetData &TD);
|
||||
void DecorateCygMingName(MCSymbol *&Name, MCContext &Ctx,
|
||||
const Function *F, const TargetData &TD);
|
||||
|
||||
void addExternalFunction(const StringRef& Name);
|
||||
void addExternalFunction(StringRef Name) {
|
||||
CygMingStubs.insert(Name);
|
||||
}
|
||||
|
||||
typedef StringSet<>::const_iterator stub_iterator;
|
||||
stub_iterator stub_begin() const { return CygMingStubs.begin(); }
|
||||
stub_iterator stub_end() const { return CygMingStubs.end(); }
|
||||
|
Loading…
Reference in New Issue
Block a user