mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-08-22 10:29:35 +00:00
rename TAI -> MAI, being careful not to make MAILJMP instructions :)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@79777 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
90aa1f92c1
commit
33adcfb4d2
@ -96,7 +96,7 @@ namespace llvm {
|
|||||||
|
|
||||||
/// Target Asm Printer information.
|
/// Target Asm Printer information.
|
||||||
///
|
///
|
||||||
const MCAsmInfo *TAI;
|
const MCAsmInfo *MAI;
|
||||||
|
|
||||||
/// Target Register Information.
|
/// Target Register Information.
|
||||||
///
|
///
|
||||||
|
@ -63,10 +63,10 @@ namespace llvm {
|
|||||||
|
|
||||||
/// beginAssembly/finishAssembly - Emit module metadata as assembly code.
|
/// beginAssembly/finishAssembly - Emit module metadata as assembly code.
|
||||||
virtual void beginAssembly(raw_ostream &OS, AsmPrinter &AP,
|
virtual void beginAssembly(raw_ostream &OS, AsmPrinter &AP,
|
||||||
const MCAsmInfo &TAI);
|
const MCAsmInfo &MAI);
|
||||||
|
|
||||||
virtual void finishAssembly(raw_ostream &OS, AsmPrinter &AP,
|
virtual void finishAssembly(raw_ostream &OS, AsmPrinter &AP,
|
||||||
const MCAsmInfo &TAI);
|
const MCAsmInfo &MAI);
|
||||||
|
|
||||||
virtual ~GCMetadataPrinter();
|
virtual ~GCMetadataPrinter();
|
||||||
};
|
};
|
||||||
|
@ -37,7 +37,7 @@ namespace llvm {
|
|||||||
|
|
||||||
SectionKind getKind() const { return Kind; }
|
SectionKind getKind() const { return Kind; }
|
||||||
|
|
||||||
virtual void PrintSwitchToSection(const MCAsmInfo &TAI,
|
virtual void PrintSwitchToSection(const MCAsmInfo &MAI,
|
||||||
raw_ostream &OS) const = 0;
|
raw_ostream &OS) const = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -62,7 +62,7 @@ namespace llvm {
|
|||||||
const std::string &getName() const { return Name; }
|
const std::string &getName() const { return Name; }
|
||||||
bool isDirective() const { return IsDirective; }
|
bool isDirective() const { return IsDirective; }
|
||||||
|
|
||||||
virtual void PrintSwitchToSection(const MCAsmInfo &TAI,
|
virtual void PrintSwitchToSection(const MCAsmInfo &MAI,
|
||||||
raw_ostream &OS) const;
|
raw_ostream &OS) const;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -48,7 +48,7 @@ public:
|
|||||||
/// ShouldOmitSectionDirective - Decides whether a '.section' directive
|
/// ShouldOmitSectionDirective - Decides whether a '.section' directive
|
||||||
/// should be printed before the section name
|
/// should be printed before the section name
|
||||||
bool ShouldOmitSectionDirective(const char *Name,
|
bool ShouldOmitSectionDirective(const char *Name,
|
||||||
const MCAsmInfo &TAI) const;
|
const MCAsmInfo &MAI) const;
|
||||||
|
|
||||||
/// ShouldPrintSectionType - Only prints the section type if supported
|
/// ShouldPrintSectionType - Only prints the section type if supported
|
||||||
bool ShouldPrintSectionType(unsigned Ty) const;
|
bool ShouldPrintSectionType(unsigned Ty) const;
|
||||||
@ -171,7 +171,7 @@ public:
|
|||||||
unsigned getType() const { return Type; }
|
unsigned getType() const { return Type; }
|
||||||
unsigned getFlags() const { return Flags; }
|
unsigned getFlags() const { return Flags; }
|
||||||
|
|
||||||
virtual void PrintSwitchToSection(const MCAsmInfo &TAI,
|
virtual void PrintSwitchToSection(const MCAsmInfo &MAI,
|
||||||
raw_ostream &OS) const;
|
raw_ostream &OS) const;
|
||||||
|
|
||||||
|
|
||||||
@ -179,7 +179,7 @@ public:
|
|||||||
/// MCSectionELF subclasses with target specific section flags should
|
/// MCSectionELF subclasses with target specific section flags should
|
||||||
/// implement this method if they end up adding letters to the attributes
|
/// implement this method if they end up adding letters to the attributes
|
||||||
/// list.
|
/// list.
|
||||||
virtual void PrintTargetSpecificSectionFlags(const MCAsmInfo &TAI,
|
virtual void PrintTargetSpecificSectionFlags(const MCAsmInfo &MAI,
|
||||||
raw_ostream &OS) const {
|
raw_ostream &OS) const {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -166,7 +166,7 @@ public:
|
|||||||
unsigned &TAA, // Out.
|
unsigned &TAA, // Out.
|
||||||
unsigned &StubSize); // Out.
|
unsigned &StubSize); // Out.
|
||||||
|
|
||||||
virtual void PrintSwitchToSection(const MCAsmInfo &TAI,
|
virtual void PrintSwitchToSection(const MCAsmInfo &MAI,
|
||||||
raw_ostream &OS) const;
|
raw_ostream &OS) const;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -241,7 +241,7 @@ namespace llvm {
|
|||||||
///
|
///
|
||||||
/// \arg AP - If given, an AsmPrinter to use for printing instructions.
|
/// \arg AP - If given, an AsmPrinter to use for printing instructions.
|
||||||
MCStreamer *createAsmStreamer(MCContext &Ctx, raw_ostream &OS,
|
MCStreamer *createAsmStreamer(MCContext &Ctx, raw_ostream &OS,
|
||||||
const MCAsmInfo &TAI, AsmPrinter *AP = 0);
|
const MCAsmInfo &MAI, AsmPrinter *AP = 0);
|
||||||
|
|
||||||
// FIXME: These two may end up getting rolled into a single
|
// FIXME: These two may end up getting rolled into a single
|
||||||
// createObjectStreamer interface, which implements the assembler backend, and
|
// createObjectStreamer interface, which implements the assembler backend, and
|
||||||
|
@ -464,7 +464,7 @@ public:
|
|||||||
/// Measure the specified inline asm to determine an approximation of its
|
/// Measure the specified inline asm to determine an approximation of its
|
||||||
/// length.
|
/// length.
|
||||||
virtual unsigned getInlineAsmLength(const char *Str,
|
virtual unsigned getInlineAsmLength(const char *Str,
|
||||||
const MCAsmInfo &TAI) const;
|
const MCAsmInfo &MAI) const;
|
||||||
};
|
};
|
||||||
|
|
||||||
/// TargetInstrInfoImpl - This is the default implementation of
|
/// TargetInstrInfoImpl - This is the default implementation of
|
||||||
|
@ -53,7 +53,7 @@ namespace llvm {
|
|||||||
const std::string &Features);
|
const std::string &Features);
|
||||||
typedef AsmPrinter *(*AsmPrinterCtorTy)(formatted_raw_ostream &OS,
|
typedef AsmPrinter *(*AsmPrinterCtorTy)(formatted_raw_ostream &OS,
|
||||||
TargetMachine &TM,
|
TargetMachine &TM,
|
||||||
const MCAsmInfo *TAI,
|
const MCAsmInfo *MAI,
|
||||||
bool VerboseAsm);
|
bool VerboseAsm);
|
||||||
typedef TargetAsmParser *(*AsmParserCtorTy)(const Target &T,
|
typedef TargetAsmParser *(*AsmParserCtorTy)(const Target &T,
|
||||||
MCAsmParser &P);
|
MCAsmParser &P);
|
||||||
@ -140,10 +140,10 @@ namespace llvm {
|
|||||||
|
|
||||||
/// createAsmPrinter - Create a target specific assembly printer pass.
|
/// createAsmPrinter - Create a target specific assembly printer pass.
|
||||||
AsmPrinter *createAsmPrinter(formatted_raw_ostream &OS, TargetMachine &TM,
|
AsmPrinter *createAsmPrinter(formatted_raw_ostream &OS, TargetMachine &TM,
|
||||||
const MCAsmInfo *TAI, bool Verbose) const {
|
const MCAsmInfo *MAI, bool Verbose) const {
|
||||||
if (!AsmPrinterCtorFn)
|
if (!AsmPrinterCtorFn)
|
||||||
return 0;
|
return 0;
|
||||||
return AsmPrinterCtorFn(OS, TM, TAI, Verbose);
|
return AsmPrinterCtorFn(OS, TM, MAI, Verbose);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// createAsmParser - Create a target specific assembly parser.
|
/// createAsmParser - Create a target specific assembly parser.
|
||||||
@ -406,8 +406,8 @@ namespace llvm {
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
static AsmPrinter *Allocator(formatted_raw_ostream &OS, TargetMachine &TM,
|
static AsmPrinter *Allocator(formatted_raw_ostream &OS, TargetMachine &TM,
|
||||||
const MCAsmInfo *TAI, bool Verbose) {
|
const MCAsmInfo *MAI, bool Verbose) {
|
||||||
return new AsmPrinterImpl(OS, TM, TAI, Verbose);
|
return new AsmPrinterImpl(OS, TM, MAI, Verbose);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -52,7 +52,7 @@ char AsmPrinter::ID = 0;
|
|||||||
AsmPrinter::AsmPrinter(formatted_raw_ostream &o, TargetMachine &tm,
|
AsmPrinter::AsmPrinter(formatted_raw_ostream &o, TargetMachine &tm,
|
||||||
const MCAsmInfo *T, bool VDef)
|
const MCAsmInfo *T, bool VDef)
|
||||||
: MachineFunctionPass(&ID), FunctionNumber(0), O(o),
|
: MachineFunctionPass(&ID), FunctionNumber(0), O(o),
|
||||||
TM(tm), TAI(T), TRI(tm.getRegisterInfo()),
|
TM(tm), MAI(T), TRI(tm.getRegisterInfo()),
|
||||||
|
|
||||||
OutContext(*new MCContext()),
|
OutContext(*new MCContext()),
|
||||||
OutStreamer(*createAsmStreamer(OutContext, O, *T, this)),
|
OutStreamer(*createAsmStreamer(OutContext, O, *T, this)),
|
||||||
@ -99,16 +99,16 @@ bool AsmPrinter::doInitialization(Module &M) {
|
|||||||
const_cast<TargetLoweringObjectFile&>(getObjFileLowering())
|
const_cast<TargetLoweringObjectFile&>(getObjFileLowering())
|
||||||
.Initialize(OutContext, TM);
|
.Initialize(OutContext, TM);
|
||||||
|
|
||||||
Mang = new Mangler(M, TAI->getGlobalPrefix(), TAI->getPrivateGlobalPrefix(),
|
Mang = new Mangler(M, MAI->getGlobalPrefix(), MAI->getPrivateGlobalPrefix(),
|
||||||
TAI->getLinkerPrivateGlobalPrefix());
|
MAI->getLinkerPrivateGlobalPrefix());
|
||||||
|
|
||||||
if (TAI->doesAllowQuotesInName())
|
if (MAI->doesAllowQuotesInName())
|
||||||
Mang->setUseQuotes(true);
|
Mang->setUseQuotes(true);
|
||||||
|
|
||||||
GCModuleInfo *MI = getAnalysisIfAvailable<GCModuleInfo>();
|
GCModuleInfo *MI = getAnalysisIfAvailable<GCModuleInfo>();
|
||||||
assert(MI && "AsmPrinter didn't require GCModuleInfo?");
|
assert(MI && "AsmPrinter didn't require GCModuleInfo?");
|
||||||
|
|
||||||
if (TAI->hasSingleParameterDotFile()) {
|
if (MAI->hasSingleParameterDotFile()) {
|
||||||
/* Very minimal debug info. It is ignored if we emit actual
|
/* Very minimal debug info. It is ignored if we emit actual
|
||||||
debug info. If we don't, this at helps the user find where
|
debug info. If we don't, this at helps the user find where
|
||||||
a function came from. */
|
a function came from. */
|
||||||
@ -117,22 +117,22 @@ bool AsmPrinter::doInitialization(Module &M) {
|
|||||||
|
|
||||||
for (GCModuleInfo::iterator I = MI->begin(), E = MI->end(); I != E; ++I)
|
for (GCModuleInfo::iterator I = MI->begin(), E = MI->end(); I != E; ++I)
|
||||||
if (GCMetadataPrinter *MP = GetOrCreateGCPrinter(*I))
|
if (GCMetadataPrinter *MP = GetOrCreateGCPrinter(*I))
|
||||||
MP->beginAssembly(O, *this, *TAI);
|
MP->beginAssembly(O, *this, *MAI);
|
||||||
|
|
||||||
if (!M.getModuleInlineAsm().empty())
|
if (!M.getModuleInlineAsm().empty())
|
||||||
O << TAI->getCommentString() << " Start of file scope inline assembly\n"
|
O << MAI->getCommentString() << " Start of file scope inline assembly\n"
|
||||||
<< M.getModuleInlineAsm()
|
<< M.getModuleInlineAsm()
|
||||||
<< '\n' << TAI->getCommentString()
|
<< '\n' << MAI->getCommentString()
|
||||||
<< " End of file scope inline assembly\n";
|
<< " End of file scope inline assembly\n";
|
||||||
|
|
||||||
if (TAI->doesSupportDebugInformation() ||
|
if (MAI->doesSupportDebugInformation() ||
|
||||||
TAI->doesSupportExceptionHandling()) {
|
MAI->doesSupportExceptionHandling()) {
|
||||||
MMI = getAnalysisIfAvailable<MachineModuleInfo>();
|
MMI = getAnalysisIfAvailable<MachineModuleInfo>();
|
||||||
if (MMI)
|
if (MMI)
|
||||||
MMI->AnalyzeModule(M);
|
MMI->AnalyzeModule(M);
|
||||||
DW = getAnalysisIfAvailable<DwarfWriter>();
|
DW = getAnalysisIfAvailable<DwarfWriter>();
|
||||||
if (DW)
|
if (DW)
|
||||||
DW->BeginModule(&M, MMI, O, this, TAI);
|
DW->BeginModule(&M, MMI, O, this, MAI);
|
||||||
}
|
}
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
@ -145,11 +145,11 @@ bool AsmPrinter::doFinalization(Module &M) {
|
|||||||
PrintGlobalVariable(I);
|
PrintGlobalVariable(I);
|
||||||
|
|
||||||
// Emit final debug information.
|
// Emit final debug information.
|
||||||
if (TAI->doesSupportDebugInformation() || TAI->doesSupportExceptionHandling())
|
if (MAI->doesSupportDebugInformation() || MAI->doesSupportExceptionHandling())
|
||||||
DW->EndModule();
|
DW->EndModule();
|
||||||
|
|
||||||
// If the target wants to know about weak references, print them all.
|
// If the target wants to know about weak references, print them all.
|
||||||
if (TAI->getWeakRefDirective()) {
|
if (MAI->getWeakRefDirective()) {
|
||||||
// FIXME: This is not lazy, it would be nice to only print weak references
|
// FIXME: This is not lazy, it would be nice to only print weak references
|
||||||
// to stuff that is actually used. Note that doing so would require targets
|
// to stuff that is actually used. Note that doing so would require targets
|
||||||
// to notice uses in operands (due to constant exprs etc). This should
|
// to notice uses in operands (due to constant exprs etc). This should
|
||||||
@ -159,16 +159,16 @@ bool AsmPrinter::doFinalization(Module &M) {
|
|||||||
for (Module::const_global_iterator I = M.global_begin(), E = M.global_end();
|
for (Module::const_global_iterator I = M.global_begin(), E = M.global_end();
|
||||||
I != E; ++I) {
|
I != E; ++I) {
|
||||||
if (I->hasExternalWeakLinkage())
|
if (I->hasExternalWeakLinkage())
|
||||||
O << TAI->getWeakRefDirective() << Mang->getMangledName(I) << '\n';
|
O << MAI->getWeakRefDirective() << Mang->getMangledName(I) << '\n';
|
||||||
}
|
}
|
||||||
|
|
||||||
for (Module::const_iterator I = M.begin(), E = M.end(); I != E; ++I) {
|
for (Module::const_iterator I = M.begin(), E = M.end(); I != E; ++I) {
|
||||||
if (I->hasExternalWeakLinkage())
|
if (I->hasExternalWeakLinkage())
|
||||||
O << TAI->getWeakRefDirective() << Mang->getMangledName(I) << '\n';
|
O << MAI->getWeakRefDirective() << Mang->getMangledName(I) << '\n';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (TAI->getSetDirective()) {
|
if (MAI->getSetDirective()) {
|
||||||
O << '\n';
|
O << '\n';
|
||||||
for (Module::const_alias_iterator I = M.alias_begin(), E = M.alias_end();
|
for (Module::const_alias_iterator I = M.alias_begin(), E = M.alias_end();
|
||||||
I != E; ++I) {
|
I != E; ++I) {
|
||||||
@ -177,16 +177,16 @@ bool AsmPrinter::doFinalization(Module &M) {
|
|||||||
const GlobalValue *GV = cast<GlobalValue>(I->getAliasedGlobal());
|
const GlobalValue *GV = cast<GlobalValue>(I->getAliasedGlobal());
|
||||||
std::string Target = Mang->getMangledName(GV);
|
std::string Target = Mang->getMangledName(GV);
|
||||||
|
|
||||||
if (I->hasExternalLinkage() || !TAI->getWeakRefDirective())
|
if (I->hasExternalLinkage() || !MAI->getWeakRefDirective())
|
||||||
O << "\t.globl\t" << Name << '\n';
|
O << "\t.globl\t" << Name << '\n';
|
||||||
else if (I->hasWeakLinkage())
|
else if (I->hasWeakLinkage())
|
||||||
O << TAI->getWeakRefDirective() << Name << '\n';
|
O << MAI->getWeakRefDirective() << Name << '\n';
|
||||||
else if (!I->hasLocalLinkage())
|
else if (!I->hasLocalLinkage())
|
||||||
llvm_unreachable("Invalid alias linkage");
|
llvm_unreachable("Invalid alias linkage");
|
||||||
|
|
||||||
printVisibility(Name, I->getVisibility());
|
printVisibility(Name, I->getVisibility());
|
||||||
|
|
||||||
O << TAI->getSetDirective() << ' ' << Name << ", " << Target << '\n';
|
O << MAI->getSetDirective() << ' ' << Name << ", " << Target << '\n';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -194,14 +194,14 @@ bool AsmPrinter::doFinalization(Module &M) {
|
|||||||
assert(MI && "AsmPrinter didn't require GCModuleInfo?");
|
assert(MI && "AsmPrinter didn't require GCModuleInfo?");
|
||||||
for (GCModuleInfo::iterator I = MI->end(), E = MI->begin(); I != E; )
|
for (GCModuleInfo::iterator I = MI->end(), E = MI->begin(); I != E; )
|
||||||
if (GCMetadataPrinter *MP = GetOrCreateGCPrinter(*--I))
|
if (GCMetadataPrinter *MP = GetOrCreateGCPrinter(*--I))
|
||||||
MP->finishAssembly(O, *this, *TAI);
|
MP->finishAssembly(O, *this, *MAI);
|
||||||
|
|
||||||
// If we don't have any trampolines, then we don't require stack memory
|
// If we don't have any trampolines, then we don't require stack memory
|
||||||
// to be executable. Some targets have a directive to declare this.
|
// to be executable. Some targets have a directive to declare this.
|
||||||
Function *InitTrampolineIntrinsic = M.getFunction("llvm.init.trampoline");
|
Function *InitTrampolineIntrinsic = M.getFunction("llvm.init.trampoline");
|
||||||
if (!InitTrampolineIntrinsic || InitTrampolineIntrinsic->use_empty())
|
if (!InitTrampolineIntrinsic || InitTrampolineIntrinsic->use_empty())
|
||||||
if (TAI->getNonexecutableStackDirective())
|
if (MAI->getNonexecutableStackDirective())
|
||||||
O << TAI->getNonexecutableStackDirective() << '\n';
|
O << MAI->getNonexecutableStackDirective() << '\n';
|
||||||
|
|
||||||
delete Mang; Mang = 0;
|
delete Mang; Mang = 0;
|
||||||
DW = 0; MMI = 0;
|
DW = 0; MMI = 0;
|
||||||
@ -214,7 +214,7 @@ std::string
|
|||||||
AsmPrinter::getCurrentFunctionEHName(const MachineFunction *MF) const {
|
AsmPrinter::getCurrentFunctionEHName(const MachineFunction *MF) const {
|
||||||
assert(MF && "No machine function?");
|
assert(MF && "No machine function?");
|
||||||
return Mang->getMangledName(MF->getFunction(), ".eh",
|
return Mang->getMangledName(MF->getFunction(), ".eh",
|
||||||
TAI->is_EHSymbolPrivate());
|
MAI->is_EHSymbolPrivate());
|
||||||
}
|
}
|
||||||
|
|
||||||
void AsmPrinter::SetupMachineFunction(MachineFunction &MF) {
|
void AsmPrinter::SetupMachineFunction(MachineFunction &MF) {
|
||||||
@ -309,11 +309,11 @@ void AsmPrinter::EmitConstantPool(MachineConstantPool *MCP) {
|
|||||||
const Type *Ty = CPE.getType();
|
const Type *Ty = CPE.getType();
|
||||||
Offset = NewOffset + TM.getTargetData()->getTypeAllocSize(Ty);
|
Offset = NewOffset + TM.getTargetData()->getTypeAllocSize(Ty);
|
||||||
|
|
||||||
O << TAI->getPrivateGlobalPrefix() << "CPI" << getFunctionNumber() << '_'
|
O << MAI->getPrivateGlobalPrefix() << "CPI" << getFunctionNumber() << '_'
|
||||||
<< CPI << ':';
|
<< CPI << ':';
|
||||||
if (VerboseAsm) {
|
if (VerboseAsm) {
|
||||||
O.PadToColumn(TAI->getCommentColumn());
|
O.PadToColumn(MAI->getCommentColumn());
|
||||||
O << TAI->getCommentString() << " constant ";
|
O << MAI->getCommentString() << " constant ";
|
||||||
WriteTypeSymbolic(O, CPE.getType(), MF->getFunction()->getParent());
|
WriteTypeSymbolic(O, CPE.getType(), MF->getFunction()->getParent());
|
||||||
}
|
}
|
||||||
O << '\n';
|
O << '\n';
|
||||||
@ -369,7 +369,7 @@ void AsmPrinter::EmitJumpTableInfo(MachineJumpTableInfo *MJTI,
|
|||||||
// the number of relocations the assembler will generate for the jump table.
|
// the number of relocations the assembler will generate for the jump table.
|
||||||
// Set directives are all printed before the jump table itself.
|
// Set directives are all printed before the jump table itself.
|
||||||
SmallPtrSet<MachineBasicBlock*, 16> EmittedSets;
|
SmallPtrSet<MachineBasicBlock*, 16> EmittedSets;
|
||||||
if (TAI->getSetDirective() && IsPic)
|
if (MAI->getSetDirective() && IsPic)
|
||||||
for (unsigned ii = 0, ee = JTBBs.size(); ii != ee; ++ii)
|
for (unsigned ii = 0, ee = JTBBs.size(); ii != ee; ++ii)
|
||||||
if (EmittedSets.insert(JTBBs[ii]))
|
if (EmittedSets.insert(JTBBs[ii]))
|
||||||
printPICJumpTableSetLabel(i, JTBBs[ii]);
|
printPICJumpTableSetLabel(i, JTBBs[ii]);
|
||||||
@ -379,11 +379,11 @@ void AsmPrinter::EmitJumpTableInfo(MachineJumpTableInfo *MJTI,
|
|||||||
// the assembler and linker the extents of the jump table object. The
|
// the assembler and linker the extents of the jump table object. The
|
||||||
// second label is actually referenced by the code.
|
// second label is actually referenced by the code.
|
||||||
if (JTInDiffSection) {
|
if (JTInDiffSection) {
|
||||||
if (const char *JTLabelPrefix = TAI->getJumpTableSpecialLabelPrefix())
|
if (const char *JTLabelPrefix = MAI->getJumpTableSpecialLabelPrefix())
|
||||||
O << JTLabelPrefix << "JTI" << getFunctionNumber() << '_' << i << ":\n";
|
O << JTLabelPrefix << "JTI" << getFunctionNumber() << '_' << i << ":\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
O << TAI->getPrivateGlobalPrefix() << "JTI" << getFunctionNumber()
|
O << MAI->getPrivateGlobalPrefix() << "JTI" << getFunctionNumber()
|
||||||
<< '_' << i << ":\n";
|
<< '_' << i << ":\n";
|
||||||
|
|
||||||
for (unsigned ii = 0, ee = JTBBs.size(); ii != ee; ++ii) {
|
for (unsigned ii = 0, ee = JTBBs.size(); ii != ee; ++ii) {
|
||||||
@ -400,11 +400,11 @@ void AsmPrinter::printPICJumpTableEntry(const MachineJumpTableInfo *MJTI,
|
|||||||
|
|
||||||
// Use JumpTableDirective otherwise honor the entry size from the jump table
|
// Use JumpTableDirective otherwise honor the entry size from the jump table
|
||||||
// info.
|
// info.
|
||||||
const char *JTEntryDirective = TAI->getJumpTableDirective(isPIC);
|
const char *JTEntryDirective = MAI->getJumpTableDirective(isPIC);
|
||||||
bool HadJTEntryDirective = JTEntryDirective != NULL;
|
bool HadJTEntryDirective = JTEntryDirective != NULL;
|
||||||
if (!HadJTEntryDirective) {
|
if (!HadJTEntryDirective) {
|
||||||
JTEntryDirective = MJTI->getEntrySize() == 4 ?
|
JTEntryDirective = MJTI->getEntrySize() == 4 ?
|
||||||
TAI->getData32bitsDirective() : TAI->getData64bitsDirective();
|
MAI->getData32bitsDirective() : MAI->getData64bitsDirective();
|
||||||
}
|
}
|
||||||
|
|
||||||
O << JTEntryDirective << ' ';
|
O << JTEntryDirective << ' ';
|
||||||
@ -416,15 +416,15 @@ void AsmPrinter::printPICJumpTableEntry(const MachineJumpTableInfo *MJTI,
|
|||||||
// references to the target basic blocks.
|
// references to the target basic blocks.
|
||||||
if (!isPIC) {
|
if (!isPIC) {
|
||||||
printBasicBlockLabel(MBB, false, false, false);
|
printBasicBlockLabel(MBB, false, false, false);
|
||||||
} else if (TAI->getSetDirective()) {
|
} else if (MAI->getSetDirective()) {
|
||||||
O << TAI->getPrivateGlobalPrefix() << getFunctionNumber()
|
O << MAI->getPrivateGlobalPrefix() << getFunctionNumber()
|
||||||
<< '_' << uid << "_set_" << MBB->getNumber();
|
<< '_' << uid << "_set_" << MBB->getNumber();
|
||||||
} else {
|
} else {
|
||||||
printBasicBlockLabel(MBB, false, false, false);
|
printBasicBlockLabel(MBB, false, false, false);
|
||||||
// If the arch uses custom Jump Table directives, don't calc relative to
|
// If the arch uses custom Jump Table directives, don't calc relative to
|
||||||
// JT
|
// JT
|
||||||
if (!HadJTEntryDirective)
|
if (!HadJTEntryDirective)
|
||||||
O << '-' << TAI->getPrivateGlobalPrefix() << "JTI"
|
O << '-' << MAI->getPrivateGlobalPrefix() << "JTI"
|
||||||
<< getFunctionNumber() << '_' << uid;
|
<< getFunctionNumber() << '_' << uid;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -435,7 +435,7 @@ void AsmPrinter::printPICJumpTableEntry(const MachineJumpTableInfo *MJTI,
|
|||||||
/// do nothing and return false.
|
/// do nothing and return false.
|
||||||
bool AsmPrinter::EmitSpecialLLVMGlobal(const GlobalVariable *GV) {
|
bool AsmPrinter::EmitSpecialLLVMGlobal(const GlobalVariable *GV) {
|
||||||
if (GV->getName() == "llvm.used") {
|
if (GV->getName() == "llvm.used") {
|
||||||
if (TAI->getUsedDirective() != 0) // No need to emit this at all.
|
if (MAI->getUsedDirective() != 0) // No need to emit this at all.
|
||||||
EmitLLVMUsedList(GV->getInitializer());
|
EmitLLVMUsedList(GV->getInitializer());
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -468,11 +468,11 @@ bool AsmPrinter::EmitSpecialLLVMGlobal(const GlobalVariable *GV) {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// EmitLLVMUsedList - For targets that define a TAI::UsedDirective, mark each
|
/// EmitLLVMUsedList - For targets that define a MAI::UsedDirective, mark each
|
||||||
/// global in the specified llvm.used list for which emitUsedDirectiveFor
|
/// global in the specified llvm.used list for which emitUsedDirectiveFor
|
||||||
/// is true, as being used with this directive.
|
/// is true, as being used with this directive.
|
||||||
void AsmPrinter::EmitLLVMUsedList(Constant *List) {
|
void AsmPrinter::EmitLLVMUsedList(Constant *List) {
|
||||||
const char *Directive = TAI->getUsedDirective();
|
const char *Directive = MAI->getUsedDirective();
|
||||||
|
|
||||||
// Should be an array of 'i8*'.
|
// Should be an array of 'i8*'.
|
||||||
ConstantArray *InitList = dyn_cast<ConstantArray>(List);
|
ConstantArray *InitList = dyn_cast<ConstantArray>(List);
|
||||||
@ -513,13 +513,13 @@ void AsmPrinter::EmitXXStructorList(Constant *List) {
|
|||||||
const std::string &AsmPrinter::getGlobalLinkName(const GlobalVariable *GV,
|
const std::string &AsmPrinter::getGlobalLinkName(const GlobalVariable *GV,
|
||||||
std::string &LinkName) const {
|
std::string &LinkName) const {
|
||||||
if (isa<Function>(GV)) {
|
if (isa<Function>(GV)) {
|
||||||
LinkName += TAI->getFunctionAddrPrefix();
|
LinkName += MAI->getFunctionAddrPrefix();
|
||||||
LinkName += Mang->getMangledName(GV);
|
LinkName += Mang->getMangledName(GV);
|
||||||
LinkName += TAI->getFunctionAddrSuffix();
|
LinkName += MAI->getFunctionAddrSuffix();
|
||||||
} else {
|
} else {
|
||||||
LinkName += TAI->getGlobalVarAddrPrefix();
|
LinkName += MAI->getGlobalVarAddrPrefix();
|
||||||
LinkName += Mang->getMangledName(GV);
|
LinkName += Mang->getMangledName(GV);
|
||||||
LinkName += TAI->getGlobalVarAddrSuffix();
|
LinkName += MAI->getGlobalVarAddrSuffix();
|
||||||
}
|
}
|
||||||
|
|
||||||
return LinkName;
|
return LinkName;
|
||||||
@ -586,8 +586,8 @@ void AsmPrinter::EOL() const {
|
|||||||
|
|
||||||
void AsmPrinter::EOL(const std::string &Comment) const {
|
void AsmPrinter::EOL(const std::string &Comment) const {
|
||||||
if (VerboseAsm && !Comment.empty()) {
|
if (VerboseAsm && !Comment.empty()) {
|
||||||
O.PadToColumn(TAI->getCommentColumn());
|
O.PadToColumn(MAI->getCommentColumn());
|
||||||
O << TAI->getCommentString()
|
O << MAI->getCommentString()
|
||||||
<< ' '
|
<< ' '
|
||||||
<< Comment;
|
<< Comment;
|
||||||
}
|
}
|
||||||
@ -596,8 +596,8 @@ void AsmPrinter::EOL(const std::string &Comment) const {
|
|||||||
|
|
||||||
void AsmPrinter::EOL(const char* Comment) const {
|
void AsmPrinter::EOL(const char* Comment) const {
|
||||||
if (VerboseAsm && *Comment) {
|
if (VerboseAsm && *Comment) {
|
||||||
O.PadToColumn(TAI->getCommentColumn());
|
O.PadToColumn(MAI->getCommentColumn());
|
||||||
O << TAI->getCommentString()
|
O << MAI->getCommentString()
|
||||||
<< ' '
|
<< ' '
|
||||||
<< Comment;
|
<< Comment;
|
||||||
}
|
}
|
||||||
@ -607,11 +607,11 @@ void AsmPrinter::EOL(const char* Comment) const {
|
|||||||
/// EmitULEB128Bytes - Emit an assembler byte data directive to compose an
|
/// EmitULEB128Bytes - Emit an assembler byte data directive to compose an
|
||||||
/// unsigned leb128 value.
|
/// unsigned leb128 value.
|
||||||
void AsmPrinter::EmitULEB128Bytes(unsigned Value) const {
|
void AsmPrinter::EmitULEB128Bytes(unsigned Value) const {
|
||||||
if (TAI->hasLEB128()) {
|
if (MAI->hasLEB128()) {
|
||||||
O << "\t.uleb128\t"
|
O << "\t.uleb128\t"
|
||||||
<< Value;
|
<< Value;
|
||||||
} else {
|
} else {
|
||||||
O << TAI->getData8bitsDirective();
|
O << MAI->getData8bitsDirective();
|
||||||
PrintULEB128(Value);
|
PrintULEB128(Value);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -619,11 +619,11 @@ void AsmPrinter::EmitULEB128Bytes(unsigned Value) const {
|
|||||||
/// EmitSLEB128Bytes - print an assembler byte data directive to compose a
|
/// EmitSLEB128Bytes - print an assembler byte data directive to compose a
|
||||||
/// signed leb128 value.
|
/// signed leb128 value.
|
||||||
void AsmPrinter::EmitSLEB128Bytes(int Value) const {
|
void AsmPrinter::EmitSLEB128Bytes(int Value) const {
|
||||||
if (TAI->hasLEB128()) {
|
if (MAI->hasLEB128()) {
|
||||||
O << "\t.sleb128\t"
|
O << "\t.sleb128\t"
|
||||||
<< Value;
|
<< Value;
|
||||||
} else {
|
} else {
|
||||||
O << TAI->getData8bitsDirective();
|
O << MAI->getData8bitsDirective();
|
||||||
PrintSLEB128(Value);
|
PrintSLEB128(Value);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -631,29 +631,29 @@ void AsmPrinter::EmitSLEB128Bytes(int Value) const {
|
|||||||
/// EmitInt8 - Emit a byte directive and value.
|
/// EmitInt8 - Emit a byte directive and value.
|
||||||
///
|
///
|
||||||
void AsmPrinter::EmitInt8(int Value) const {
|
void AsmPrinter::EmitInt8(int Value) const {
|
||||||
O << TAI->getData8bitsDirective();
|
O << MAI->getData8bitsDirective();
|
||||||
PrintHex(Value & 0xFF);
|
PrintHex(Value & 0xFF);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// EmitInt16 - Emit a short directive and value.
|
/// EmitInt16 - Emit a short directive and value.
|
||||||
///
|
///
|
||||||
void AsmPrinter::EmitInt16(int Value) const {
|
void AsmPrinter::EmitInt16(int Value) const {
|
||||||
O << TAI->getData16bitsDirective();
|
O << MAI->getData16bitsDirective();
|
||||||
PrintHex(Value & 0xFFFF);
|
PrintHex(Value & 0xFFFF);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// EmitInt32 - Emit a long directive and value.
|
/// EmitInt32 - Emit a long directive and value.
|
||||||
///
|
///
|
||||||
void AsmPrinter::EmitInt32(int Value) const {
|
void AsmPrinter::EmitInt32(int Value) const {
|
||||||
O << TAI->getData32bitsDirective();
|
O << MAI->getData32bitsDirective();
|
||||||
PrintHex(Value);
|
PrintHex(Value);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// EmitInt64 - Emit a long long directive and value.
|
/// EmitInt64 - Emit a long long directive and value.
|
||||||
///
|
///
|
||||||
void AsmPrinter::EmitInt64(uint64_t Value) const {
|
void AsmPrinter::EmitInt64(uint64_t Value) const {
|
||||||
if (TAI->getData64bitsDirective()) {
|
if (MAI->getData64bitsDirective()) {
|
||||||
O << TAI->getData64bitsDirective();
|
O << MAI->getData64bitsDirective();
|
||||||
PrintHex(Value);
|
PrintHex(Value);
|
||||||
} else {
|
} else {
|
||||||
if (TM.getTargetData()->isBigEndian()) {
|
if (TM.getTargetData()->isBigEndian()) {
|
||||||
@ -706,11 +706,11 @@ void AsmPrinter::EmitString(const std::string &String) const {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void AsmPrinter::EmitString(const char *String, unsigned Size) const {
|
void AsmPrinter::EmitString(const char *String, unsigned Size) const {
|
||||||
const char* AscizDirective = TAI->getAscizDirective();
|
const char* AscizDirective = MAI->getAscizDirective();
|
||||||
if (AscizDirective)
|
if (AscizDirective)
|
||||||
O << AscizDirective;
|
O << AscizDirective;
|
||||||
else
|
else
|
||||||
O << TAI->getAsciiDirective();
|
O << MAI->getAsciiDirective();
|
||||||
O << '\"';
|
O << '\"';
|
||||||
for (unsigned i = 0; i < Size; ++i)
|
for (unsigned i = 0; i < Size; ++i)
|
||||||
printStringChar(O, String[i]);
|
printStringChar(O, String[i]);
|
||||||
@ -756,7 +756,7 @@ void AsmPrinter::EmitAlignment(unsigned NumBits, const GlobalValue *GV,
|
|||||||
|
|
||||||
unsigned FillValue = 0;
|
unsigned FillValue = 0;
|
||||||
if (getCurrentSection()->getKind().isText())
|
if (getCurrentSection()->getKind().isText())
|
||||||
FillValue = TAI->getTextAlignFillValue();
|
FillValue = MAI->getTextAlignFillValue();
|
||||||
|
|
||||||
OutStreamer.EmitValueToAlignment(1 << NumBits, FillValue, 1, 0);
|
OutStreamer.EmitValueToAlignment(1 << NumBits, FillValue, 1, 0);
|
||||||
}
|
}
|
||||||
@ -765,14 +765,14 @@ void AsmPrinter::EmitAlignment(unsigned NumBits, const GlobalValue *GV,
|
|||||||
///
|
///
|
||||||
void AsmPrinter::EmitZeros(uint64_t NumZeros, unsigned AddrSpace) const {
|
void AsmPrinter::EmitZeros(uint64_t NumZeros, unsigned AddrSpace) const {
|
||||||
if (NumZeros) {
|
if (NumZeros) {
|
||||||
if (TAI->getZeroDirective()) {
|
if (MAI->getZeroDirective()) {
|
||||||
O << TAI->getZeroDirective() << NumZeros;
|
O << MAI->getZeroDirective() << NumZeros;
|
||||||
if (TAI->getZeroDirectiveSuffix())
|
if (MAI->getZeroDirectiveSuffix())
|
||||||
O << TAI->getZeroDirectiveSuffix();
|
O << MAI->getZeroDirectiveSuffix();
|
||||||
O << '\n';
|
O << '\n';
|
||||||
} else {
|
} else {
|
||||||
for (; NumZeros; --NumZeros)
|
for (; NumZeros; --NumZeros)
|
||||||
O << TAI->getData8bitsDirective(AddrSpace) << "0\n";
|
O << MAI->getData8bitsDirective(AddrSpace) << "0\n";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -790,13 +790,13 @@ void AsmPrinter::EmitConstantValueOnly(const Constant *CV) {
|
|||||||
// decorating it with GlobalVarAddrPrefix/Suffix or
|
// decorating it with GlobalVarAddrPrefix/Suffix or
|
||||||
// FunctionAddrPrefix/Suffix (these all default to "" )
|
// FunctionAddrPrefix/Suffix (these all default to "" )
|
||||||
if (isa<Function>(GV)) {
|
if (isa<Function>(GV)) {
|
||||||
O << TAI->getFunctionAddrPrefix()
|
O << MAI->getFunctionAddrPrefix()
|
||||||
<< Mang->getMangledName(GV)
|
<< Mang->getMangledName(GV)
|
||||||
<< TAI->getFunctionAddrSuffix();
|
<< MAI->getFunctionAddrSuffix();
|
||||||
} else {
|
} else {
|
||||||
O << TAI->getGlobalVarAddrPrefix()
|
O << MAI->getGlobalVarAddrPrefix()
|
||||||
<< Mang->getMangledName(GV)
|
<< Mang->getMangledName(GV)
|
||||||
<< TAI->getGlobalVarAddrSuffix();
|
<< MAI->getGlobalVarAddrSuffix();
|
||||||
}
|
}
|
||||||
} else if (const ConstantExpr *CE = dyn_cast<ConstantExpr>(CV)) {
|
} else if (const ConstantExpr *CE = dyn_cast<ConstantExpr>(CV)) {
|
||||||
const TargetData *TD = TM.getTargetData();
|
const TargetData *TD = TM.getTargetData();
|
||||||
@ -929,12 +929,12 @@ static void printAsCString(formatted_raw_ostream &O, const ConstantArray *CVA,
|
|||||||
///
|
///
|
||||||
void AsmPrinter::EmitString(const ConstantArray *CVA) const {
|
void AsmPrinter::EmitString(const ConstantArray *CVA) const {
|
||||||
unsigned NumElts = CVA->getNumOperands();
|
unsigned NumElts = CVA->getNumOperands();
|
||||||
if (TAI->getAscizDirective() && NumElts &&
|
if (MAI->getAscizDirective() && NumElts &&
|
||||||
cast<ConstantInt>(CVA->getOperand(NumElts-1))->getZExtValue() == 0) {
|
cast<ConstantInt>(CVA->getOperand(NumElts-1))->getZExtValue() == 0) {
|
||||||
O << TAI->getAscizDirective();
|
O << MAI->getAscizDirective();
|
||||||
printAsCString(O, CVA, NumElts-1);
|
printAsCString(O, CVA, NumElts-1);
|
||||||
} else {
|
} else {
|
||||||
O << TAI->getAsciiDirective();
|
O << MAI->getAsciiDirective();
|
||||||
printAsCString(O, CVA, NumElts);
|
printAsCString(O, CVA, NumElts);
|
||||||
}
|
}
|
||||||
O << '\n';
|
O << '\n';
|
||||||
@ -994,40 +994,40 @@ void AsmPrinter::EmitGlobalConstantFP(const ConstantFP *CFP,
|
|||||||
if (CFP->getType() == Type::getDoubleTy(Context)) {
|
if (CFP->getType() == Type::getDoubleTy(Context)) {
|
||||||
double Val = CFP->getValueAPF().convertToDouble(); // for comment only
|
double Val = CFP->getValueAPF().convertToDouble(); // for comment only
|
||||||
uint64_t i = CFP->getValueAPF().bitcastToAPInt().getZExtValue();
|
uint64_t i = CFP->getValueAPF().bitcastToAPInt().getZExtValue();
|
||||||
if (TAI->getData64bitsDirective(AddrSpace)) {
|
if (MAI->getData64bitsDirective(AddrSpace)) {
|
||||||
O << TAI->getData64bitsDirective(AddrSpace) << i;
|
O << MAI->getData64bitsDirective(AddrSpace) << i;
|
||||||
if (VerboseAsm) {
|
if (VerboseAsm) {
|
||||||
O.PadToColumn(TAI->getCommentColumn());
|
O.PadToColumn(MAI->getCommentColumn());
|
||||||
O << TAI->getCommentString() << " double " << Val;
|
O << MAI->getCommentString() << " double " << Val;
|
||||||
}
|
}
|
||||||
O << '\n';
|
O << '\n';
|
||||||
} else if (TD->isBigEndian()) {
|
} else if (TD->isBigEndian()) {
|
||||||
O << TAI->getData32bitsDirective(AddrSpace) << unsigned(i >> 32);
|
O << MAI->getData32bitsDirective(AddrSpace) << unsigned(i >> 32);
|
||||||
if (VerboseAsm) {
|
if (VerboseAsm) {
|
||||||
O.PadToColumn(TAI->getCommentColumn());
|
O.PadToColumn(MAI->getCommentColumn());
|
||||||
O << TAI->getCommentString()
|
O << MAI->getCommentString()
|
||||||
<< " most significant word of double " << Val;
|
<< " most significant word of double " << Val;
|
||||||
}
|
}
|
||||||
O << '\n';
|
O << '\n';
|
||||||
O << TAI->getData32bitsDirective(AddrSpace) << unsigned(i);
|
O << MAI->getData32bitsDirective(AddrSpace) << unsigned(i);
|
||||||
if (VerboseAsm) {
|
if (VerboseAsm) {
|
||||||
O.PadToColumn(TAI->getCommentColumn());
|
O.PadToColumn(MAI->getCommentColumn());
|
||||||
O << TAI->getCommentString()
|
O << MAI->getCommentString()
|
||||||
<< " least significant word of double " << Val;
|
<< " least significant word of double " << Val;
|
||||||
}
|
}
|
||||||
O << '\n';
|
O << '\n';
|
||||||
} else {
|
} else {
|
||||||
O << TAI->getData32bitsDirective(AddrSpace) << unsigned(i);
|
O << MAI->getData32bitsDirective(AddrSpace) << unsigned(i);
|
||||||
if (VerboseAsm) {
|
if (VerboseAsm) {
|
||||||
O.PadToColumn(TAI->getCommentColumn());
|
O.PadToColumn(MAI->getCommentColumn());
|
||||||
O << TAI->getCommentString()
|
O << MAI->getCommentString()
|
||||||
<< " least significant word of double " << Val;
|
<< " least significant word of double " << Val;
|
||||||
}
|
}
|
||||||
O << '\n';
|
O << '\n';
|
||||||
O << TAI->getData32bitsDirective(AddrSpace) << unsigned(i >> 32);
|
O << MAI->getData32bitsDirective(AddrSpace) << unsigned(i >> 32);
|
||||||
if (VerboseAsm) {
|
if (VerboseAsm) {
|
||||||
O.PadToColumn(TAI->getCommentColumn());
|
O.PadToColumn(MAI->getCommentColumn());
|
||||||
O << TAI->getCommentString()
|
O << MAI->getCommentString()
|
||||||
<< " most significant word of double " << Val;
|
<< " most significant word of double " << Val;
|
||||||
}
|
}
|
||||||
O << '\n';
|
O << '\n';
|
||||||
@ -1035,11 +1035,11 @@ void AsmPrinter::EmitGlobalConstantFP(const ConstantFP *CFP,
|
|||||||
return;
|
return;
|
||||||
} else if (CFP->getType() == Type::getFloatTy(Context)) {
|
} else if (CFP->getType() == Type::getFloatTy(Context)) {
|
||||||
float Val = CFP->getValueAPF().convertToFloat(); // for comment only
|
float Val = CFP->getValueAPF().convertToFloat(); // for comment only
|
||||||
O << TAI->getData32bitsDirective(AddrSpace)
|
O << MAI->getData32bitsDirective(AddrSpace)
|
||||||
<< CFP->getValueAPF().bitcastToAPInt().getZExtValue();
|
<< CFP->getValueAPF().bitcastToAPInt().getZExtValue();
|
||||||
if (VerboseAsm) {
|
if (VerboseAsm) {
|
||||||
O.PadToColumn(TAI->getCommentColumn());
|
O.PadToColumn(MAI->getCommentColumn());
|
||||||
O << TAI->getCommentString() << " float " << Val;
|
O << MAI->getCommentString() << " float " << Val;
|
||||||
}
|
}
|
||||||
O << '\n';
|
O << '\n';
|
||||||
return;
|
return;
|
||||||
@ -1054,73 +1054,73 @@ void AsmPrinter::EmitGlobalConstantFP(const ConstantFP *CFP,
|
|||||||
DoubleVal.convert(APFloat::IEEEdouble, APFloat::rmNearestTiesToEven,
|
DoubleVal.convert(APFloat::IEEEdouble, APFloat::rmNearestTiesToEven,
|
||||||
&ignored);
|
&ignored);
|
||||||
if (TD->isBigEndian()) {
|
if (TD->isBigEndian()) {
|
||||||
O << TAI->getData16bitsDirective(AddrSpace) << uint16_t(p[1]);
|
O << MAI->getData16bitsDirective(AddrSpace) << uint16_t(p[1]);
|
||||||
if (VerboseAsm) {
|
if (VerboseAsm) {
|
||||||
O.PadToColumn(TAI->getCommentColumn());
|
O.PadToColumn(MAI->getCommentColumn());
|
||||||
O << TAI->getCommentString()
|
O << MAI->getCommentString()
|
||||||
<< " most significant halfword of x86_fp80 ~"
|
<< " most significant halfword of x86_fp80 ~"
|
||||||
<< DoubleVal.convertToDouble();
|
<< DoubleVal.convertToDouble();
|
||||||
}
|
}
|
||||||
O << '\n';
|
O << '\n';
|
||||||
O << TAI->getData16bitsDirective(AddrSpace) << uint16_t(p[0] >> 48);
|
O << MAI->getData16bitsDirective(AddrSpace) << uint16_t(p[0] >> 48);
|
||||||
if (VerboseAsm) {
|
if (VerboseAsm) {
|
||||||
O.PadToColumn(TAI->getCommentColumn());
|
O.PadToColumn(MAI->getCommentColumn());
|
||||||
O << TAI->getCommentString() << " next halfword";
|
O << MAI->getCommentString() << " next halfword";
|
||||||
}
|
}
|
||||||
O << '\n';
|
O << '\n';
|
||||||
O << TAI->getData16bitsDirective(AddrSpace) << uint16_t(p[0] >> 32);
|
O << MAI->getData16bitsDirective(AddrSpace) << uint16_t(p[0] >> 32);
|
||||||
if (VerboseAsm) {
|
if (VerboseAsm) {
|
||||||
O.PadToColumn(TAI->getCommentColumn());
|
O.PadToColumn(MAI->getCommentColumn());
|
||||||
O << TAI->getCommentString() << " next halfword";
|
O << MAI->getCommentString() << " next halfword";
|
||||||
}
|
}
|
||||||
O << '\n';
|
O << '\n';
|
||||||
O << TAI->getData16bitsDirective(AddrSpace) << uint16_t(p[0] >> 16);
|
O << MAI->getData16bitsDirective(AddrSpace) << uint16_t(p[0] >> 16);
|
||||||
if (VerboseAsm) {
|
if (VerboseAsm) {
|
||||||
O.PadToColumn(TAI->getCommentColumn());
|
O.PadToColumn(MAI->getCommentColumn());
|
||||||
O << TAI->getCommentString() << " next halfword";
|
O << MAI->getCommentString() << " next halfword";
|
||||||
}
|
}
|
||||||
O << '\n';
|
O << '\n';
|
||||||
O << TAI->getData16bitsDirective(AddrSpace) << uint16_t(p[0]);
|
O << MAI->getData16bitsDirective(AddrSpace) << uint16_t(p[0]);
|
||||||
if (VerboseAsm) {
|
if (VerboseAsm) {
|
||||||
O.PadToColumn(TAI->getCommentColumn());
|
O.PadToColumn(MAI->getCommentColumn());
|
||||||
O << TAI->getCommentString()
|
O << MAI->getCommentString()
|
||||||
<< " least significant halfword";
|
<< " least significant halfword";
|
||||||
}
|
}
|
||||||
O << '\n';
|
O << '\n';
|
||||||
} else {
|
} else {
|
||||||
O << TAI->getData16bitsDirective(AddrSpace) << uint16_t(p[0]);
|
O << MAI->getData16bitsDirective(AddrSpace) << uint16_t(p[0]);
|
||||||
if (VerboseAsm) {
|
if (VerboseAsm) {
|
||||||
O.PadToColumn(TAI->getCommentColumn());
|
O.PadToColumn(MAI->getCommentColumn());
|
||||||
O << TAI->getCommentString()
|
O << MAI->getCommentString()
|
||||||
<< " least significant halfword of x86_fp80 ~"
|
<< " least significant halfword of x86_fp80 ~"
|
||||||
<< DoubleVal.convertToDouble();
|
<< DoubleVal.convertToDouble();
|
||||||
}
|
}
|
||||||
O << '\n';
|
O << '\n';
|
||||||
O << TAI->getData16bitsDirective(AddrSpace) << uint16_t(p[0] >> 16);
|
O << MAI->getData16bitsDirective(AddrSpace) << uint16_t(p[0] >> 16);
|
||||||
if (VerboseAsm) {
|
if (VerboseAsm) {
|
||||||
O.PadToColumn(TAI->getCommentColumn());
|
O.PadToColumn(MAI->getCommentColumn());
|
||||||
O << TAI->getCommentString()
|
O << MAI->getCommentString()
|
||||||
<< " next halfword";
|
<< " next halfword";
|
||||||
}
|
}
|
||||||
O << '\n';
|
O << '\n';
|
||||||
O << TAI->getData16bitsDirective(AddrSpace) << uint16_t(p[0] >> 32);
|
O << MAI->getData16bitsDirective(AddrSpace) << uint16_t(p[0] >> 32);
|
||||||
if (VerboseAsm) {
|
if (VerboseAsm) {
|
||||||
O.PadToColumn(TAI->getCommentColumn());
|
O.PadToColumn(MAI->getCommentColumn());
|
||||||
O << TAI->getCommentString()
|
O << MAI->getCommentString()
|
||||||
<< " next halfword";
|
<< " next halfword";
|
||||||
}
|
}
|
||||||
O << '\n';
|
O << '\n';
|
||||||
O << TAI->getData16bitsDirective(AddrSpace) << uint16_t(p[0] >> 48);
|
O << MAI->getData16bitsDirective(AddrSpace) << uint16_t(p[0] >> 48);
|
||||||
if (VerboseAsm) {
|
if (VerboseAsm) {
|
||||||
O.PadToColumn(TAI->getCommentColumn());
|
O.PadToColumn(MAI->getCommentColumn());
|
||||||
O << TAI->getCommentString()
|
O << MAI->getCommentString()
|
||||||
<< " next halfword";
|
<< " next halfword";
|
||||||
}
|
}
|
||||||
O << '\n';
|
O << '\n';
|
||||||
O << TAI->getData16bitsDirective(AddrSpace) << uint16_t(p[1]);
|
O << MAI->getData16bitsDirective(AddrSpace) << uint16_t(p[1]);
|
||||||
if (VerboseAsm) {
|
if (VerboseAsm) {
|
||||||
O.PadToColumn(TAI->getCommentColumn());
|
O.PadToColumn(MAI->getCommentColumn());
|
||||||
O << TAI->getCommentString()
|
O << MAI->getCommentString()
|
||||||
<< " most significant halfword";
|
<< " most significant halfword";
|
||||||
}
|
}
|
||||||
O << '\n';
|
O << '\n';
|
||||||
@ -1134,60 +1134,60 @@ void AsmPrinter::EmitGlobalConstantFP(const ConstantFP *CFP,
|
|||||||
APInt api = CFP->getValueAPF().bitcastToAPInt();
|
APInt api = CFP->getValueAPF().bitcastToAPInt();
|
||||||
const uint64_t *p = api.getRawData();
|
const uint64_t *p = api.getRawData();
|
||||||
if (TD->isBigEndian()) {
|
if (TD->isBigEndian()) {
|
||||||
O << TAI->getData32bitsDirective(AddrSpace) << uint32_t(p[0] >> 32);
|
O << MAI->getData32bitsDirective(AddrSpace) << uint32_t(p[0] >> 32);
|
||||||
if (VerboseAsm) {
|
if (VerboseAsm) {
|
||||||
O.PadToColumn(TAI->getCommentColumn());
|
O.PadToColumn(MAI->getCommentColumn());
|
||||||
O << TAI->getCommentString()
|
O << MAI->getCommentString()
|
||||||
<< " most significant word of ppc_fp128";
|
<< " most significant word of ppc_fp128";
|
||||||
}
|
}
|
||||||
O << '\n';
|
O << '\n';
|
||||||
O << TAI->getData32bitsDirective(AddrSpace) << uint32_t(p[0]);
|
O << MAI->getData32bitsDirective(AddrSpace) << uint32_t(p[0]);
|
||||||
if (VerboseAsm) {
|
if (VerboseAsm) {
|
||||||
O.PadToColumn(TAI->getCommentColumn());
|
O.PadToColumn(MAI->getCommentColumn());
|
||||||
O << TAI->getCommentString()
|
O << MAI->getCommentString()
|
||||||
<< " next word";
|
<< " next word";
|
||||||
}
|
}
|
||||||
O << '\n';
|
O << '\n';
|
||||||
O << TAI->getData32bitsDirective(AddrSpace) << uint32_t(p[1] >> 32);
|
O << MAI->getData32bitsDirective(AddrSpace) << uint32_t(p[1] >> 32);
|
||||||
if (VerboseAsm) {
|
if (VerboseAsm) {
|
||||||
O.PadToColumn(TAI->getCommentColumn());
|
O.PadToColumn(MAI->getCommentColumn());
|
||||||
O << TAI->getCommentString()
|
O << MAI->getCommentString()
|
||||||
<< " next word";
|
<< " next word";
|
||||||
}
|
}
|
||||||
O << '\n';
|
O << '\n';
|
||||||
O << TAI->getData32bitsDirective(AddrSpace) << uint32_t(p[1]);
|
O << MAI->getData32bitsDirective(AddrSpace) << uint32_t(p[1]);
|
||||||
if (VerboseAsm) {
|
if (VerboseAsm) {
|
||||||
O.PadToColumn(TAI->getCommentColumn());
|
O.PadToColumn(MAI->getCommentColumn());
|
||||||
O << TAI->getCommentString()
|
O << MAI->getCommentString()
|
||||||
<< " least significant word";
|
<< " least significant word";
|
||||||
}
|
}
|
||||||
O << '\n';
|
O << '\n';
|
||||||
} else {
|
} else {
|
||||||
O << TAI->getData32bitsDirective(AddrSpace) << uint32_t(p[1]);
|
O << MAI->getData32bitsDirective(AddrSpace) << uint32_t(p[1]);
|
||||||
if (VerboseAsm) {
|
if (VerboseAsm) {
|
||||||
O.PadToColumn(TAI->getCommentColumn());
|
O.PadToColumn(MAI->getCommentColumn());
|
||||||
O << TAI->getCommentString()
|
O << MAI->getCommentString()
|
||||||
<< " least significant word of ppc_fp128";
|
<< " least significant word of ppc_fp128";
|
||||||
}
|
}
|
||||||
O << '\n';
|
O << '\n';
|
||||||
O << TAI->getData32bitsDirective(AddrSpace) << uint32_t(p[1] >> 32);
|
O << MAI->getData32bitsDirective(AddrSpace) << uint32_t(p[1] >> 32);
|
||||||
if (VerboseAsm) {
|
if (VerboseAsm) {
|
||||||
O.PadToColumn(TAI->getCommentColumn());
|
O.PadToColumn(MAI->getCommentColumn());
|
||||||
O << TAI->getCommentString()
|
O << MAI->getCommentString()
|
||||||
<< " next word";
|
<< " next word";
|
||||||
}
|
}
|
||||||
O << '\n';
|
O << '\n';
|
||||||
O << TAI->getData32bitsDirective(AddrSpace) << uint32_t(p[0]);
|
O << MAI->getData32bitsDirective(AddrSpace) << uint32_t(p[0]);
|
||||||
if (VerboseAsm) {
|
if (VerboseAsm) {
|
||||||
O.PadToColumn(TAI->getCommentColumn());
|
O.PadToColumn(MAI->getCommentColumn());
|
||||||
O << TAI->getCommentString()
|
O << MAI->getCommentString()
|
||||||
<< " next word";
|
<< " next word";
|
||||||
}
|
}
|
||||||
O << '\n';
|
O << '\n';
|
||||||
O << TAI->getData32bitsDirective(AddrSpace) << uint32_t(p[0] >> 32);
|
O << MAI->getData32bitsDirective(AddrSpace) << uint32_t(p[0] >> 32);
|
||||||
if (VerboseAsm) {
|
if (VerboseAsm) {
|
||||||
O.PadToColumn(TAI->getCommentColumn());
|
O.PadToColumn(MAI->getCommentColumn());
|
||||||
O << TAI->getCommentString()
|
O << MAI->getCommentString()
|
||||||
<< " most significant word";
|
<< " most significant word";
|
||||||
}
|
}
|
||||||
O << '\n';
|
O << '\n';
|
||||||
@ -1214,35 +1214,35 @@ void AsmPrinter::EmitGlobalConstantLargeInt(const ConstantInt *CI,
|
|||||||
else
|
else
|
||||||
Val = RawData[i];
|
Val = RawData[i];
|
||||||
|
|
||||||
if (TAI->getData64bitsDirective(AddrSpace))
|
if (MAI->getData64bitsDirective(AddrSpace))
|
||||||
O << TAI->getData64bitsDirective(AddrSpace) << Val << '\n';
|
O << MAI->getData64bitsDirective(AddrSpace) << Val << '\n';
|
||||||
else if (TD->isBigEndian()) {
|
else if (TD->isBigEndian()) {
|
||||||
O << TAI->getData32bitsDirective(AddrSpace) << unsigned(Val >> 32);
|
O << MAI->getData32bitsDirective(AddrSpace) << unsigned(Val >> 32);
|
||||||
if (VerboseAsm) {
|
if (VerboseAsm) {
|
||||||
O.PadToColumn(TAI->getCommentColumn());
|
O.PadToColumn(MAI->getCommentColumn());
|
||||||
O << TAI->getCommentString()
|
O << MAI->getCommentString()
|
||||||
<< " most significant half of i64 " << Val;
|
<< " most significant half of i64 " << Val;
|
||||||
}
|
}
|
||||||
O << '\n';
|
O << '\n';
|
||||||
O << TAI->getData32bitsDirective(AddrSpace) << unsigned(Val);
|
O << MAI->getData32bitsDirective(AddrSpace) << unsigned(Val);
|
||||||
if (VerboseAsm) {
|
if (VerboseAsm) {
|
||||||
O.PadToColumn(TAI->getCommentColumn());
|
O.PadToColumn(MAI->getCommentColumn());
|
||||||
O << TAI->getCommentString()
|
O << MAI->getCommentString()
|
||||||
<< " least significant half of i64 " << Val;
|
<< " least significant half of i64 " << Val;
|
||||||
}
|
}
|
||||||
O << '\n';
|
O << '\n';
|
||||||
} else {
|
} else {
|
||||||
O << TAI->getData32bitsDirective(AddrSpace) << unsigned(Val);
|
O << MAI->getData32bitsDirective(AddrSpace) << unsigned(Val);
|
||||||
if (VerboseAsm) {
|
if (VerboseAsm) {
|
||||||
O.PadToColumn(TAI->getCommentColumn());
|
O.PadToColumn(MAI->getCommentColumn());
|
||||||
O << TAI->getCommentString()
|
O << MAI->getCommentString()
|
||||||
<< " least significant half of i64 " << Val;
|
<< " least significant half of i64 " << Val;
|
||||||
}
|
}
|
||||||
O << '\n';
|
O << '\n';
|
||||||
O << TAI->getData32bitsDirective(AddrSpace) << unsigned(Val >> 32);
|
O << MAI->getData32bitsDirective(AddrSpace) << unsigned(Val >> 32);
|
||||||
if (VerboseAsm) {
|
if (VerboseAsm) {
|
||||||
O.PadToColumn(TAI->getCommentColumn());
|
O.PadToColumn(MAI->getCommentColumn());
|
||||||
O << TAI->getCommentString()
|
O << MAI->getCommentString()
|
||||||
<< " most significant half of i64 " << Val;
|
<< " most significant half of i64 " << Val;
|
||||||
}
|
}
|
||||||
O << '\n';
|
O << '\n';
|
||||||
@ -1285,8 +1285,8 @@ void AsmPrinter::EmitGlobalConstant(const Constant *CV, unsigned AddrSpace) {
|
|||||||
if (const ConstantInt *CI = dyn_cast<ConstantInt>(CV)) {
|
if (const ConstantInt *CI = dyn_cast<ConstantInt>(CV)) {
|
||||||
SmallString<40> S;
|
SmallString<40> S;
|
||||||
CI->getValue().toStringUnsigned(S, 16);
|
CI->getValue().toStringUnsigned(S, 16);
|
||||||
O.PadToColumn(TAI->getCommentColumn());
|
O.PadToColumn(MAI->getCommentColumn());
|
||||||
O << TAI->getCommentString() << " 0x" << S.str();
|
O << MAI->getCommentString() << " 0x" << S.str();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
O << '\n';
|
O << '\n';
|
||||||
@ -1305,10 +1305,10 @@ void AsmPrinter::EmitMachineConstantPoolValue(MachineConstantPoolValue *MCPV) {
|
|||||||
/// for their own strange codes.
|
/// for their own strange codes.
|
||||||
void AsmPrinter::PrintSpecial(const MachineInstr *MI, const char *Code) const {
|
void AsmPrinter::PrintSpecial(const MachineInstr *MI, const char *Code) const {
|
||||||
if (!strcmp(Code, "private")) {
|
if (!strcmp(Code, "private")) {
|
||||||
O << TAI->getPrivateGlobalPrefix();
|
O << MAI->getPrivateGlobalPrefix();
|
||||||
} else if (!strcmp(Code, "comment")) {
|
} else if (!strcmp(Code, "comment")) {
|
||||||
if (VerboseAsm)
|
if (VerboseAsm)
|
||||||
O << TAI->getCommentString();
|
O << MAI->getCommentString();
|
||||||
} else if (!strcmp(Code, "uid")) {
|
} else if (!strcmp(Code, "uid")) {
|
||||||
// Comparing the address of MI isn't sufficient, because machineinstrs may
|
// Comparing the address of MI isn't sufficient, because machineinstrs may
|
||||||
// be allocated to the same address across functions.
|
// be allocated to the same address across functions.
|
||||||
@ -1333,10 +1333,10 @@ void AsmPrinter::PrintSpecial(const MachineInstr *MI, const char *Code) const {
|
|||||||
/// processDebugLoc - Processes the debug information of each machine
|
/// processDebugLoc - Processes the debug information of each machine
|
||||||
/// instruction's DebugLoc.
|
/// instruction's DebugLoc.
|
||||||
void AsmPrinter::processDebugLoc(DebugLoc DL) {
|
void AsmPrinter::processDebugLoc(DebugLoc DL) {
|
||||||
if (!TAI || !DW)
|
if (!MAI || !DW)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (TAI->doesSupportDebugInformation() && DW->ShouldEmitDwarfDebug()) {
|
if (MAI->doesSupportDebugInformation() && DW->ShouldEmitDwarfDebug()) {
|
||||||
if (!DL.isUnknown()) {
|
if (!DL.isUnknown()) {
|
||||||
DebugLocTuple CurDLT = MF->getDebugLocTuple(DL);
|
DebugLocTuple CurDLT = MF->getDebugLocTuple(DL);
|
||||||
|
|
||||||
@ -1368,15 +1368,15 @@ void AsmPrinter::printInlineAsm(const MachineInstr *MI) const {
|
|||||||
// If this asmstr is empty, just print the #APP/#NOAPP markers.
|
// If this asmstr is empty, just print the #APP/#NOAPP markers.
|
||||||
// These are useful to see where empty asm's wound up.
|
// These are useful to see where empty asm's wound up.
|
||||||
if (AsmStr[0] == 0) {
|
if (AsmStr[0] == 0) {
|
||||||
O << TAI->getCommentString() << TAI->getInlineAsmStart() << "\n\t";
|
O << MAI->getCommentString() << MAI->getInlineAsmStart() << "\n\t";
|
||||||
O << TAI->getCommentString() << TAI->getInlineAsmEnd() << '\n';
|
O << MAI->getCommentString() << MAI->getInlineAsmEnd() << '\n';
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
O << TAI->getCommentString() << TAI->getInlineAsmStart() << "\n\t";
|
O << MAI->getCommentString() << MAI->getInlineAsmStart() << "\n\t";
|
||||||
|
|
||||||
// The variant of the current asmprinter.
|
// The variant of the current asmprinter.
|
||||||
int AsmPrinterVariant = TAI->getAssemblerDialect();
|
int AsmPrinterVariant = MAI->getAssemblerDialect();
|
||||||
|
|
||||||
int CurVariant = -1; // The number of the {.|.|.} region we are in.
|
int CurVariant = -1; // The number of the {.|.|.} region we are in.
|
||||||
const char *LastEmitted = AsmStr; // One past the last character emitted.
|
const char *LastEmitted = AsmStr; // One past the last character emitted.
|
||||||
@ -1544,15 +1544,15 @@ void AsmPrinter::printInlineAsm(const MachineInstr *MI) const {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
O << "\n\t" << TAI->getCommentString() << TAI->getInlineAsmEnd() << '\n';
|
O << "\n\t" << MAI->getCommentString() << MAI->getInlineAsmEnd() << '\n';
|
||||||
}
|
}
|
||||||
|
|
||||||
/// printImplicitDef - This method prints the specified machine instruction
|
/// printImplicitDef - This method prints the specified machine instruction
|
||||||
/// that is an implicit def.
|
/// that is an implicit def.
|
||||||
void AsmPrinter::printImplicitDef(const MachineInstr *MI) const {
|
void AsmPrinter::printImplicitDef(const MachineInstr *MI) const {
|
||||||
if (VerboseAsm) {
|
if (VerboseAsm) {
|
||||||
O.PadToColumn(TAI->getCommentColumn());
|
O.PadToColumn(MAI->getCommentColumn());
|
||||||
O << TAI->getCommentString() << " implicit-def: "
|
O << MAI->getCommentString() << " implicit-def: "
|
||||||
<< TRI->getAsmName(MI->getOperand(0).getReg()) << '\n';
|
<< TRI->getAsmName(MI->getOperand(0).getReg()) << '\n';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1564,7 +1564,7 @@ void AsmPrinter::printLabel(const MachineInstr *MI) const {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void AsmPrinter::printLabel(unsigned Id) const {
|
void AsmPrinter::printLabel(unsigned Id) const {
|
||||||
O << TAI->getPrivateGlobalPrefix() << "label" << Id << ":\n";
|
O << MAI->getPrivateGlobalPrefix() << "label" << Id << ":\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
/// PrintAsmOperand - Print the specified operand of MI, an INLINEASM
|
/// PrintAsmOperand - Print the specified operand of MI, an INLINEASM
|
||||||
@ -1595,15 +1595,15 @@ void AsmPrinter::printBasicBlockLabel(const MachineBasicBlock *MBB,
|
|||||||
EmitAlignment(Log2_32(Align));
|
EmitAlignment(Log2_32(Align));
|
||||||
}
|
}
|
||||||
|
|
||||||
O << TAI->getPrivateGlobalPrefix() << "BB" << getFunctionNumber() << '_'
|
O << MAI->getPrivateGlobalPrefix() << "BB" << getFunctionNumber() << '_'
|
||||||
<< MBB->getNumber();
|
<< MBB->getNumber();
|
||||||
if (printColon)
|
if (printColon)
|
||||||
O << ':';
|
O << ':';
|
||||||
if (printComment) {
|
if (printComment) {
|
||||||
if (const BasicBlock *BB = MBB->getBasicBlock())
|
if (const BasicBlock *BB = MBB->getBasicBlock())
|
||||||
if (BB->hasName()) {
|
if (BB->hasName()) {
|
||||||
O.PadToColumn(TAI->getCommentColumn());
|
O.PadToColumn(MAI->getCommentColumn());
|
||||||
O << TAI->getCommentString() << ' ';
|
O << MAI->getCommentString() << ' ';
|
||||||
WriteAsOperand(O, BB, /*PrintType=*/false);
|
WriteAsOperand(O, BB, /*PrintType=*/false);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1616,26 +1616,26 @@ void AsmPrinter::printBasicBlockLabel(const MachineBasicBlock *MBB,
|
|||||||
/// specified MachineBasicBlock for a jumptable entry.
|
/// specified MachineBasicBlock for a jumptable entry.
|
||||||
void AsmPrinter::printPICJumpTableSetLabel(unsigned uid,
|
void AsmPrinter::printPICJumpTableSetLabel(unsigned uid,
|
||||||
const MachineBasicBlock *MBB) const {
|
const MachineBasicBlock *MBB) const {
|
||||||
if (!TAI->getSetDirective())
|
if (!MAI->getSetDirective())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
O << TAI->getSetDirective() << ' ' << TAI->getPrivateGlobalPrefix()
|
O << MAI->getSetDirective() << ' ' << MAI->getPrivateGlobalPrefix()
|
||||||
<< getFunctionNumber() << '_' << uid << "_set_" << MBB->getNumber() << ',';
|
<< getFunctionNumber() << '_' << uid << "_set_" << MBB->getNumber() << ',';
|
||||||
printBasicBlockLabel(MBB, false, false, false);
|
printBasicBlockLabel(MBB, false, false, false);
|
||||||
O << '-' << TAI->getPrivateGlobalPrefix() << "JTI" << getFunctionNumber()
|
O << '-' << MAI->getPrivateGlobalPrefix() << "JTI" << getFunctionNumber()
|
||||||
<< '_' << uid << '\n';
|
<< '_' << uid << '\n';
|
||||||
}
|
}
|
||||||
|
|
||||||
void AsmPrinter::printPICJumpTableSetLabel(unsigned uid, unsigned uid2,
|
void AsmPrinter::printPICJumpTableSetLabel(unsigned uid, unsigned uid2,
|
||||||
const MachineBasicBlock *MBB) const {
|
const MachineBasicBlock *MBB) const {
|
||||||
if (!TAI->getSetDirective())
|
if (!MAI->getSetDirective())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
O << TAI->getSetDirective() << ' ' << TAI->getPrivateGlobalPrefix()
|
O << MAI->getSetDirective() << ' ' << MAI->getPrivateGlobalPrefix()
|
||||||
<< getFunctionNumber() << '_' << uid << '_' << uid2
|
<< getFunctionNumber() << '_' << uid << '_' << uid2
|
||||||
<< "_set_" << MBB->getNumber() << ',';
|
<< "_set_" << MBB->getNumber() << ',';
|
||||||
printBasicBlockLabel(MBB, false, false, false);
|
printBasicBlockLabel(MBB, false, false, false);
|
||||||
O << '-' << TAI->getPrivateGlobalPrefix() << "JTI" << getFunctionNumber()
|
O << '-' << MAI->getPrivateGlobalPrefix() << "JTI" << getFunctionNumber()
|
||||||
<< '_' << uid << '_' << uid2 << '\n';
|
<< '_' << uid << '_' << uid2 << '\n';
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1652,15 +1652,15 @@ void AsmPrinter::printDataDirective(const Type *type, unsigned AddrSpace) {
|
|||||||
case Type::IntegerTyID: {
|
case Type::IntegerTyID: {
|
||||||
unsigned BitWidth = cast<IntegerType>(type)->getBitWidth();
|
unsigned BitWidth = cast<IntegerType>(type)->getBitWidth();
|
||||||
if (BitWidth <= 8)
|
if (BitWidth <= 8)
|
||||||
O << TAI->getData8bitsDirective(AddrSpace);
|
O << MAI->getData8bitsDirective(AddrSpace);
|
||||||
else if (BitWidth <= 16)
|
else if (BitWidth <= 16)
|
||||||
O << TAI->getData16bitsDirective(AddrSpace);
|
O << MAI->getData16bitsDirective(AddrSpace);
|
||||||
else if (BitWidth <= 32)
|
else if (BitWidth <= 32)
|
||||||
O << TAI->getData32bitsDirective(AddrSpace);
|
O << MAI->getData32bitsDirective(AddrSpace);
|
||||||
else if (BitWidth <= 64) {
|
else if (BitWidth <= 64) {
|
||||||
assert(TAI->getData64bitsDirective(AddrSpace) &&
|
assert(MAI->getData64bitsDirective(AddrSpace) &&
|
||||||
"Target cannot handle 64-bit constant exprs!");
|
"Target cannot handle 64-bit constant exprs!");
|
||||||
O << TAI->getData64bitsDirective(AddrSpace);
|
O << MAI->getData64bitsDirective(AddrSpace);
|
||||||
} else {
|
} else {
|
||||||
llvm_unreachable("Target cannot handle given data directive width!");
|
llvm_unreachable("Target cannot handle given data directive width!");
|
||||||
}
|
}
|
||||||
@ -1668,15 +1668,15 @@ void AsmPrinter::printDataDirective(const Type *type, unsigned AddrSpace) {
|
|||||||
}
|
}
|
||||||
case Type::PointerTyID:
|
case Type::PointerTyID:
|
||||||
if (TD->getPointerSize() == 8) {
|
if (TD->getPointerSize() == 8) {
|
||||||
assert(TAI->getData64bitsDirective(AddrSpace) &&
|
assert(MAI->getData64bitsDirective(AddrSpace) &&
|
||||||
"Target cannot handle 64-bit pointer exprs!");
|
"Target cannot handle 64-bit pointer exprs!");
|
||||||
O << TAI->getData64bitsDirective(AddrSpace);
|
O << MAI->getData64bitsDirective(AddrSpace);
|
||||||
} else if (TD->getPointerSize() == 2) {
|
} else if (TD->getPointerSize() == 2) {
|
||||||
O << TAI->getData16bitsDirective(AddrSpace);
|
O << MAI->getData16bitsDirective(AddrSpace);
|
||||||
} else if (TD->getPointerSize() == 1) {
|
} else if (TD->getPointerSize() == 1) {
|
||||||
O << TAI->getData8bitsDirective(AddrSpace);
|
O << MAI->getData8bitsDirective(AddrSpace);
|
||||||
} else {
|
} else {
|
||||||
O << TAI->getData32bitsDirective(AddrSpace);
|
O << MAI->getData32bitsDirective(AddrSpace);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -1685,10 +1685,10 @@ void AsmPrinter::printDataDirective(const Type *type, unsigned AddrSpace) {
|
|||||||
void AsmPrinter::printVisibility(const std::string& Name,
|
void AsmPrinter::printVisibility(const std::string& Name,
|
||||||
unsigned Visibility) const {
|
unsigned Visibility) const {
|
||||||
if (Visibility == GlobalValue::HiddenVisibility) {
|
if (Visibility == GlobalValue::HiddenVisibility) {
|
||||||
if (const char *Directive = TAI->getHiddenDirective())
|
if (const char *Directive = MAI->getHiddenDirective())
|
||||||
O << Directive << Name << '\n';
|
O << Directive << Name << '\n';
|
||||||
} else if (Visibility == GlobalValue::ProtectedVisibility) {
|
} else if (Visibility == GlobalValue::ProtectedVisibility) {
|
||||||
if (const char *Directive = TAI->getProtectedDirective())
|
if (const char *Directive = MAI->getProtectedDirective())
|
||||||
O << Directive << Name << '\n';
|
O << Directive << Name << '\n';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1737,8 +1737,8 @@ void AsmPrinter::EmitComments(const MachineInstr &MI) const {
|
|||||||
DebugLocTuple DLT = MF->getDebugLocTuple(MI.getDebugLoc());
|
DebugLocTuple DLT = MF->getDebugLocTuple(MI.getDebugLoc());
|
||||||
|
|
||||||
// Print source line info.
|
// Print source line info.
|
||||||
O.PadToColumn(TAI->getCommentColumn());
|
O.PadToColumn(MAI->getCommentColumn());
|
||||||
O << TAI->getCommentString() << " SrcLine ";
|
O << MAI->getCommentString() << " SrcLine ";
|
||||||
if (DLT.CompileUnit->hasInitializer()) {
|
if (DLT.CompileUnit->hasInitializer()) {
|
||||||
Constant *Name = DLT.CompileUnit->getInitializer();
|
Constant *Name = DLT.CompileUnit->getInitializer();
|
||||||
if (ConstantArray *NameString = dyn_cast<ConstantArray>(Name))
|
if (ConstantArray *NameString = dyn_cast<ConstantArray>(Name))
|
||||||
@ -1758,8 +1758,8 @@ void AsmPrinter::EmitComments(const MCInst &MI) const
|
|||||||
DebugLocTuple DLT = MF->getDebugLocTuple(MI.getDebugLoc());
|
DebugLocTuple DLT = MF->getDebugLocTuple(MI.getDebugLoc());
|
||||||
|
|
||||||
// Print source line info
|
// Print source line info
|
||||||
O.PadToColumn(TAI->getCommentColumn());
|
O.PadToColumn(MAI->getCommentColumn());
|
||||||
O << TAI->getCommentString() << " SrcLine ";
|
O << MAI->getCommentString() << " SrcLine ";
|
||||||
if (DLT.CompileUnit->hasInitializer()) {
|
if (DLT.CompileUnit->hasInitializer()) {
|
||||||
Constant *Name = DLT.CompileUnit->getInitializer();
|
Constant *Name = DLT.CompileUnit->getInitializer();
|
||||||
if (ConstantArray *NameString = dyn_cast<ConstantArray>(Name))
|
if (ConstantArray *NameString = dyn_cast<ConstantArray>(Name))
|
||||||
@ -1792,7 +1792,7 @@ Indent(formatted_raw_ostream &out, int level, int scale = 2) {
|
|||||||
///
|
///
|
||||||
static void PrintChildLoopComment(formatted_raw_ostream &O,
|
static void PrintChildLoopComment(formatted_raw_ostream &O,
|
||||||
const MachineLoop *loop,
|
const MachineLoop *loop,
|
||||||
const MCAsmInfo *TAI,
|
const MCAsmInfo *MAI,
|
||||||
int FunctionNumber) {
|
int FunctionNumber) {
|
||||||
// Add child loop information
|
// Add child loop information
|
||||||
for(MachineLoop::iterator cl = loop->begin(),
|
for(MachineLoop::iterator cl = loop->begin(),
|
||||||
@ -1803,14 +1803,14 @@ static void PrintChildLoopComment(formatted_raw_ostream &O,
|
|||||||
assert(Header && "No header for loop");
|
assert(Header && "No header for loop");
|
||||||
|
|
||||||
O << '\n';
|
O << '\n';
|
||||||
O.PadToColumn(TAI->getCommentColumn());
|
O.PadToColumn(MAI->getCommentColumn());
|
||||||
|
|
||||||
O << TAI->getCommentString();
|
O << MAI->getCommentString();
|
||||||
Indent(O, (*cl)->getLoopDepth()-1)
|
Indent(O, (*cl)->getLoopDepth()-1)
|
||||||
<< " Child Loop BB" << FunctionNumber << "_"
|
<< " Child Loop BB" << FunctionNumber << "_"
|
||||||
<< Header->getNumber() << " Depth " << (*cl)->getLoopDepth();
|
<< Header->getNumber() << " Depth " << (*cl)->getLoopDepth();
|
||||||
|
|
||||||
PrintChildLoopComment(O, *cl, TAI, FunctionNumber);
|
PrintChildLoopComment(O, *cl, MAI, FunctionNumber);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1824,28 +1824,28 @@ void AsmPrinter::EmitComments(const MachineBasicBlock &MBB) const
|
|||||||
if (loop) {
|
if (loop) {
|
||||||
// Print a newline after bb# annotation.
|
// Print a newline after bb# annotation.
|
||||||
O << "\n";
|
O << "\n";
|
||||||
O.PadToColumn(TAI->getCommentColumn());
|
O.PadToColumn(MAI->getCommentColumn());
|
||||||
O << TAI->getCommentString() << " Loop Depth " << loop->getLoopDepth()
|
O << MAI->getCommentString() << " Loop Depth " << loop->getLoopDepth()
|
||||||
<< '\n';
|
<< '\n';
|
||||||
|
|
||||||
O.PadToColumn(TAI->getCommentColumn());
|
O.PadToColumn(MAI->getCommentColumn());
|
||||||
|
|
||||||
MachineBasicBlock *Header = loop->getHeader();
|
MachineBasicBlock *Header = loop->getHeader();
|
||||||
assert(Header && "No header for loop");
|
assert(Header && "No header for loop");
|
||||||
|
|
||||||
if (Header == &MBB) {
|
if (Header == &MBB) {
|
||||||
O << TAI->getCommentString() << " Loop Header";
|
O << MAI->getCommentString() << " Loop Header";
|
||||||
PrintChildLoopComment(O, loop, TAI, getFunctionNumber());
|
PrintChildLoopComment(O, loop, MAI, getFunctionNumber());
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
O << TAI->getCommentString() << " Loop Header is BB"
|
O << MAI->getCommentString() << " Loop Header is BB"
|
||||||
<< getFunctionNumber() << "_" << loop->getHeader()->getNumber();
|
<< getFunctionNumber() << "_" << loop->getHeader()->getNumber();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (loop->empty()) {
|
if (loop->empty()) {
|
||||||
O << '\n';
|
O << '\n';
|
||||||
O.PadToColumn(TAI->getCommentColumn());
|
O.PadToColumn(MAI->getCommentColumn());
|
||||||
O << TAI->getCommentString() << " Inner Loop";
|
O << MAI->getCommentString() << " Inner Loop";
|
||||||
}
|
}
|
||||||
|
|
||||||
// Add parent loop information
|
// Add parent loop information
|
||||||
@ -1856,8 +1856,8 @@ void AsmPrinter::EmitComments(const MachineBasicBlock &MBB) const
|
|||||||
assert(Header && "No header for loop");
|
assert(Header && "No header for loop");
|
||||||
|
|
||||||
O << '\n';
|
O << '\n';
|
||||||
O.PadToColumn(TAI->getCommentColumn());
|
O.PadToColumn(MAI->getCommentColumn());
|
||||||
O << TAI->getCommentString();
|
O << MAI->getCommentString();
|
||||||
Indent(O, CurLoop->getLoopDepth()-1)
|
Indent(O, CurLoop->getLoopDepth()-1)
|
||||||
<< " Inside Loop BB" << getFunctionNumber() << "_"
|
<< " Inside Loop BB" << getFunctionNumber() << "_"
|
||||||
<< Header->getNumber() << " Depth " << CurLoop->getLoopDepth();
|
<< Header->getNumber() << " Depth " << CurLoop->getLoopDepth();
|
||||||
|
@ -1334,7 +1334,7 @@ void DwarfDebug::BeginModule(Module *M, MachineModuleInfo *mmi) {
|
|||||||
|
|
||||||
// Print out .file directives to specify files for .loc directives. These are
|
// Print out .file directives to specify files for .loc directives. These are
|
||||||
// printed out early so that they precede any .loc directives.
|
// printed out early so that they precede any .loc directives.
|
||||||
if (TAI->hasDotLocAndDotFile()) {
|
if (MAI->hasDotLocAndDotFile()) {
|
||||||
for (unsigned i = 1, e = getNumSourceIds()+1; i != e; ++i) {
|
for (unsigned i = 1, e = getNumSourceIds()+1; i != e; ++i) {
|
||||||
// Remember source id starts at 1.
|
// Remember source id starts at 1.
|
||||||
std::pair<unsigned, unsigned> Id = getSourceDirectoryAndFileIds(i);
|
std::pair<unsigned, unsigned> Id = getSourceDirectoryAndFileIds(i);
|
||||||
@ -1654,7 +1654,7 @@ unsigned DwarfDebug::RecordInlinedFnStart(DISubprogram &SP, DICompileUnit CU,
|
|||||||
unsigned Line, unsigned Col) {
|
unsigned Line, unsigned Col) {
|
||||||
unsigned LabelID = MMI->NextLabelID();
|
unsigned LabelID = MMI->NextLabelID();
|
||||||
|
|
||||||
if (!TAI->doesDwarfUsesInlineInfoSection())
|
if (!MAI->doesDwarfUsesInlineInfoSection())
|
||||||
return LabelID;
|
return LabelID;
|
||||||
|
|
||||||
if (TimePassesIsEnabled)
|
if (TimePassesIsEnabled)
|
||||||
@ -1732,7 +1732,7 @@ unsigned DwarfDebug::RecordInlinedFnStart(DISubprogram &SP, DICompileUnit CU,
|
|||||||
|
|
||||||
/// RecordInlinedFnEnd - Indicate the end of inlined subroutine.
|
/// RecordInlinedFnEnd - Indicate the end of inlined subroutine.
|
||||||
unsigned DwarfDebug::RecordInlinedFnEnd(DISubprogram &SP) {
|
unsigned DwarfDebug::RecordInlinedFnEnd(DISubprogram &SP) {
|
||||||
if (!TAI->doesDwarfUsesInlineInfoSection())
|
if (!MAI->doesDwarfUsesInlineInfoSection())
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
if (TimePassesIsEnabled)
|
if (TimePassesIsEnabled)
|
||||||
@ -1844,7 +1844,7 @@ void DwarfDebug::EmitInitial() {
|
|||||||
const TargetLoweringObjectFile &TLOF = Asm->getObjFileLowering();
|
const TargetLoweringObjectFile &TLOF = Asm->getObjFileLowering();
|
||||||
|
|
||||||
// Dwarf sections base addresses.
|
// Dwarf sections base addresses.
|
||||||
if (TAI->doesDwarfRequireFrameSection()) {
|
if (MAI->doesDwarfRequireFrameSection()) {
|
||||||
Asm->OutStreamer.SwitchSection(TLOF.getDwarfFrameSection());
|
Asm->OutStreamer.SwitchSection(TLOF.getDwarfFrameSection());
|
||||||
EmitLabel("section_debug_frame", 0);
|
EmitLabel("section_debug_frame", 0);
|
||||||
}
|
}
|
||||||
@ -2037,7 +2037,7 @@ void DwarfDebug::EmitEndOfLineMatrix(unsigned SectionEnd) {
|
|||||||
void DwarfDebug::EmitDebugLines() {
|
void DwarfDebug::EmitDebugLines() {
|
||||||
// If the target is using .loc/.file, the assembler will be emitting the
|
// If the target is using .loc/.file, the assembler will be emitting the
|
||||||
// .debug_line table automatically.
|
// .debug_line table automatically.
|
||||||
if (TAI->hasDotLocAndDotFile())
|
if (MAI->hasDotLocAndDotFile())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
// Minimum line delta, thus ranging from -10..(255-10).
|
// Minimum line delta, thus ranging from -10..(255-10).
|
||||||
@ -2116,7 +2116,7 @@ void DwarfDebug::EmitDebugLines() {
|
|||||||
|
|
||||||
/*if (Asm->isVerbose()) {
|
/*if (Asm->isVerbose()) {
|
||||||
const MCSection *S = SectionMap[j + 1];
|
const MCSection *S = SectionMap[j + 1];
|
||||||
O << '\t' << TAI->getCommentString() << " Section"
|
O << '\t' << MAI->getCommentString() << " Section"
|
||||||
<< S->getName() << '\n';
|
<< S->getName() << '\n';
|
||||||
}*/
|
}*/
|
||||||
Asm->EOL();
|
Asm->EOL();
|
||||||
@ -2136,7 +2136,7 @@ void DwarfDebug::EmitDebugLines() {
|
|||||||
else {
|
else {
|
||||||
std::pair<unsigned, unsigned> SourceID =
|
std::pair<unsigned, unsigned> SourceID =
|
||||||
getSourceDirectoryAndFileIds(LineInfo.getSourceID());
|
getSourceDirectoryAndFileIds(LineInfo.getSourceID());
|
||||||
O << '\t' << TAI->getCommentString() << ' '
|
O << '\t' << MAI->getCommentString() << ' '
|
||||||
<< getSourceDirectoryName(SourceID.first) << ' '
|
<< getSourceDirectoryName(SourceID.first) << ' '
|
||||||
<< getSourceFileName(SourceID.second)
|
<< getSourceFileName(SourceID.second)
|
||||||
<<" :" << utostr_32(LineInfo.getLine()) << '\n';
|
<<" :" << utostr_32(LineInfo.getLine()) << '\n';
|
||||||
@ -2197,7 +2197,7 @@ void DwarfDebug::EmitDebugLines() {
|
|||||||
/// EmitCommonDebugFrame - Emit common frame info into a debug frame section.
|
/// EmitCommonDebugFrame - Emit common frame info into a debug frame section.
|
||||||
///
|
///
|
||||||
void DwarfDebug::EmitCommonDebugFrame() {
|
void DwarfDebug::EmitCommonDebugFrame() {
|
||||||
if (!TAI->doesDwarfRequireFrameSection())
|
if (!MAI->doesDwarfRequireFrameSection())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
int stackGrowth =
|
int stackGrowth =
|
||||||
@ -2243,7 +2243,7 @@ void DwarfDebug::EmitCommonDebugFrame() {
|
|||||||
/// section.
|
/// section.
|
||||||
void
|
void
|
||||||
DwarfDebug::EmitFunctionDebugFrame(const FunctionDebugFrameInfo&DebugFrameInfo){
|
DwarfDebug::EmitFunctionDebugFrame(const FunctionDebugFrameInfo&DebugFrameInfo){
|
||||||
if (!TAI->doesDwarfRequireFrameSection())
|
if (!MAI->doesDwarfRequireFrameSection())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
// Start the dwarf frame section.
|
// Start the dwarf frame section.
|
||||||
@ -2427,7 +2427,7 @@ void DwarfDebug::EmitDebugMacInfo() {
|
|||||||
/// __debug_info section, and the low_pc is the starting address for the
|
/// __debug_info section, and the low_pc is the starting address for the
|
||||||
/// inlining instance.
|
/// inlining instance.
|
||||||
void DwarfDebug::EmitDebugInlineInfo() {
|
void DwarfDebug::EmitDebugInlineInfo() {
|
||||||
if (!TAI->doesDwarfUsesInlineInfoSection())
|
if (!MAI->doesDwarfUsesInlineInfoSection())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (!ModuleCU)
|
if (!ModuleCU)
|
||||||
@ -2479,9 +2479,9 @@ void DwarfDebug::EmitDebugInlineInfo() {
|
|||||||
Asm->EmitInt32(SP->getOffset()); Asm->EOL("DIE offset");
|
Asm->EmitInt32(SP->getOffset()); Asm->EOL("DIE offset");
|
||||||
|
|
||||||
if (TD->getPointerSize() == sizeof(int32_t))
|
if (TD->getPointerSize() == sizeof(int32_t))
|
||||||
O << TAI->getData32bitsDirective();
|
O << MAI->getData32bitsDirective();
|
||||||
else
|
else
|
||||||
O << TAI->getData64bitsDirective();
|
O << MAI->getData64bitsDirective();
|
||||||
|
|
||||||
PrintLabelName("label", *LI); Asm->EOL("low_pc");
|
PrintLabelName("label", *LI); Asm->EOL("low_pc");
|
||||||
}
|
}
|
||||||
|
@ -60,8 +60,8 @@ void DwarfException::EmitCommonEHFrame(const Function *Personality,
|
|||||||
// Begin eh frame section.
|
// Begin eh frame section.
|
||||||
Asm->OutStreamer.SwitchSection(Asm->getObjFileLowering().getEHFrameSection());
|
Asm->OutStreamer.SwitchSection(Asm->getObjFileLowering().getEHFrameSection());
|
||||||
|
|
||||||
if (TAI->is_EHSymbolPrivate())
|
if (MAI->is_EHSymbolPrivate())
|
||||||
O << TAI->getPrivateGlobalPrefix();
|
O << MAI->getPrivateGlobalPrefix();
|
||||||
|
|
||||||
O << "EH_frame" << Index << ":\n";
|
O << "EH_frame" << Index << ":\n";
|
||||||
EmitLabel("section_eh_frame", Index);
|
EmitLabel("section_eh_frame", Index);
|
||||||
@ -99,7 +99,7 @@ void DwarfException::EmitCommonEHFrame(const Function *Personality,
|
|||||||
Asm->EmitULEB128Bytes(7);
|
Asm->EmitULEB128Bytes(7);
|
||||||
Asm->EOL("Augmentation Size");
|
Asm->EOL("Augmentation Size");
|
||||||
|
|
||||||
if (TAI->getNeedsIndirectEncoding()) {
|
if (MAI->getNeedsIndirectEncoding()) {
|
||||||
Asm->EmitInt8(dwarf::DW_EH_PE_pcrel | dwarf::DW_EH_PE_sdata4 |
|
Asm->EmitInt8(dwarf::DW_EH_PE_pcrel | dwarf::DW_EH_PE_sdata4 |
|
||||||
dwarf::DW_EH_PE_indirect);
|
dwarf::DW_EH_PE_indirect);
|
||||||
Asm->EOL("Personality (pcrel sdata4 indirect)");
|
Asm->EOL("Personality (pcrel sdata4 indirect)");
|
||||||
@ -109,11 +109,11 @@ void DwarfException::EmitCommonEHFrame(const Function *Personality,
|
|||||||
}
|
}
|
||||||
|
|
||||||
PrintRelDirective(true);
|
PrintRelDirective(true);
|
||||||
O << TAI->getPersonalityPrefix();
|
O << MAI->getPersonalityPrefix();
|
||||||
Asm->EmitExternalGlobal((const GlobalVariable *)(Personality));
|
Asm->EmitExternalGlobal((const GlobalVariable *)(Personality));
|
||||||
O << TAI->getPersonalitySuffix();
|
O << MAI->getPersonalitySuffix();
|
||||||
if (strcmp(TAI->getPersonalitySuffix(), "+4@GOTPCREL"))
|
if (strcmp(MAI->getPersonalitySuffix(), "+4@GOTPCREL"))
|
||||||
O << "-" << TAI->getPCSymbol();
|
O << "-" << MAI->getPCSymbol();
|
||||||
Asm->EOL("Personality");
|
Asm->EOL("Personality");
|
||||||
|
|
||||||
Asm->EmitInt8(dwarf::DW_EH_PE_pcrel | dwarf::DW_EH_PE_sdata4);
|
Asm->EmitInt8(dwarf::DW_EH_PE_pcrel | dwarf::DW_EH_PE_sdata4);
|
||||||
@ -157,12 +157,12 @@ void DwarfException::EmitEHFrame(const FunctionEHFrameInfo &EHFrameInfo) {
|
|||||||
// Externally visible entry into the functions eh frame info. If the
|
// Externally visible entry into the functions eh frame info. If the
|
||||||
// corresponding function is static, this should not be externally visible.
|
// corresponding function is static, this should not be externally visible.
|
||||||
if (!TheFunc->hasLocalLinkage())
|
if (!TheFunc->hasLocalLinkage())
|
||||||
if (const char *GlobalEHDirective = TAI->getGlobalEHDirective())
|
if (const char *GlobalEHDirective = MAI->getGlobalEHDirective())
|
||||||
O << GlobalEHDirective << EHFrameInfo.FnName << "\n";
|
O << GlobalEHDirective << EHFrameInfo.FnName << "\n";
|
||||||
|
|
||||||
// If corresponding function is weak definition, this should be too.
|
// If corresponding function is weak definition, this should be too.
|
||||||
if (TheFunc->isWeakForLinker() && TAI->getWeakDefDirective())
|
if (TheFunc->isWeakForLinker() && MAI->getWeakDefDirective())
|
||||||
O << TAI->getWeakDefDirective() << EHFrameInfo.FnName << "\n";
|
O << MAI->getWeakDefDirective() << EHFrameInfo.FnName << "\n";
|
||||||
|
|
||||||
// If there are no calls then you can't unwind. This may mean we can omit the
|
// If there are no calls then you can't unwind. This may mean we can omit the
|
||||||
// EH Frame, but some environments do not handle weak absolute symbols. If
|
// EH Frame, but some environments do not handle weak absolute symbols. If
|
||||||
@ -170,13 +170,13 @@ void DwarfException::EmitEHFrame(const FunctionEHFrameInfo &EHFrameInfo) {
|
|||||||
// info is to be available for non-EH uses.
|
// info is to be available for non-EH uses.
|
||||||
if (!EHFrameInfo.hasCalls && !UnwindTablesMandatory &&
|
if (!EHFrameInfo.hasCalls && !UnwindTablesMandatory &&
|
||||||
(!TheFunc->isWeakForLinker() ||
|
(!TheFunc->isWeakForLinker() ||
|
||||||
!TAI->getWeakDefDirective() ||
|
!MAI->getWeakDefDirective() ||
|
||||||
TAI->getSupportsWeakOmittedEHFrame())) {
|
MAI->getSupportsWeakOmittedEHFrame())) {
|
||||||
O << EHFrameInfo.FnName << " = 0\n";
|
O << EHFrameInfo.FnName << " = 0\n";
|
||||||
// This name has no connection to the function, so it might get
|
// This name has no connection to the function, so it might get
|
||||||
// dead-stripped when the function is not, erroneously. Prohibit
|
// dead-stripped when the function is not, erroneously. Prohibit
|
||||||
// dead-stripping unconditionally.
|
// dead-stripping unconditionally.
|
||||||
if (const char *UsedDirective = TAI->getUsedDirective())
|
if (const char *UsedDirective = MAI->getUsedDirective())
|
||||||
O << UsedDirective << EHFrameInfo.FnName << "\n\n";
|
O << UsedDirective << EHFrameInfo.FnName << "\n\n";
|
||||||
} else {
|
} else {
|
||||||
O << EHFrameInfo.FnName << ":\n";
|
O << EHFrameInfo.FnName << ":\n";
|
||||||
@ -233,7 +233,7 @@ void DwarfException::EmitEHFrame(const FunctionEHFrameInfo &EHFrameInfo) {
|
|||||||
// on unused functions (calling undefined externals) being dead-stripped to
|
// on unused functions (calling undefined externals) being dead-stripped to
|
||||||
// link correctly. Yes, there really is.
|
// link correctly. Yes, there really is.
|
||||||
if (MMI->isUsedFunction(EHFrameInfo.function))
|
if (MMI->isUsedFunction(EHFrameInfo.function))
|
||||||
if (const char *UsedDirective = TAI->getUsedDirective())
|
if (const char *UsedDirective = MAI->getUsedDirective())
|
||||||
O << UsedDirective << EHFrameInfo.FnName << "\n\n";
|
O << UsedDirective << EHFrameInfo.FnName << "\n\n";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -430,7 +430,7 @@ ComputeCallSiteTable(SmallVectorImpl<CallSiteEntry> &CallSites,
|
|||||||
// create a call-site entry with no landing pad for the region between the
|
// create a call-site entry with no landing pad for the region between the
|
||||||
// try-ranges.
|
// try-ranges.
|
||||||
if (SawPotentiallyThrowing &&
|
if (SawPotentiallyThrowing &&
|
||||||
TAI->getExceptionHandlingType() == ExceptionHandling::Dwarf) {
|
MAI->getExceptionHandlingType() == ExceptionHandling::Dwarf) {
|
||||||
CallSiteEntry Site = { LastLabel, BeginLabel, 0, 0 };
|
CallSiteEntry Site = { LastLabel, BeginLabel, 0, 0 };
|
||||||
CallSites.push_back(Site);
|
CallSites.push_back(Site);
|
||||||
PreviousIsInvoke = false;
|
PreviousIsInvoke = false;
|
||||||
@ -472,7 +472,7 @@ ComputeCallSiteTable(SmallVectorImpl<CallSiteEntry> &CallSites,
|
|||||||
// function may throw, create a call-site entry with no landing pad for the
|
// function may throw, create a call-site entry with no landing pad for the
|
||||||
// region following the try-range.
|
// region following the try-range.
|
||||||
if (SawPotentiallyThrowing &&
|
if (SawPotentiallyThrowing &&
|
||||||
TAI->getExceptionHandlingType() == ExceptionHandling::Dwarf) {
|
MAI->getExceptionHandlingType() == ExceptionHandling::Dwarf) {
|
||||||
CallSiteEntry Site = { LastLabel, 0, 0, 0 };
|
CallSiteEntry Site = { LastLabel, 0, 0, 0 };
|
||||||
CallSites.push_back(Site);
|
CallSites.push_back(Site);
|
||||||
}
|
}
|
||||||
@ -546,18 +546,18 @@ void DwarfException::EmitExceptionTable() {
|
|||||||
const unsigned LandingPadSize = sizeof(int32_t); // DW_EH_PE_udata4
|
const unsigned LandingPadSize = sizeof(int32_t); // DW_EH_PE_udata4
|
||||||
unsigned SizeSites;
|
unsigned SizeSites;
|
||||||
|
|
||||||
bool HaveTTData = (TAI->getExceptionHandlingType() == ExceptionHandling::SjLj)
|
bool HaveTTData = (MAI->getExceptionHandlingType() == ExceptionHandling::SjLj)
|
||||||
? (!TypeInfos.empty() || !FilterIds.empty()) : true;
|
? (!TypeInfos.empty() || !FilterIds.empty()) : true;
|
||||||
|
|
||||||
|
|
||||||
if (TAI->getExceptionHandlingType() == ExceptionHandling::SjLj) {
|
if (MAI->getExceptionHandlingType() == ExceptionHandling::SjLj) {
|
||||||
SizeSites = 0;
|
SizeSites = 0;
|
||||||
} else
|
} else
|
||||||
SizeSites = CallSites.size() *
|
SizeSites = CallSites.size() *
|
||||||
(SiteStartSize + SiteLengthSize + LandingPadSize);
|
(SiteStartSize + SiteLengthSize + LandingPadSize);
|
||||||
for (unsigned i = 0, e = CallSites.size(); i < e; ++i) {
|
for (unsigned i = 0, e = CallSites.size(); i < e; ++i) {
|
||||||
SizeSites += MCAsmInfo::getULEB128Size(CallSites[i].Action);
|
SizeSites += MCAsmInfo::getULEB128Size(CallSites[i].Action);
|
||||||
if (TAI->getExceptionHandlingType() == ExceptionHandling::SjLj)
|
if (MAI->getExceptionHandlingType() == ExceptionHandling::SjLj)
|
||||||
SizeSites += MCAsmInfo::getULEB128Size(i);
|
SizeSites += MCAsmInfo::getULEB128Size(i);
|
||||||
}
|
}
|
||||||
// Type infos.
|
// Type infos.
|
||||||
@ -588,7 +588,7 @@ void DwarfException::EmitExceptionTable() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
EmitLabel("exception", SubprogramCount);
|
EmitLabel("exception", SubprogramCount);
|
||||||
if (TAI->getExceptionHandlingType() == ExceptionHandling::SjLj) {
|
if (MAI->getExceptionHandlingType() == ExceptionHandling::SjLj) {
|
||||||
std::string SjLjName = "_lsda_";
|
std::string SjLjName = "_lsda_";
|
||||||
SjLjName += MF->getFunction()->getName().str();
|
SjLjName += MF->getFunction()->getName().str();
|
||||||
EmitLabel(SjLjName.c_str(), 0);
|
EmitLabel(SjLjName.c_str(), 0);
|
||||||
@ -657,7 +657,7 @@ void DwarfException::EmitExceptionTable() {
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
// SjLj Exception handilng
|
// SjLj Exception handilng
|
||||||
if (TAI->getExceptionHandlingType() == ExceptionHandling::SjLj) {
|
if (MAI->getExceptionHandlingType() == ExceptionHandling::SjLj) {
|
||||||
Asm->EmitInt8(dwarf::DW_EH_PE_udata4);
|
Asm->EmitInt8(dwarf::DW_EH_PE_udata4);
|
||||||
Asm->EOL("Call site format (DW_EH_PE_udata4)");
|
Asm->EOL("Call site format (DW_EH_PE_udata4)");
|
||||||
Asm->EmitULEB128Bytes(SizeSites);
|
Asm->EmitULEB128Bytes(SizeSites);
|
||||||
@ -682,7 +682,7 @@ void DwarfException::EmitExceptionTable() {
|
|||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// DWARF Exception handling
|
// DWARF Exception handling
|
||||||
assert(TAI->getExceptionHandlingType() == ExceptionHandling::Dwarf);
|
assert(MAI->getExceptionHandlingType() == ExceptionHandling::Dwarf);
|
||||||
|
|
||||||
// The call-site table is a list of all call sites that may throw an
|
// The call-site table is a list of all call sites that may throw an
|
||||||
// exception (including C++ 'throw' statements) in the procedure
|
// exception (including C++ 'throw' statements) in the procedure
|
||||||
@ -836,7 +836,7 @@ void DwarfException::EmitExceptionTable() {
|
|||||||
/// EndModule - Emit all exception information that should come after the
|
/// EndModule - Emit all exception information that should come after the
|
||||||
/// content.
|
/// content.
|
||||||
void DwarfException::EndModule() {
|
void DwarfException::EndModule() {
|
||||||
if (TAI->getExceptionHandlingType() != ExceptionHandling::Dwarf)
|
if (MAI->getExceptionHandlingType() != ExceptionHandling::Dwarf)
|
||||||
return;
|
return;
|
||||||
if (TimePassesIsEnabled)
|
if (TimePassesIsEnabled)
|
||||||
ExceptionTimer->startTimer();
|
ExceptionTimer->startTimer();
|
||||||
@ -864,7 +864,7 @@ void DwarfException::BeginFunction(MachineFunction *MF) {
|
|||||||
this->MF = MF;
|
this->MF = MF;
|
||||||
shouldEmitTable = shouldEmitMoves = false;
|
shouldEmitTable = shouldEmitMoves = false;
|
||||||
|
|
||||||
if (MMI && TAI->doesSupportExceptionHandling()) {
|
if (MMI && MAI->doesSupportExceptionHandling()) {
|
||||||
// Map all labels and get rid of any dead landing pads.
|
// Map all labels and get rid of any dead landing pads.
|
||||||
MMI->TidyLandingPads();
|
MMI->TidyLandingPads();
|
||||||
|
|
||||||
|
@ -28,28 +28,28 @@ using namespace llvm;
|
|||||||
|
|
||||||
Dwarf::Dwarf(raw_ostream &OS, AsmPrinter *A, const MCAsmInfo *T,
|
Dwarf::Dwarf(raw_ostream &OS, AsmPrinter *A, const MCAsmInfo *T,
|
||||||
const char *flavor)
|
const char *flavor)
|
||||||
: O(OS), Asm(A), TAI(T), TD(Asm->TM.getTargetData()),
|
: O(OS), Asm(A), MAI(T), TD(Asm->TM.getTargetData()),
|
||||||
RI(Asm->TM.getRegisterInfo()), M(NULL), MF(NULL), MMI(NULL),
|
RI(Asm->TM.getRegisterInfo()), M(NULL), MF(NULL), MMI(NULL),
|
||||||
SubprogramCount(0), Flavor(flavor), SetCounter(1) {}
|
SubprogramCount(0), Flavor(flavor), SetCounter(1) {}
|
||||||
|
|
||||||
void Dwarf::PrintRelDirective(bool Force32Bit, bool isInSection) const {
|
void Dwarf::PrintRelDirective(bool Force32Bit, bool isInSection) const {
|
||||||
if (isInSection && TAI->getDwarfSectionOffsetDirective())
|
if (isInSection && MAI->getDwarfSectionOffsetDirective())
|
||||||
O << TAI->getDwarfSectionOffsetDirective();
|
O << MAI->getDwarfSectionOffsetDirective();
|
||||||
else if (Force32Bit || TD->getPointerSize() == sizeof(int32_t))
|
else if (Force32Bit || TD->getPointerSize() == sizeof(int32_t))
|
||||||
O << TAI->getData32bitsDirective();
|
O << MAI->getData32bitsDirective();
|
||||||
else
|
else
|
||||||
O << TAI->getData64bitsDirective();
|
O << MAI->getData64bitsDirective();
|
||||||
}
|
}
|
||||||
|
|
||||||
/// PrintLabelName - Print label name in form used by Dwarf writer.
|
/// PrintLabelName - Print label name in form used by Dwarf writer.
|
||||||
///
|
///
|
||||||
void Dwarf::PrintLabelName(const char *Tag, unsigned Number) const {
|
void Dwarf::PrintLabelName(const char *Tag, unsigned Number) const {
|
||||||
O << TAI->getPrivateGlobalPrefix() << Tag;
|
O << MAI->getPrivateGlobalPrefix() << Tag;
|
||||||
if (Number) O << Number;
|
if (Number) O << Number;
|
||||||
}
|
}
|
||||||
void Dwarf::PrintLabelName(const char *Tag, unsigned Number,
|
void Dwarf::PrintLabelName(const char *Tag, unsigned Number,
|
||||||
const char *Suffix) const {
|
const char *Suffix) const {
|
||||||
O << TAI->getPrivateGlobalPrefix() << Tag;
|
O << MAI->getPrivateGlobalPrefix() << Tag;
|
||||||
if (Number) O << Number;
|
if (Number) O << Number;
|
||||||
O << Suffix;
|
O << Suffix;
|
||||||
}
|
}
|
||||||
@ -67,13 +67,13 @@ void Dwarf::EmitReference(const char *Tag, unsigned Number,
|
|||||||
bool IsPCRelative, bool Force32Bit) const {
|
bool IsPCRelative, bool Force32Bit) const {
|
||||||
PrintRelDirective(Force32Bit);
|
PrintRelDirective(Force32Bit);
|
||||||
PrintLabelName(Tag, Number);
|
PrintLabelName(Tag, Number);
|
||||||
if (IsPCRelative) O << "-" << TAI->getPCSymbol();
|
if (IsPCRelative) O << "-" << MAI->getPCSymbol();
|
||||||
}
|
}
|
||||||
void Dwarf::EmitReference(const std::string &Name, bool IsPCRelative,
|
void Dwarf::EmitReference(const std::string &Name, bool IsPCRelative,
|
||||||
bool Force32Bit) const {
|
bool Force32Bit) const {
|
||||||
PrintRelDirective(Force32Bit);
|
PrintRelDirective(Force32Bit);
|
||||||
O << Name;
|
O << Name;
|
||||||
if (IsPCRelative) O << "-" << TAI->getPCSymbol();
|
if (IsPCRelative) O << "-" << MAI->getPCSymbol();
|
||||||
}
|
}
|
||||||
|
|
||||||
/// EmitDifference - Emit the difference between two labels. Some assemblers do
|
/// EmitDifference - Emit the difference between two labels. Some assemblers do
|
||||||
@ -82,7 +82,7 @@ void Dwarf::EmitReference(const std::string &Name, bool IsPCRelative,
|
|||||||
void Dwarf::EmitDifference(const char *TagHi, unsigned NumberHi,
|
void Dwarf::EmitDifference(const char *TagHi, unsigned NumberHi,
|
||||||
const char *TagLo, unsigned NumberLo,
|
const char *TagLo, unsigned NumberLo,
|
||||||
bool IsSmall) {
|
bool IsSmall) {
|
||||||
if (TAI->needsSet()) {
|
if (MAI->needsSet()) {
|
||||||
O << "\t.set\t";
|
O << "\t.set\t";
|
||||||
PrintLabelName("set", SetCounter, Flavor);
|
PrintLabelName("set", SetCounter, Flavor);
|
||||||
O << ",";
|
O << ",";
|
||||||
@ -108,11 +108,11 @@ void Dwarf::EmitSectionOffset(const char* Label, const char* Section,
|
|||||||
bool useSet) {
|
bool useSet) {
|
||||||
bool printAbsolute = false;
|
bool printAbsolute = false;
|
||||||
if (isEH)
|
if (isEH)
|
||||||
printAbsolute = TAI->isAbsoluteEHSectionOffsets();
|
printAbsolute = MAI->isAbsoluteEHSectionOffsets();
|
||||||
else
|
else
|
||||||
printAbsolute = TAI->isAbsoluteDebugSectionOffsets();
|
printAbsolute = MAI->isAbsoluteDebugSectionOffsets();
|
||||||
|
|
||||||
if (TAI->needsSet() && useSet) {
|
if (MAI->needsSet() && useSet) {
|
||||||
O << "\t.set\t";
|
O << "\t.set\t";
|
||||||
PrintLabelName("set", SetCounter, Flavor);
|
PrintLabelName("set", SetCounter, Flavor);
|
||||||
O << ",";
|
O << ",";
|
||||||
|
@ -43,9 +43,9 @@ namespace llvm {
|
|||||||
///
|
///
|
||||||
AsmPrinter *Asm;
|
AsmPrinter *Asm;
|
||||||
|
|
||||||
/// TAI - Target asm information.
|
/// MAI - Target asm information.
|
||||||
///
|
///
|
||||||
const MCAsmInfo *TAI;
|
const MCAsmInfo *MAI;
|
||||||
|
|
||||||
/// TD - Target data.
|
/// TD - Target data.
|
||||||
///
|
///
|
||||||
@ -88,7 +88,7 @@ namespace llvm {
|
|||||||
//
|
//
|
||||||
const AsmPrinter *getAsm() const { return Asm; }
|
const AsmPrinter *getAsm() const { return Asm; }
|
||||||
MachineModuleInfo *getMMI() const { return MMI; }
|
MachineModuleInfo *getMMI() const { return MMI; }
|
||||||
const MCAsmInfo *getMCAsmInfo() const { return TAI; }
|
const MCAsmInfo *getMCAsmInfo() const { return MAI; }
|
||||||
const TargetData *getTargetData() const { return TD; }
|
const TargetData *getTargetData() const { return TD; }
|
||||||
|
|
||||||
void PrintRelDirective(bool Force32Bit = false,
|
void PrintRelDirective(bool Force32Bit = false,
|
||||||
|
@ -30,10 +30,10 @@ namespace {
|
|||||||
class VISIBILITY_HIDDEN OcamlGCMetadataPrinter : public GCMetadataPrinter {
|
class VISIBILITY_HIDDEN OcamlGCMetadataPrinter : public GCMetadataPrinter {
|
||||||
public:
|
public:
|
||||||
void beginAssembly(raw_ostream &OS, AsmPrinter &AP,
|
void beginAssembly(raw_ostream &OS, AsmPrinter &AP,
|
||||||
const MCAsmInfo &TAI);
|
const MCAsmInfo &MAI);
|
||||||
|
|
||||||
void finishAssembly(raw_ostream &OS, AsmPrinter &AP,
|
void finishAssembly(raw_ostream &OS, AsmPrinter &AP,
|
||||||
const MCAsmInfo &TAI);
|
const MCAsmInfo &MAI);
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -44,11 +44,11 @@ Y("ocaml", "ocaml 3.10-compatible collector");
|
|||||||
void llvm::linkOcamlGCPrinter() { }
|
void llvm::linkOcamlGCPrinter() { }
|
||||||
|
|
||||||
static void EmitCamlGlobal(const Module &M, raw_ostream &OS, AsmPrinter &AP,
|
static void EmitCamlGlobal(const Module &M, raw_ostream &OS, AsmPrinter &AP,
|
||||||
const MCAsmInfo &TAI, const char *Id) {
|
const MCAsmInfo &MAI, const char *Id) {
|
||||||
const std::string &MId = M.getModuleIdentifier();
|
const std::string &MId = M.getModuleIdentifier();
|
||||||
|
|
||||||
std::string Mangled;
|
std::string Mangled;
|
||||||
Mangled += TAI.getGlobalPrefix();
|
Mangled += MAI.getGlobalPrefix();
|
||||||
Mangled += "caml";
|
Mangled += "caml";
|
||||||
size_t Letter = Mangled.size();
|
size_t Letter = Mangled.size();
|
||||||
Mangled.append(MId.begin(), std::find(MId.begin(), MId.end(), '.'));
|
Mangled.append(MId.begin(), std::find(MId.begin(), MId.end(), '.'));
|
||||||
@ -58,18 +58,18 @@ static void EmitCamlGlobal(const Module &M, raw_ostream &OS, AsmPrinter &AP,
|
|||||||
// Capitalize the first letter of the module name.
|
// Capitalize the first letter of the module name.
|
||||||
Mangled[Letter] = toupper(Mangled[Letter]);
|
Mangled[Letter] = toupper(Mangled[Letter]);
|
||||||
|
|
||||||
if (const char *GlobalDirective = TAI.getGlobalDirective())
|
if (const char *GlobalDirective = MAI.getGlobalDirective())
|
||||||
OS << GlobalDirective << Mangled << "\n";
|
OS << GlobalDirective << Mangled << "\n";
|
||||||
OS << Mangled << ":\n";
|
OS << Mangled << ":\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
void OcamlGCMetadataPrinter::beginAssembly(raw_ostream &OS, AsmPrinter &AP,
|
void OcamlGCMetadataPrinter::beginAssembly(raw_ostream &OS, AsmPrinter &AP,
|
||||||
const MCAsmInfo &TAI) {
|
const MCAsmInfo &MAI) {
|
||||||
AP.OutStreamer.SwitchSection(AP.getObjFileLowering().getTextSection());
|
AP.OutStreamer.SwitchSection(AP.getObjFileLowering().getTextSection());
|
||||||
EmitCamlGlobal(getModule(), OS, AP, TAI, "code_begin");
|
EmitCamlGlobal(getModule(), OS, AP, MAI, "code_begin");
|
||||||
|
|
||||||
AP.OutStreamer.SwitchSection(AP.getObjFileLowering().getDataSection());
|
AP.OutStreamer.SwitchSection(AP.getObjFileLowering().getDataSection());
|
||||||
EmitCamlGlobal(getModule(), OS, AP, TAI, "data_begin");
|
EmitCamlGlobal(getModule(), OS, AP, MAI, "data_begin");
|
||||||
}
|
}
|
||||||
|
|
||||||
/// emitAssembly - Print the frametable. The ocaml frametable format is thus:
|
/// emitAssembly - Print the frametable. The ocaml frametable format is thus:
|
||||||
@ -89,28 +89,28 @@ void OcamlGCMetadataPrinter::beginAssembly(raw_ostream &OS, AsmPrinter &AP,
|
|||||||
/// either condition is detected in a function which uses the GC.
|
/// either condition is detected in a function which uses the GC.
|
||||||
///
|
///
|
||||||
void OcamlGCMetadataPrinter::finishAssembly(raw_ostream &OS, AsmPrinter &AP,
|
void OcamlGCMetadataPrinter::finishAssembly(raw_ostream &OS, AsmPrinter &AP,
|
||||||
const MCAsmInfo &TAI) {
|
const MCAsmInfo &MAI) {
|
||||||
const char *AddressDirective;
|
const char *AddressDirective;
|
||||||
int AddressAlignLog;
|
int AddressAlignLog;
|
||||||
if (AP.TM.getTargetData()->getPointerSize() == sizeof(int32_t)) {
|
if (AP.TM.getTargetData()->getPointerSize() == sizeof(int32_t)) {
|
||||||
AddressDirective = TAI.getData32bitsDirective();
|
AddressDirective = MAI.getData32bitsDirective();
|
||||||
AddressAlignLog = 2;
|
AddressAlignLog = 2;
|
||||||
} else {
|
} else {
|
||||||
AddressDirective = TAI.getData64bitsDirective();
|
AddressDirective = MAI.getData64bitsDirective();
|
||||||
AddressAlignLog = 3;
|
AddressAlignLog = 3;
|
||||||
}
|
}
|
||||||
|
|
||||||
AP.OutStreamer.SwitchSection(AP.getObjFileLowering().getTextSection());
|
AP.OutStreamer.SwitchSection(AP.getObjFileLowering().getTextSection());
|
||||||
EmitCamlGlobal(getModule(), OS, AP, TAI, "code_end");
|
EmitCamlGlobal(getModule(), OS, AP, MAI, "code_end");
|
||||||
|
|
||||||
AP.OutStreamer.SwitchSection(AP.getObjFileLowering().getDataSection());
|
AP.OutStreamer.SwitchSection(AP.getObjFileLowering().getDataSection());
|
||||||
EmitCamlGlobal(getModule(), OS, AP, TAI, "data_end");
|
EmitCamlGlobal(getModule(), OS, AP, MAI, "data_end");
|
||||||
|
|
||||||
OS << AddressDirective << 0; // FIXME: Why does ocaml emit this??
|
OS << AddressDirective << 0; // FIXME: Why does ocaml emit this??
|
||||||
AP.EOL();
|
AP.EOL();
|
||||||
|
|
||||||
AP.OutStreamer.SwitchSection(AP.getObjFileLowering().getDataSection());
|
AP.OutStreamer.SwitchSection(AP.getObjFileLowering().getDataSection());
|
||||||
EmitCamlGlobal(getModule(), OS, AP, TAI, "frametable");
|
EmitCamlGlobal(getModule(), OS, AP, MAI, "frametable");
|
||||||
|
|
||||||
for (iterator I = begin(), IE = end(); I != IE; ++I) {
|
for (iterator I = begin(), IE = end(); I != IE; ++I) {
|
||||||
GCFunctionInfo &FI = **I;
|
GCFunctionInfo &FI = **I;
|
||||||
@ -126,7 +126,7 @@ void OcamlGCMetadataPrinter::finishAssembly(raw_ostream &OS, AsmPrinter &AP,
|
|||||||
llvm_report_error(Msg.str()); // Very rude!
|
llvm_report_error(Msg.str()); // Very rude!
|
||||||
}
|
}
|
||||||
|
|
||||||
OS << "\t" << TAI.getCommentString() << " live roots for "
|
OS << "\t" << MAI.getCommentString() << " live roots for "
|
||||||
<< FI.getFunction().getName() << "\n";
|
<< FI.getFunction().getName() << "\n";
|
||||||
|
|
||||||
for (GCFunctionInfo::iterator J = FI.begin(), JE = FI.end(); J != JE; ++J) {
|
for (GCFunctionInfo::iterator J = FI.begin(), JE = FI.end(); J != JE; ++J) {
|
||||||
@ -141,7 +141,7 @@ void OcamlGCMetadataPrinter::finishAssembly(raw_ostream &OS, AsmPrinter &AP,
|
|||||||
}
|
}
|
||||||
|
|
||||||
OS << AddressDirective
|
OS << AddressDirective
|
||||||
<< TAI.getPrivateGlobalPrefix() << "label" << J->Num;
|
<< MAI.getPrivateGlobalPrefix() << "label" << J->Num;
|
||||||
AP.EOL("call return address");
|
AP.EOL("call return address");
|
||||||
|
|
||||||
AP.EmitInt16(FrameSize);
|
AP.EmitInt16(FrameSize);
|
||||||
|
@ -80,7 +80,7 @@ ELFWriter::ELFWriter(raw_ostream &o, TargetMachine &tm)
|
|||||||
isLittleEndian(TM.getTargetData()->isLittleEndian()),
|
isLittleEndian(TM.getTargetData()->isLittleEndian()),
|
||||||
ElfHdr(isLittleEndian, is64Bit) {
|
ElfHdr(isLittleEndian, is64Bit) {
|
||||||
|
|
||||||
TAI = TM.getMCAsmInfo();
|
MAI = TM.getMCAsmInfo();
|
||||||
TEW = TM.getELFWriterInfo();
|
TEW = TM.getELFWriterInfo();
|
||||||
|
|
||||||
// Create the object code emitter object for this target.
|
// Create the object code emitter object for this target.
|
||||||
@ -687,7 +687,7 @@ bool ELFWriter::doFinalization(Module &M) {
|
|||||||
SymbolList.push_back(ELFSym::getExtSym(*I));
|
SymbolList.push_back(ELFSym::getExtSym(*I));
|
||||||
|
|
||||||
// Emit non-executable stack note
|
// Emit non-executable stack note
|
||||||
if (TAI->getNonexecutableStackDirective())
|
if (MAI->getNonexecutableStackDirective())
|
||||||
getNonExecStackSection();
|
getNonExecStackSection();
|
||||||
|
|
||||||
// Emit a symbol for each section created until now, skip null section
|
// Emit a symbol for each section created until now, skip null section
|
||||||
|
@ -86,9 +86,9 @@ namespace llvm {
|
|||||||
/// and other object file specific stuff
|
/// and other object file specific stuff
|
||||||
const TargetLoweringObjectFile &TLOF;
|
const TargetLoweringObjectFile &TLOF;
|
||||||
|
|
||||||
/// TAI - Target Asm Info, provide information about section names for
|
/// MAI - Target Asm Info, provide information about section names for
|
||||||
/// globals and other target specific stuff.
|
/// globals and other target specific stuff.
|
||||||
const MCAsmInfo *TAI;
|
const MCAsmInfo *MAI;
|
||||||
|
|
||||||
//===------------------------------------------------------------------===//
|
//===------------------------------------------------------------------===//
|
||||||
// Properties inferred automatically from the target machine.
|
// Properties inferred automatically from the target machine.
|
||||||
@ -118,7 +118,7 @@ namespace llvm {
|
|||||||
unsigned NumSections; // Always = SectionList.size()
|
unsigned NumSections; // Always = SectionList.size()
|
||||||
|
|
||||||
/// SectionLookup - This is a mapping from section name to section number in
|
/// SectionLookup - This is a mapping from section name to section number in
|
||||||
/// the SectionList. Used to quickly gather the Section Index from TAI names
|
/// the SectionList. Used to quickly gather the Section Index from MAI names
|
||||||
std::map<std::string, ELFSection*> SectionLookup;
|
std::map<std::string, ELFSection*> SectionLookup;
|
||||||
|
|
||||||
/// PendingGlobals - Globals not processed as symbols yet.
|
/// PendingGlobals - Globals not processed as symbols yet.
|
||||||
|
@ -20,11 +20,11 @@ GCMetadataPrinter::GCMetadataPrinter() { }
|
|||||||
GCMetadataPrinter::~GCMetadataPrinter() { }
|
GCMetadataPrinter::~GCMetadataPrinter() { }
|
||||||
|
|
||||||
void GCMetadataPrinter::beginAssembly(raw_ostream &OS, AsmPrinter &AP,
|
void GCMetadataPrinter::beginAssembly(raw_ostream &OS, AsmPrinter &AP,
|
||||||
const MCAsmInfo &TAI) {
|
const MCAsmInfo &MAI) {
|
||||||
// Default is no action.
|
// Default is no action.
|
||||||
}
|
}
|
||||||
|
|
||||||
void GCMetadataPrinter::finishAssembly(raw_ostream &OS, AsmPrinter &AP,
|
void GCMetadataPrinter::finishAssembly(raw_ostream &OS, AsmPrinter &AP,
|
||||||
const MCAsmInfo &TAI) {
|
const MCAsmInfo &MAI) {
|
||||||
// Default is no action.
|
// Default is no action.
|
||||||
}
|
}
|
||||||
|
@ -68,7 +68,7 @@ struct MachOSym {
|
|||||||
};
|
};
|
||||||
|
|
||||||
MachOSym(const GlobalValue *gv, std::string name, uint8_t sect,
|
MachOSym(const GlobalValue *gv, std::string name, uint8_t sect,
|
||||||
const MCAsmInfo *TAI);
|
const MCAsmInfo *MAI);
|
||||||
|
|
||||||
struct SymCmp {
|
struct SymCmp {
|
||||||
// FIXME: this does not appear to be sorting 'f' after 'F'
|
// FIXME: this does not appear to be sorting 'f' after 'F'
|
||||||
|
@ -35,7 +35,7 @@ MachOCodeEmitter::MachOCodeEmitter(MachOWriter &mow, MachOSection &mos) :
|
|||||||
ObjectCodeEmitter(&mos), MOW(mow), TM(MOW.TM) {
|
ObjectCodeEmitter(&mos), MOW(mow), TM(MOW.TM) {
|
||||||
is64Bit = TM.getTargetData()->getPointerSizeInBits() == 64;
|
is64Bit = TM.getTargetData()->getPointerSizeInBits() == 64;
|
||||||
isLittleEndian = TM.getTargetData()->isLittleEndian();
|
isLittleEndian = TM.getTargetData()->isLittleEndian();
|
||||||
TAI = TM.getMCAsmInfo();
|
MAI = TM.getMCAsmInfo();
|
||||||
}
|
}
|
||||||
|
|
||||||
/// startFunction - This callback is invoked when a new machine function is
|
/// startFunction - This callback is invoked when a new machine function is
|
||||||
@ -61,7 +61,7 @@ void MachOCodeEmitter::startFunction(MachineFunction &MF) {
|
|||||||
|
|
||||||
// Create symbol for function entry
|
// Create symbol for function entry
|
||||||
const GlobalValue *FuncV = MF.getFunction();
|
const GlobalValue *FuncV = MF.getFunction();
|
||||||
MachOSym FnSym(FuncV, MOW.Mang->getMangledName(FuncV), MOS->Index, TAI);
|
MachOSym FnSym(FuncV, MOW.Mang->getMangledName(FuncV), MOS->Index, MAI);
|
||||||
FnSym.n_value = getCurrentPCOffset();
|
FnSym.n_value = getCurrentPCOffset();
|
||||||
|
|
||||||
// add it to the symtab.
|
// add it to the symtab.
|
||||||
|
@ -30,7 +30,7 @@ class MachOCodeEmitter : public ObjectCodeEmitter {
|
|||||||
/// machine directly, indicating what header values and flags to set.
|
/// machine directly, indicating what header values and flags to set.
|
||||||
bool is64Bit, isLittleEndian;
|
bool is64Bit, isLittleEndian;
|
||||||
|
|
||||||
const MCAsmInfo *TAI;
|
const MCAsmInfo *MAI;
|
||||||
|
|
||||||
/// Relocations - These are the relocations that the function needs, as
|
/// Relocations - These are the relocations that the function needs, as
|
||||||
/// emitted.
|
/// emitted.
|
||||||
|
@ -61,7 +61,7 @@ MachOWriter::MachOWriter(raw_ostream &o, TargetMachine &tm)
|
|||||||
is64Bit = TM.getTargetData()->getPointerSizeInBits() == 64;
|
is64Bit = TM.getTargetData()->getPointerSizeInBits() == 64;
|
||||||
isLittleEndian = TM.getTargetData()->isLittleEndian();
|
isLittleEndian = TM.getTargetData()->isLittleEndian();
|
||||||
|
|
||||||
TAI = TM.getMCAsmInfo();
|
MAI = TM.getMCAsmInfo();
|
||||||
|
|
||||||
// Create the machine code emitter object for this target.
|
// Create the machine code emitter object for this target.
|
||||||
MachOCE = new MachOCodeEmitter(*this, *getTextSection(true));
|
MachOCE = new MachOCodeEmitter(*this, *getTextSection(true));
|
||||||
@ -221,7 +221,7 @@ void MachOWriter::AddSymbolToSection(MachOSection *Sec, GlobalVariable *GV) {
|
|||||||
}
|
}
|
||||||
// Globals without external linkage apparently do not go in the symbol table.
|
// Globals without external linkage apparently do not go in the symbol table.
|
||||||
if (!GV->hasLocalLinkage()) {
|
if (!GV->hasLocalLinkage()) {
|
||||||
MachOSym Sym(GV, Mang->getMangledName(GV), Sec->Index, TAI);
|
MachOSym Sym(GV, Mang->getMangledName(GV), Sec->Index, MAI);
|
||||||
Sym.n_value = Sec->size();
|
Sym.n_value = Sec->size();
|
||||||
SymbolTable.push_back(Sym);
|
SymbolTable.push_back(Sym);
|
||||||
}
|
}
|
||||||
@ -256,7 +256,7 @@ void MachOWriter::EmitGlobal(GlobalVariable *GV) {
|
|||||||
if (NoInit || GV->hasLinkOnceLinkage() || GV->hasWeakLinkage() ||
|
if (NoInit || GV->hasLinkOnceLinkage() || GV->hasWeakLinkage() ||
|
||||||
GV->hasCommonLinkage()) {
|
GV->hasCommonLinkage()) {
|
||||||
MachOSym ExtOrCommonSym(GV, Mang->getMangledName(GV),
|
MachOSym ExtOrCommonSym(GV, Mang->getMangledName(GV),
|
||||||
MachOSym::NO_SECT, TAI);
|
MachOSym::NO_SECT, MAI);
|
||||||
// For undefined (N_UNDF) external (N_EXT) types, n_value is the size in
|
// For undefined (N_UNDF) external (N_EXT) types, n_value is the size in
|
||||||
// bytes of the symbol.
|
// bytes of the symbol.
|
||||||
ExtOrCommonSym.n_value = Size;
|
ExtOrCommonSym.n_value = Size;
|
||||||
@ -454,7 +454,7 @@ void MachOWriter::BufferSymbolAndStringTable() {
|
|||||||
for (std::vector<GlobalValue*>::iterator I = PendingGlobals.begin(),
|
for (std::vector<GlobalValue*>::iterator I = PendingGlobals.begin(),
|
||||||
E = PendingGlobals.end(); I != E; ++I) {
|
E = PendingGlobals.end(); I != E; ++I) {
|
||||||
if (GVOffset[*I] == 0 && GVSection[*I] == 0) {
|
if (GVOffset[*I] == 0 && GVSection[*I] == 0) {
|
||||||
MachOSym UndfSym(*I, Mang->getMangledName(*I), MachOSym::NO_SECT, TAI);
|
MachOSym UndfSym(*I, Mang->getMangledName(*I), MachOSym::NO_SECT, MAI);
|
||||||
SymbolTable.push_back(UndfSym);
|
SymbolTable.push_back(UndfSym);
|
||||||
GVOffset[*I] = -1;
|
GVOffset[*I] = -1;
|
||||||
}
|
}
|
||||||
@ -743,7 +743,7 @@ void MachOWriter::InitMem(const Constant *C, uintptr_t Offset,
|
|||||||
//===----------------------------------------------------------------------===//
|
//===----------------------------------------------------------------------===//
|
||||||
|
|
||||||
MachOSym::MachOSym(const GlobalValue *gv, std::string name, uint8_t sect,
|
MachOSym::MachOSym(const GlobalValue *gv, std::string name, uint8_t sect,
|
||||||
const MCAsmInfo *TAI) :
|
const MCAsmInfo *MAI) :
|
||||||
GV(gv), n_strx(0), n_type(sect == NO_SECT ? N_UNDF : N_SECT), n_sect(sect),
|
GV(gv), n_strx(0), n_type(sect == NO_SECT ? N_UNDF : N_SECT), n_sect(sect),
|
||||||
n_desc(0), n_value(0) {
|
n_desc(0), n_value(0) {
|
||||||
|
|
||||||
@ -759,17 +759,17 @@ MachOSym::MachOSym(const GlobalValue *gv, std::string name, uint8_t sect,
|
|||||||
case GlobalValue::CommonLinkage:
|
case GlobalValue::CommonLinkage:
|
||||||
assert(!isa<Function>(gv) && "Unexpected linkage type for Function!");
|
assert(!isa<Function>(gv) && "Unexpected linkage type for Function!");
|
||||||
case GlobalValue::ExternalLinkage:
|
case GlobalValue::ExternalLinkage:
|
||||||
GVName = TAI->getGlobalPrefix() + name;
|
GVName = MAI->getGlobalPrefix() + name;
|
||||||
n_type |= GV->hasHiddenVisibility() ? N_PEXT : N_EXT;
|
n_type |= GV->hasHiddenVisibility() ? N_PEXT : N_EXT;
|
||||||
break;
|
break;
|
||||||
case GlobalValue::PrivateLinkage:
|
case GlobalValue::PrivateLinkage:
|
||||||
GVName = TAI->getPrivateGlobalPrefix() + name;
|
GVName = MAI->getPrivateGlobalPrefix() + name;
|
||||||
break;
|
break;
|
||||||
case GlobalValue::LinkerPrivateLinkage:
|
case GlobalValue::LinkerPrivateLinkage:
|
||||||
GVName = TAI->getLinkerPrivateGlobalPrefix() + name;
|
GVName = MAI->getLinkerPrivateGlobalPrefix() + name;
|
||||||
break;
|
break;
|
||||||
case GlobalValue::InternalLinkage:
|
case GlobalValue::InternalLinkage:
|
||||||
GVName = TAI->getGlobalPrefix() + name;
|
GVName = MAI->getGlobalPrefix() + name;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -78,7 +78,7 @@ namespace llvm {
|
|||||||
bool is64Bit, isLittleEndian;
|
bool is64Bit, isLittleEndian;
|
||||||
|
|
||||||
// Target Asm Info
|
// Target Asm Info
|
||||||
const MCAsmInfo *TAI;
|
const MCAsmInfo *MAI;
|
||||||
|
|
||||||
/// Header - An instance of MachOHeader that we will update while we build
|
/// Header - An instance of MachOHeader that we will update while we build
|
||||||
/// the file, and then emit during finalization.
|
/// the file, and then emit during finalization.
|
||||||
|
@ -66,7 +66,7 @@ MCAsmInfo::MCAsmInfo() {
|
|||||||
UsedDirective = 0;
|
UsedDirective = 0;
|
||||||
WeakRefDirective = 0;
|
WeakRefDirective = 0;
|
||||||
WeakDefDirective = 0;
|
WeakDefDirective = 0;
|
||||||
// FIXME: These are ELFish - move to ELFTAI.
|
// FIXME: These are ELFish - move to ELFMAI.
|
||||||
HiddenDirective = "\t.hidden\t";
|
HiddenDirective = "\t.hidden\t";
|
||||||
ProtectedDirective = "\t.protected\t";
|
ProtectedDirective = "\t.protected\t";
|
||||||
AbsoluteDebugSectionOffsets = false;
|
AbsoluteDebugSectionOffsets = false;
|
||||||
|
@ -24,12 +24,12 @@ namespace {
|
|||||||
|
|
||||||
class MCAsmStreamer : public MCStreamer {
|
class MCAsmStreamer : public MCStreamer {
|
||||||
raw_ostream &OS;
|
raw_ostream &OS;
|
||||||
const MCAsmInfo &TAI;
|
const MCAsmInfo &MAI;
|
||||||
AsmPrinter *Printer;
|
AsmPrinter *Printer;
|
||||||
public:
|
public:
|
||||||
MCAsmStreamer(MCContext &Context, raw_ostream &_OS, const MCAsmInfo &tai,
|
MCAsmStreamer(MCContext &Context, raw_ostream &_OS, const MCAsmInfo &tai,
|
||||||
AsmPrinter *_AsmPrinter)
|
AsmPrinter *_AsmPrinter)
|
||||||
: MCStreamer(Context), OS(_OS), TAI(tai), Printer(_AsmPrinter) {}
|
: MCStreamer(Context), OS(_OS), MAI(tai), Printer(_AsmPrinter) {}
|
||||||
~MCAsmStreamer() {}
|
~MCAsmStreamer() {}
|
||||||
|
|
||||||
/// @name MCStreamer Interface
|
/// @name MCStreamer Interface
|
||||||
@ -102,7 +102,7 @@ void MCAsmStreamer::SwitchSection(const MCSection *Section) {
|
|||||||
assert(Section && "Cannot switch to a null section!");
|
assert(Section && "Cannot switch to a null section!");
|
||||||
if (Section != CurSection) {
|
if (Section != CurSection) {
|
||||||
CurSection = Section;
|
CurSection = Section;
|
||||||
Section->PrintSwitchToSection(TAI, OS);
|
Section->PrintSwitchToSection(MAI, OS);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -230,14 +230,14 @@ void MCAsmStreamer::EmitValueToAlignment(unsigned ByteAlignment, int64_t Value,
|
|||||||
if (isPowerOf2_32(ByteAlignment)) {
|
if (isPowerOf2_32(ByteAlignment)) {
|
||||||
switch (ValueSize) {
|
switch (ValueSize) {
|
||||||
default: llvm_unreachable("Invalid size for machine code value!");
|
default: llvm_unreachable("Invalid size for machine code value!");
|
||||||
case 1: OS << TAI.getAlignDirective(); break;
|
case 1: OS << MAI.getAlignDirective(); break;
|
||||||
// FIXME: use TAI for this!
|
// FIXME: use MAI for this!
|
||||||
case 2: OS << ".p2alignw "; break;
|
case 2: OS << ".p2alignw "; break;
|
||||||
case 4: OS << ".p2alignl "; break;
|
case 4: OS << ".p2alignl "; break;
|
||||||
case 8: llvm_unreachable("Unsupported alignment size!");
|
case 8: llvm_unreachable("Unsupported alignment size!");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (TAI.getAlignmentIsInBytes())
|
if (MAI.getAlignmentIsInBytes())
|
||||||
OS << ByteAlignment;
|
OS << ByteAlignment;
|
||||||
else
|
else
|
||||||
OS << Log2_32(ByteAlignment);
|
OS << Log2_32(ByteAlignment);
|
||||||
@ -253,7 +253,7 @@ void MCAsmStreamer::EmitValueToAlignment(unsigned ByteAlignment, int64_t Value,
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Non-power of two alignment. This is not widely supported by assemblers.
|
// Non-power of two alignment. This is not widely supported by assemblers.
|
||||||
// FIXME: Parameterize this based on TAI.
|
// FIXME: Parameterize this based on MAI.
|
||||||
switch (ValueSize) {
|
switch (ValueSize) {
|
||||||
default: llvm_unreachable("Invalid size for machine code value!");
|
default: llvm_unreachable("Invalid size for machine code value!");
|
||||||
case 1: OS << ".balign"; break;
|
case 1: OS << ".balign"; break;
|
||||||
@ -314,6 +314,6 @@ void MCAsmStreamer::Finish() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
MCStreamer *llvm::createAsmStreamer(MCContext &Context, raw_ostream &OS,
|
MCStreamer *llvm::createAsmStreamer(MCContext &Context, raw_ostream &OS,
|
||||||
const MCAsmInfo &TAI, AsmPrinter *AP) {
|
const MCAsmInfo &MAI, AsmPrinter *AP) {
|
||||||
return new MCAsmStreamer(Context, OS, TAI, AP);
|
return new MCAsmStreamer(Context, OS, MAI, AP);
|
||||||
}
|
}
|
||||||
|
@ -29,7 +29,7 @@ Create(const StringRef &Name, bool IsDirective, SectionKind K, MCContext &Ctx) {
|
|||||||
return new (Ctx) MCSectionCOFF(Name, IsDirective, K);
|
return new (Ctx) MCSectionCOFF(Name, IsDirective, K);
|
||||||
}
|
}
|
||||||
|
|
||||||
void MCSectionCOFF::PrintSwitchToSection(const MCAsmInfo &TAI,
|
void MCSectionCOFF::PrintSwitchToSection(const MCAsmInfo &MAI,
|
||||||
raw_ostream &OS) const {
|
raw_ostream &OS) const {
|
||||||
|
|
||||||
if (isDirective()) {
|
if (isDirective()) {
|
||||||
|
@ -23,13 +23,13 @@ Create(const StringRef &Section, unsigned Type, unsigned Flags,
|
|||||||
// ShouldOmitSectionDirective - Decides whether a '.section' directive
|
// ShouldOmitSectionDirective - Decides whether a '.section' directive
|
||||||
// should be printed before the section name
|
// should be printed before the section name
|
||||||
bool MCSectionELF::ShouldOmitSectionDirective(const char *Name,
|
bool MCSectionELF::ShouldOmitSectionDirective(const char *Name,
|
||||||
const MCAsmInfo &TAI) const {
|
const MCAsmInfo &MAI) const {
|
||||||
|
|
||||||
// FIXME: Does .section .bss/.data/.text work everywhere??
|
// FIXME: Does .section .bss/.data/.text work everywhere??
|
||||||
if (strcmp(Name, ".text") == 0 ||
|
if (strcmp(Name, ".text") == 0 ||
|
||||||
strcmp(Name, ".data") == 0 ||
|
strcmp(Name, ".data") == 0 ||
|
||||||
(strcmp(Name, ".bss") == 0 &&
|
(strcmp(Name, ".bss") == 0 &&
|
||||||
!TAI.usesELFSectionDirectiveForBSS()))
|
!MAI.usesELFSectionDirectiveForBSS()))
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
@ -44,10 +44,10 @@ bool MCSectionELF::ShouldPrintSectionType(unsigned Ty) const {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void MCSectionELF::PrintSwitchToSection(const MCAsmInfo &TAI,
|
void MCSectionELF::PrintSwitchToSection(const MCAsmInfo &MAI,
|
||||||
raw_ostream &OS) const {
|
raw_ostream &OS) const {
|
||||||
|
|
||||||
if (ShouldOmitSectionDirective(SectionName.c_str(), TAI)) {
|
if (ShouldOmitSectionDirective(SectionName.c_str(), MAI)) {
|
||||||
OS << '\t' << getSectionName() << '\n';
|
OS << '\t' << getSectionName() << '\n';
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -55,7 +55,7 @@ void MCSectionELF::PrintSwitchToSection(const MCAsmInfo &TAI,
|
|||||||
OS << "\t.section\t" << getSectionName();
|
OS << "\t.section\t" << getSectionName();
|
||||||
|
|
||||||
// Handle the weird solaris syntax if desired.
|
// Handle the weird solaris syntax if desired.
|
||||||
if (TAI.usesSunStyleELFSectionSwitchSyntax() &&
|
if (MAI.usesSunStyleELFSectionSwitchSyntax() &&
|
||||||
!(Flags & MCSectionELF::SHF_MERGE)) {
|
!(Flags & MCSectionELF::SHF_MERGE)) {
|
||||||
if (Flags & MCSectionELF::SHF_ALLOC)
|
if (Flags & MCSectionELF::SHF_ALLOC)
|
||||||
OS << ",#alloc";
|
OS << ",#alloc";
|
||||||
@ -82,7 +82,7 @@ void MCSectionELF::PrintSwitchToSection(const MCAsmInfo &TAI,
|
|||||||
|
|
||||||
// If there are target-specific flags, print them.
|
// If there are target-specific flags, print them.
|
||||||
if (Flags & ~MCSectionELF::TARGET_INDEP_SHF)
|
if (Flags & ~MCSectionELF::TARGET_INDEP_SHF)
|
||||||
PrintTargetSpecificSectionFlags(TAI, OS);
|
PrintTargetSpecificSectionFlags(MAI, OS);
|
||||||
|
|
||||||
OS << '"';
|
OS << '"';
|
||||||
|
|
||||||
@ -90,7 +90,7 @@ void MCSectionELF::PrintSwitchToSection(const MCAsmInfo &TAI,
|
|||||||
OS << ',';
|
OS << ',';
|
||||||
|
|
||||||
// If comment string is '@', e.g. as on ARM - use '%' instead
|
// If comment string is '@', e.g. as on ARM - use '%' instead
|
||||||
if (TAI.getCommentString()[0] == '@')
|
if (MAI.getCommentString()[0] == '@')
|
||||||
OS << '%';
|
OS << '%';
|
||||||
else
|
else
|
||||||
OS << '@';
|
OS << '@';
|
||||||
|
@ -72,7 +72,7 @@ Create(const StringRef &Segment, const StringRef &Section,
|
|||||||
Reserved2, K);
|
Reserved2, K);
|
||||||
}
|
}
|
||||||
|
|
||||||
void MCSectionMachO::PrintSwitchToSection(const MCAsmInfo &TAI,
|
void MCSectionMachO::PrintSwitchToSection(const MCAsmInfo &MAI,
|
||||||
raw_ostream &OS) const {
|
raw_ostream &OS) const {
|
||||||
OS << "\t.section\t" << getSegmentName() << ',' << getSectionName();
|
OS << "\t.section\t" << getSegmentName() << ',' << getSectionName();
|
||||||
|
|
||||||
|
@ -405,7 +405,7 @@ static unsigned getNumJTEntries(const std::vector<MachineJumpTableEntry> &JT,
|
|||||||
unsigned ARMBaseInstrInfo::GetInstSizeInBytes(const MachineInstr *MI) const {
|
unsigned ARMBaseInstrInfo::GetInstSizeInBytes(const MachineInstr *MI) const {
|
||||||
const MachineBasicBlock &MBB = *MI->getParent();
|
const MachineBasicBlock &MBB = *MI->getParent();
|
||||||
const MachineFunction *MF = MBB.getParent();
|
const MachineFunction *MF = MBB.getParent();
|
||||||
const MCAsmInfo *TAI = MF->getTarget().getMCAsmInfo();
|
const MCAsmInfo *MAI = MF->getTarget().getMCAsmInfo();
|
||||||
|
|
||||||
// Basic size info comes from the TSFlags field.
|
// Basic size info comes from the TSFlags field.
|
||||||
const TargetInstrDesc &TID = MI->getDesc();
|
const TargetInstrDesc &TID = MI->getDesc();
|
||||||
@ -416,7 +416,7 @@ unsigned ARMBaseInstrInfo::GetInstSizeInBytes(const MachineInstr *MI) const {
|
|||||||
default: {
|
default: {
|
||||||
// If this machine instr is an inline asm, measure it.
|
// If this machine instr is an inline asm, measure it.
|
||||||
if (MI->getOpcode() == ARM::INLINEASM)
|
if (MI->getOpcode() == ARM::INLINEASM)
|
||||||
return getInlineAsmLength(MI->getOperand(0).getSymbolName(), *TAI);
|
return getInlineAsmLength(MI->getOperand(0).getSymbolName(), *MAI);
|
||||||
if (MI->isLabel())
|
if (MI->isLabel())
|
||||||
return 0;
|
return 0;
|
||||||
switch (Opc) {
|
switch (Opc) {
|
||||||
|
@ -221,7 +221,7 @@ namespace {
|
|||||||
|
|
||||||
if (ACPV->hasModifier()) O << "(" << ACPV->getModifier() << ")";
|
if (ACPV->hasModifier()) O << "(" << ACPV->getModifier() << ")";
|
||||||
if (ACPV->getPCAdjustment() != 0) {
|
if (ACPV->getPCAdjustment() != 0) {
|
||||||
O << "-(" << TAI->getPrivateGlobalPrefix() << "PC"
|
O << "-(" << MAI->getPrivateGlobalPrefix() << "PC"
|
||||||
<< ACPV->getLabelId()
|
<< ACPV->getLabelId()
|
||||||
<< "+" << (unsigned)ACPV->getPCAdjustment();
|
<< "+" << (unsigned)ACPV->getPCAdjustment();
|
||||||
if (ACPV->mustAddCurrentAddress())
|
if (ACPV->mustAddCurrentAddress())
|
||||||
@ -280,7 +280,7 @@ bool ARMAsmPrinter::runOnMachineFunction(MachineFunction &MF) {
|
|||||||
O << "\t.globl\t" << CurrentFnName << "\n";
|
O << "\t.globl\t" << CurrentFnName << "\n";
|
||||||
O << "\t.weak_definition\t" << CurrentFnName << "\n";
|
O << "\t.weak_definition\t" << CurrentFnName << "\n";
|
||||||
} else {
|
} else {
|
||||||
O << TAI->getWeakRefDirective() << CurrentFnName << "\n";
|
O << MAI->getWeakRefDirective() << CurrentFnName << "\n";
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -328,7 +328,7 @@ bool ARMAsmPrinter::runOnMachineFunction(MachineFunction &MF) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (TAI->hasDotTypeDotSizeDirective())
|
if (MAI->hasDotTypeDotSizeDirective())
|
||||||
O << "\t.size " << CurrentFnName << ", .-" << CurrentFnName << "\n";
|
O << "\t.size " << CurrentFnName << ", .-" << CurrentFnName << "\n";
|
||||||
|
|
||||||
// Emit post-function debug information.
|
// Emit post-function debug information.
|
||||||
@ -410,11 +410,11 @@ void ARMAsmPrinter::printOperand(const MachineInstr *MI, int OpNum,
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case MachineOperand::MO_ConstantPoolIndex:
|
case MachineOperand::MO_ConstantPoolIndex:
|
||||||
O << TAI->getPrivateGlobalPrefix() << "CPI" << getFunctionNumber()
|
O << MAI->getPrivateGlobalPrefix() << "CPI" << getFunctionNumber()
|
||||||
<< '_' << MO.getIndex();
|
<< '_' << MO.getIndex();
|
||||||
break;
|
break;
|
||||||
case MachineOperand::MO_JumpTableIndex:
|
case MachineOperand::MO_JumpTableIndex:
|
||||||
O << TAI->getPrivateGlobalPrefix() << "JTI" << getFunctionNumber()
|
O << MAI->getPrivateGlobalPrefix() << "JTI" << getFunctionNumber()
|
||||||
<< '_' << MO.getIndex();
|
<< '_' << MO.getIndex();
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
@ -423,7 +423,7 @@ void ARMAsmPrinter::printOperand(const MachineInstr *MI, int OpNum,
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void printSOImm(formatted_raw_ostream &O, int64_t V, bool VerboseAsm,
|
static void printSOImm(formatted_raw_ostream &O, int64_t V, bool VerboseAsm,
|
||||||
const MCAsmInfo *TAI) {
|
const MCAsmInfo *MAI) {
|
||||||
// Break it up into two parts that make up a shifter immediate.
|
// Break it up into two parts that make up a shifter immediate.
|
||||||
V = ARM_AM::getSOImmVal(V);
|
V = ARM_AM::getSOImmVal(V);
|
||||||
assert(V != -1 && "Not a valid so_imm value!");
|
assert(V != -1 && "Not a valid so_imm value!");
|
||||||
@ -437,7 +437,7 @@ static void printSOImm(formatted_raw_ostream &O, int64_t V, bool VerboseAsm,
|
|||||||
O << "#" << Imm << ", " << Rot;
|
O << "#" << Imm << ", " << Rot;
|
||||||
// Pretty printed version.
|
// Pretty printed version.
|
||||||
if (VerboseAsm)
|
if (VerboseAsm)
|
||||||
O << ' ' << TAI->getCommentString()
|
O << ' ' << MAI->getCommentString()
|
||||||
<< ' ' << (int)ARM_AM::rotr32(Imm, Rot);
|
<< ' ' << (int)ARM_AM::rotr32(Imm, Rot);
|
||||||
} else {
|
} else {
|
||||||
O << "#" << Imm;
|
O << "#" << Imm;
|
||||||
@ -449,7 +449,7 @@ static void printSOImm(formatted_raw_ostream &O, int64_t V, bool VerboseAsm,
|
|||||||
void ARMAsmPrinter::printSOImmOperand(const MachineInstr *MI, int OpNum) {
|
void ARMAsmPrinter::printSOImmOperand(const MachineInstr *MI, int OpNum) {
|
||||||
const MachineOperand &MO = MI->getOperand(OpNum);
|
const MachineOperand &MO = MI->getOperand(OpNum);
|
||||||
assert(MO.isImm() && "Not a valid so_imm value!");
|
assert(MO.isImm() && "Not a valid so_imm value!");
|
||||||
printSOImm(O, MO.getImm(), VerboseAsm, TAI);
|
printSOImm(O, MO.getImm(), VerboseAsm, MAI);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// printSOImm2PartOperand - SOImm is broken into two pieces using a 'mov'
|
/// printSOImm2PartOperand - SOImm is broken into two pieces using a 'mov'
|
||||||
@ -459,7 +459,7 @@ void ARMAsmPrinter::printSOImm2PartOperand(const MachineInstr *MI, int OpNum) {
|
|||||||
assert(MO.isImm() && "Not a valid so_imm value!");
|
assert(MO.isImm() && "Not a valid so_imm value!");
|
||||||
unsigned V1 = ARM_AM::getSOImmTwoPartFirst(MO.getImm());
|
unsigned V1 = ARM_AM::getSOImmTwoPartFirst(MO.getImm());
|
||||||
unsigned V2 = ARM_AM::getSOImmTwoPartSecond(MO.getImm());
|
unsigned V2 = ARM_AM::getSOImmTwoPartSecond(MO.getImm());
|
||||||
printSOImm(O, V1, VerboseAsm, TAI);
|
printSOImm(O, V1, VerboseAsm, MAI);
|
||||||
O << "\n\torr";
|
O << "\n\torr";
|
||||||
printPredicateOperand(MI, 2);
|
printPredicateOperand(MI, 2);
|
||||||
O << " ";
|
O << " ";
|
||||||
@ -467,7 +467,7 @@ void ARMAsmPrinter::printSOImm2PartOperand(const MachineInstr *MI, int OpNum) {
|
|||||||
O << ", ";
|
O << ", ";
|
||||||
printOperand(MI, 0);
|
printOperand(MI, 0);
|
||||||
O << ", ";
|
O << ", ";
|
||||||
printSOImm(O, V2, VerboseAsm, TAI);
|
printSOImm(O, V2, VerboseAsm, MAI);
|
||||||
}
|
}
|
||||||
|
|
||||||
// so_reg is a 4-operand unit corresponding to register forms of the A5.1
|
// so_reg is a 4-operand unit corresponding to register forms of the A5.1
|
||||||
@ -881,7 +881,7 @@ void ARMAsmPrinter::printSBitModifierOperand(const MachineInstr *MI, int OpNum){
|
|||||||
|
|
||||||
void ARMAsmPrinter::printPCLabel(const MachineInstr *MI, int OpNum) {
|
void ARMAsmPrinter::printPCLabel(const MachineInstr *MI, int OpNum) {
|
||||||
int Id = (int)MI->getOperand(OpNum).getImm();
|
int Id = (int)MI->getOperand(OpNum).getImm();
|
||||||
O << TAI->getPrivateGlobalPrefix() << "PC" << Id;
|
O << MAI->getPrivateGlobalPrefix() << "PC" << Id;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ARMAsmPrinter::printRegisterList(const MachineInstr *MI, int OpNum) {
|
void ARMAsmPrinter::printRegisterList(const MachineInstr *MI, int OpNum) {
|
||||||
@ -902,7 +902,7 @@ void ARMAsmPrinter::printCPInstOperand(const MachineInstr *MI, int OpNum,
|
|||||||
// data itself.
|
// data itself.
|
||||||
if (!strcmp(Modifier, "label")) {
|
if (!strcmp(Modifier, "label")) {
|
||||||
unsigned ID = MI->getOperand(OpNum).getImm();
|
unsigned ID = MI->getOperand(OpNum).getImm();
|
||||||
O << TAI->getPrivateGlobalPrefix() << "CPI" << getFunctionNumber()
|
O << MAI->getPrivateGlobalPrefix() << "CPI" << getFunctionNumber()
|
||||||
<< '_' << ID << ":\n";
|
<< '_' << ID << ":\n";
|
||||||
} else {
|
} else {
|
||||||
assert(!strcmp(Modifier, "cpentry") && "Unknown modifier for CPE");
|
assert(!strcmp(Modifier, "cpentry") && "Unknown modifier for CPE");
|
||||||
@ -924,16 +924,16 @@ void ARMAsmPrinter::printJTBlockOperand(const MachineInstr *MI, int OpNum) {
|
|||||||
const MachineOperand &MO1 = MI->getOperand(OpNum);
|
const MachineOperand &MO1 = MI->getOperand(OpNum);
|
||||||
const MachineOperand &MO2 = MI->getOperand(OpNum+1); // Unique Id
|
const MachineOperand &MO2 = MI->getOperand(OpNum+1); // Unique Id
|
||||||
unsigned JTI = MO1.getIndex();
|
unsigned JTI = MO1.getIndex();
|
||||||
O << TAI->getPrivateGlobalPrefix() << "JTI" << getFunctionNumber()
|
O << MAI->getPrivateGlobalPrefix() << "JTI" << getFunctionNumber()
|
||||||
<< '_' << JTI << '_' << MO2.getImm() << ":\n";
|
<< '_' << JTI << '_' << MO2.getImm() << ":\n";
|
||||||
|
|
||||||
const char *JTEntryDirective = TAI->getData32bitsDirective();
|
const char *JTEntryDirective = MAI->getData32bitsDirective();
|
||||||
|
|
||||||
const MachineFunction *MF = MI->getParent()->getParent();
|
const MachineFunction *MF = MI->getParent()->getParent();
|
||||||
const MachineJumpTableInfo *MJTI = MF->getJumpTableInfo();
|
const MachineJumpTableInfo *MJTI = MF->getJumpTableInfo();
|
||||||
const std::vector<MachineJumpTableEntry> &JT = MJTI->getJumpTables();
|
const std::vector<MachineJumpTableEntry> &JT = MJTI->getJumpTables();
|
||||||
const std::vector<MachineBasicBlock*> &JTBBs = JT[JTI].MBBs;
|
const std::vector<MachineBasicBlock*> &JTBBs = JT[JTI].MBBs;
|
||||||
bool UseSet= TAI->getSetDirective() && TM.getRelocationModel() == Reloc::PIC_;
|
bool UseSet= MAI->getSetDirective() && TM.getRelocationModel() == Reloc::PIC_;
|
||||||
SmallPtrSet<MachineBasicBlock*, 8> JTSets;
|
SmallPtrSet<MachineBasicBlock*, 8> JTSets;
|
||||||
for (unsigned i = 0, e = JTBBs.size(); i != e; ++i) {
|
for (unsigned i = 0, e = JTBBs.size(); i != e; ++i) {
|
||||||
MachineBasicBlock *MBB = JTBBs[i];
|
MachineBasicBlock *MBB = JTBBs[i];
|
||||||
@ -944,12 +944,12 @@ void ARMAsmPrinter::printJTBlockOperand(const MachineInstr *MI, int OpNum) {
|
|||||||
|
|
||||||
O << JTEntryDirective << ' ';
|
O << JTEntryDirective << ' ';
|
||||||
if (UseSet)
|
if (UseSet)
|
||||||
O << TAI->getPrivateGlobalPrefix() << getFunctionNumber()
|
O << MAI->getPrivateGlobalPrefix() << getFunctionNumber()
|
||||||
<< '_' << JTI << '_' << MO2.getImm()
|
<< '_' << JTI << '_' << MO2.getImm()
|
||||||
<< "_set_" << MBB->getNumber();
|
<< "_set_" << MBB->getNumber();
|
||||||
else if (TM.getRelocationModel() == Reloc::PIC_) {
|
else if (TM.getRelocationModel() == Reloc::PIC_) {
|
||||||
printBasicBlockLabel(MBB, false, false, false);
|
printBasicBlockLabel(MBB, false, false, false);
|
||||||
O << '-' << TAI->getPrivateGlobalPrefix() << "JTI"
|
O << '-' << MAI->getPrivateGlobalPrefix() << "JTI"
|
||||||
<< getFunctionNumber() << '_' << JTI << '_' << MO2.getImm();
|
<< getFunctionNumber() << '_' << JTI << '_' << MO2.getImm();
|
||||||
} else {
|
} else {
|
||||||
printBasicBlockLabel(MBB, false, false, false);
|
printBasicBlockLabel(MBB, false, false, false);
|
||||||
@ -963,7 +963,7 @@ void ARMAsmPrinter::printJT2BlockOperand(const MachineInstr *MI, int OpNum) {
|
|||||||
const MachineOperand &MO1 = MI->getOperand(OpNum);
|
const MachineOperand &MO1 = MI->getOperand(OpNum);
|
||||||
const MachineOperand &MO2 = MI->getOperand(OpNum+1); // Unique Id
|
const MachineOperand &MO2 = MI->getOperand(OpNum+1); // Unique Id
|
||||||
unsigned JTI = MO1.getIndex();
|
unsigned JTI = MO1.getIndex();
|
||||||
O << TAI->getPrivateGlobalPrefix() << "JTI" << getFunctionNumber()
|
O << MAI->getPrivateGlobalPrefix() << "JTI" << getFunctionNumber()
|
||||||
<< '_' << JTI << '_' << MO2.getImm() << ":\n";
|
<< '_' << JTI << '_' << MO2.getImm() << ":\n";
|
||||||
|
|
||||||
const MachineFunction *MF = MI->getParent()->getParent();
|
const MachineFunction *MF = MI->getParent()->getParent();
|
||||||
@ -979,13 +979,13 @@ void ARMAsmPrinter::printJT2BlockOperand(const MachineInstr *MI, int OpNum) {
|
|||||||
for (unsigned i = 0, e = JTBBs.size(); i != e; ++i) {
|
for (unsigned i = 0, e = JTBBs.size(); i != e; ++i) {
|
||||||
MachineBasicBlock *MBB = JTBBs[i];
|
MachineBasicBlock *MBB = JTBBs[i];
|
||||||
if (ByteOffset)
|
if (ByteOffset)
|
||||||
O << TAI->getData8bitsDirective();
|
O << MAI->getData8bitsDirective();
|
||||||
else if (HalfWordOffset)
|
else if (HalfWordOffset)
|
||||||
O << TAI->getData16bitsDirective();
|
O << MAI->getData16bitsDirective();
|
||||||
if (ByteOffset || HalfWordOffset) {
|
if (ByteOffset || HalfWordOffset) {
|
||||||
O << '(';
|
O << '(';
|
||||||
printBasicBlockLabel(MBB, false, false, false);
|
printBasicBlockLabel(MBB, false, false, false);
|
||||||
O << "-" << TAI->getPrivateGlobalPrefix() << "JTI" << getFunctionNumber()
|
O << "-" << MAI->getPrivateGlobalPrefix() << "JTI" << getFunctionNumber()
|
||||||
<< '_' << JTI << '_' << MO2.getImm() << ")/2";
|
<< '_' << JTI << '_' << MO2.getImm() << ")/2";
|
||||||
} else {
|
} else {
|
||||||
O << "\tb.w ";
|
O << "\tb.w ";
|
||||||
@ -1172,7 +1172,7 @@ void ARMAsmPrinter::PrintGlobalVariable(const GlobalVariable* GVar) {
|
|||||||
// Don't put things that should go in the cstring section into "comm".
|
// Don't put things that should go in the cstring section into "comm".
|
||||||
!TheSection->getKind().isMergeableCString()) {
|
!TheSection->getKind().isMergeableCString()) {
|
||||||
if (GVar->hasExternalLinkage()) {
|
if (GVar->hasExternalLinkage()) {
|
||||||
if (const char *Directive = TAI->getZeroFillDirective()) {
|
if (const char *Directive = MAI->getZeroFillDirective()) {
|
||||||
O << "\t.globl\t" << name << "\n";
|
O << "\t.globl\t" << name << "\n";
|
||||||
O << Directive << "__DATA, __common, " << name << ", "
|
O << Directive << "__DATA, __common, " << name << ", "
|
||||||
<< Size << ", " << Align << "\n";
|
<< Size << ", " << Align << "\n";
|
||||||
@ -1185,42 +1185,42 @@ void ARMAsmPrinter::PrintGlobalVariable(const GlobalVariable* GVar) {
|
|||||||
|
|
||||||
if (isDarwin) {
|
if (isDarwin) {
|
||||||
if (GVar->hasLocalLinkage()) {
|
if (GVar->hasLocalLinkage()) {
|
||||||
O << TAI->getLCOMMDirective() << name << "," << Size
|
O << MAI->getLCOMMDirective() << name << "," << Size
|
||||||
<< ',' << Align;
|
<< ',' << Align;
|
||||||
} else if (GVar->hasCommonLinkage()) {
|
} else if (GVar->hasCommonLinkage()) {
|
||||||
O << TAI->getCOMMDirective() << name << "," << Size
|
O << MAI->getCOMMDirective() << name << "," << Size
|
||||||
<< ',' << Align;
|
<< ',' << Align;
|
||||||
} else {
|
} else {
|
||||||
OutStreamer.SwitchSection(TheSection);
|
OutStreamer.SwitchSection(TheSection);
|
||||||
O << "\t.globl " << name << '\n'
|
O << "\t.globl " << name << '\n'
|
||||||
<< TAI->getWeakDefDirective() << name << '\n';
|
<< MAI->getWeakDefDirective() << name << '\n';
|
||||||
EmitAlignment(Align, GVar);
|
EmitAlignment(Align, GVar);
|
||||||
O << name << ":";
|
O << name << ":";
|
||||||
if (VerboseAsm) {
|
if (VerboseAsm) {
|
||||||
O << "\t\t\t\t" << TAI->getCommentString() << ' ';
|
O << "\t\t\t\t" << MAI->getCommentString() << ' ';
|
||||||
WriteAsOperand(O, GVar, /*PrintType=*/false, GVar->getParent());
|
WriteAsOperand(O, GVar, /*PrintType=*/false, GVar->getParent());
|
||||||
}
|
}
|
||||||
O << '\n';
|
O << '\n';
|
||||||
EmitGlobalConstant(C);
|
EmitGlobalConstant(C);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
} else if (TAI->getLCOMMDirective() != NULL) {
|
} else if (MAI->getLCOMMDirective() != NULL) {
|
||||||
if (GVar->hasLocalLinkage()) {
|
if (GVar->hasLocalLinkage()) {
|
||||||
O << TAI->getLCOMMDirective() << name << "," << Size;
|
O << MAI->getLCOMMDirective() << name << "," << Size;
|
||||||
} else {
|
} else {
|
||||||
O << TAI->getCOMMDirective() << name << "," << Size;
|
O << MAI->getCOMMDirective() << name << "," << Size;
|
||||||
if (TAI->getCOMMDirectiveTakesAlignment())
|
if (MAI->getCOMMDirectiveTakesAlignment())
|
||||||
O << ',' << (TAI->getAlignmentIsInBytes() ? (1 << Align) : Align);
|
O << ',' << (MAI->getAlignmentIsInBytes() ? (1 << Align) : Align);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (GVar->hasLocalLinkage())
|
if (GVar->hasLocalLinkage())
|
||||||
O << "\t.local\t" << name << "\n";
|
O << "\t.local\t" << name << "\n";
|
||||||
O << TAI->getCOMMDirective() << name << "," << Size;
|
O << MAI->getCOMMDirective() << name << "," << Size;
|
||||||
if (TAI->getCOMMDirectiveTakesAlignment())
|
if (MAI->getCOMMDirectiveTakesAlignment())
|
||||||
O << "," << (TAI->getAlignmentIsInBytes() ? (1 << Align) : Align);
|
O << "," << (MAI->getAlignmentIsInBytes() ? (1 << Align) : Align);
|
||||||
}
|
}
|
||||||
if (VerboseAsm) {
|
if (VerboseAsm) {
|
||||||
O << "\t\t" << TAI->getCommentString() << " ";
|
O << "\t\t" << MAI->getCommentString() << " ";
|
||||||
WriteAsOperand(O, GVar, /*PrintType=*/false, GVar->getParent());
|
WriteAsOperand(O, GVar, /*PrintType=*/false, GVar->getParent());
|
||||||
}
|
}
|
||||||
O << "\n";
|
O << "\n";
|
||||||
@ -1258,11 +1258,11 @@ void ARMAsmPrinter::PrintGlobalVariable(const GlobalVariable* GVar) {
|
|||||||
EmitAlignment(Align, GVar);
|
EmitAlignment(Align, GVar);
|
||||||
O << name << ":";
|
O << name << ":";
|
||||||
if (VerboseAsm) {
|
if (VerboseAsm) {
|
||||||
O << "\t\t\t\t" << TAI->getCommentString() << " ";
|
O << "\t\t\t\t" << MAI->getCommentString() << " ";
|
||||||
WriteAsOperand(O, GVar, /*PrintType=*/false, GVar->getParent());
|
WriteAsOperand(O, GVar, /*PrintType=*/false, GVar->getParent());
|
||||||
}
|
}
|
||||||
O << "\n";
|
O << "\n";
|
||||||
if (TAI->hasDotTypeDotSizeDirective())
|
if (MAI->hasDotTypeDotSizeDirective())
|
||||||
O << "\t.size " << name << ", " << Size << "\n";
|
O << "\t.size " << name << ", " << Size << "\n";
|
||||||
|
|
||||||
EmitGlobalConstant(C);
|
EmitGlobalConstant(C);
|
||||||
|
@ -99,7 +99,7 @@ void AlphaAsmPrinter::printOp(const MachineOperand &MO, bool IsCallOp) {
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
case MachineOperand::MO_ConstantPoolIndex:
|
case MachineOperand::MO_ConstantPoolIndex:
|
||||||
O << TAI->getPrivateGlobalPrefix() << "CPI" << getFunctionNumber() << "_"
|
O << MAI->getPrivateGlobalPrefix() << "CPI" << getFunctionNumber() << "_"
|
||||||
<< MO.getIndex();
|
<< MO.getIndex();
|
||||||
return;
|
return;
|
||||||
|
|
||||||
@ -112,7 +112,7 @@ void AlphaAsmPrinter::printOp(const MachineOperand &MO, bool IsCallOp) {
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
case MachineOperand::MO_JumpTableIndex:
|
case MachineOperand::MO_JumpTableIndex:
|
||||||
O << TAI->getPrivateGlobalPrefix() << "JTI" << getFunctionNumber()
|
O << MAI->getPrivateGlobalPrefix() << "JTI" << getFunctionNumber()
|
||||||
<< '_' << MO.getIndex();
|
<< '_' << MO.getIndex();
|
||||||
return;
|
return;
|
||||||
|
|
||||||
@ -155,7 +155,7 @@ bool AlphaAsmPrinter::runOnMachineFunction(MachineFunction &MF) {
|
|||||||
case Function::WeakODRLinkage:
|
case Function::WeakODRLinkage:
|
||||||
case Function::LinkOnceAnyLinkage:
|
case Function::LinkOnceAnyLinkage:
|
||||||
case Function::LinkOnceODRLinkage:
|
case Function::LinkOnceODRLinkage:
|
||||||
O << TAI->getWeakRefDirective() << CurrentFnName << "\n";
|
O << MAI->getWeakRefDirective() << CurrentFnName << "\n";
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -224,11 +224,11 @@ void AlphaAsmPrinter::PrintGlobalVariable(const GlobalVariable *GVar) {
|
|||||||
case GlobalValue::WeakAnyLinkage:
|
case GlobalValue::WeakAnyLinkage:
|
||||||
case GlobalValue::WeakODRLinkage:
|
case GlobalValue::WeakODRLinkage:
|
||||||
case GlobalValue::CommonLinkage:
|
case GlobalValue::CommonLinkage:
|
||||||
O << TAI->getWeakRefDirective() << name << '\n';
|
O << MAI->getWeakRefDirective() << name << '\n';
|
||||||
break;
|
break;
|
||||||
case GlobalValue::AppendingLinkage:
|
case GlobalValue::AppendingLinkage:
|
||||||
case GlobalValue::ExternalLinkage:
|
case GlobalValue::ExternalLinkage:
|
||||||
O << TAI->getGlobalDirective() << name << "\n";
|
O << MAI->getGlobalDirective() << name << "\n";
|
||||||
break;
|
break;
|
||||||
case GlobalValue::InternalLinkage:
|
case GlobalValue::InternalLinkage:
|
||||||
case GlobalValue::PrivateLinkage:
|
case GlobalValue::PrivateLinkage:
|
||||||
@ -239,7 +239,7 @@ void AlphaAsmPrinter::PrintGlobalVariable(const GlobalVariable *GVar) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 3: Type, Size, Align
|
// 3: Type, Size, Align
|
||||||
if (TAI->hasDotTypeDotSizeDirective()) {
|
if (MAI->hasDotTypeDotSizeDirective()) {
|
||||||
O << "\t.type\t" << name << ", @object\n";
|
O << "\t.type\t" << name << ", @object\n";
|
||||||
O << "\t.size\t" << name << ", " << Size << "\n";
|
O << "\t.size\t" << name << ", " << Size << "\n";
|
||||||
}
|
}
|
||||||
|
@ -40,8 +40,8 @@ namespace {
|
|||||||
class VISIBILITY_HIDDEN BlackfinAsmPrinter : public AsmPrinter {
|
class VISIBILITY_HIDDEN BlackfinAsmPrinter : public AsmPrinter {
|
||||||
public:
|
public:
|
||||||
BlackfinAsmPrinter(formatted_raw_ostream &O, TargetMachine &TM,
|
BlackfinAsmPrinter(formatted_raw_ostream &O, TargetMachine &TM,
|
||||||
const MCAsmInfo *TAI, bool V)
|
const MCAsmInfo *MAI, bool V)
|
||||||
: AsmPrinter(O, TM, TAI, V) {}
|
: AsmPrinter(O, TM, MAI, V) {}
|
||||||
|
|
||||||
virtual const char *getPassName() const {
|
virtual const char *getPassName() const {
|
||||||
return "Blackfin Assembly Printer";
|
return "Blackfin Assembly Printer";
|
||||||
@ -75,14 +75,14 @@ void BlackfinAsmPrinter::emitLinkage(const std::string &name,
|
|||||||
case GlobalValue::LinkerPrivateLinkage:
|
case GlobalValue::LinkerPrivateLinkage:
|
||||||
break;
|
break;
|
||||||
case GlobalValue::ExternalLinkage:
|
case GlobalValue::ExternalLinkage:
|
||||||
O << TAI->getGlobalDirective() << name << "\n";
|
O << MAI->getGlobalDirective() << name << "\n";
|
||||||
break;
|
break;
|
||||||
case GlobalValue::LinkOnceAnyLinkage:
|
case GlobalValue::LinkOnceAnyLinkage:
|
||||||
case GlobalValue::LinkOnceODRLinkage:
|
case GlobalValue::LinkOnceODRLinkage:
|
||||||
case GlobalValue::WeakAnyLinkage:
|
case GlobalValue::WeakAnyLinkage:
|
||||||
case GlobalValue::WeakODRLinkage:
|
case GlobalValue::WeakODRLinkage:
|
||||||
O << TAI->getGlobalDirective() << name << "\n";
|
O << MAI->getGlobalDirective() << name << "\n";
|
||||||
O << TAI->getWeakDefDirective() << name << "\n";
|
O << MAI->getWeakDefDirective() << name << "\n";
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -180,11 +180,11 @@ void BlackfinAsmPrinter::printOperand(const MachineInstr *MI, int opNum) {
|
|||||||
O << Mang->makeNameProper(MO.getSymbolName());
|
O << Mang->makeNameProper(MO.getSymbolName());
|
||||||
break;
|
break;
|
||||||
case MachineOperand::MO_ConstantPoolIndex:
|
case MachineOperand::MO_ConstantPoolIndex:
|
||||||
O << TAI->getPrivateGlobalPrefix() << "CPI" << getFunctionNumber() << "_"
|
O << MAI->getPrivateGlobalPrefix() << "CPI" << getFunctionNumber() << "_"
|
||||||
<< MO.getIndex();
|
<< MO.getIndex();
|
||||||
break;
|
break;
|
||||||
case MachineOperand::MO_JumpTableIndex:
|
case MachineOperand::MO_JumpTableIndex:
|
||||||
O << TAI->getPrivateGlobalPrefix() << "JTI" << getFunctionNumber()
|
O << MAI->getPrivateGlobalPrefix() << "JTI" << getFunctionNumber()
|
||||||
<< '_' << MO.getIndex();
|
<< '_' << MO.getIndex();
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
@ -325,22 +325,22 @@ void SPUAsmPrinter::printOp(const MachineOperand &MO) {
|
|||||||
printBasicBlockLabel(MO.getMBB());
|
printBasicBlockLabel(MO.getMBB());
|
||||||
return;
|
return;
|
||||||
case MachineOperand::MO_JumpTableIndex:
|
case MachineOperand::MO_JumpTableIndex:
|
||||||
O << TAI->getPrivateGlobalPrefix() << "JTI" << getFunctionNumber()
|
O << MAI->getPrivateGlobalPrefix() << "JTI" << getFunctionNumber()
|
||||||
<< '_' << MO.getIndex();
|
<< '_' << MO.getIndex();
|
||||||
return;
|
return;
|
||||||
case MachineOperand::MO_ConstantPoolIndex:
|
case MachineOperand::MO_ConstantPoolIndex:
|
||||||
O << TAI->getPrivateGlobalPrefix() << "CPI" << getFunctionNumber()
|
O << MAI->getPrivateGlobalPrefix() << "CPI" << getFunctionNumber()
|
||||||
<< '_' << MO.getIndex();
|
<< '_' << MO.getIndex();
|
||||||
return;
|
return;
|
||||||
case MachineOperand::MO_ExternalSymbol:
|
case MachineOperand::MO_ExternalSymbol:
|
||||||
// Computing the address of an external symbol, not calling it.
|
// Computing the address of an external symbol, not calling it.
|
||||||
if (TM.getRelocationModel() != Reloc::Static) {
|
if (TM.getRelocationModel() != Reloc::Static) {
|
||||||
std::string Name(TAI->getGlobalPrefix()); Name += MO.getSymbolName();
|
std::string Name(MAI->getGlobalPrefix()); Name += MO.getSymbolName();
|
||||||
GVStubs.insert(Name);
|
GVStubs.insert(Name);
|
||||||
O << "L" << Name << "$non_lazy_ptr";
|
O << "L" << Name << "$non_lazy_ptr";
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
O << TAI->getGlobalPrefix() << MO.getSymbolName();
|
O << MAI->getGlobalPrefix() << MO.getSymbolName();
|
||||||
return;
|
return;
|
||||||
case MachineOperand::MO_GlobalAddress: {
|
case MachineOperand::MO_GlobalAddress: {
|
||||||
// Computing the address of a global symbol, not calling it.
|
// Computing the address of a global symbol, not calling it.
|
||||||
@ -528,11 +528,11 @@ void LinuxAsmPrinter::PrintGlobalVariable(const GlobalVariable *GVar) {
|
|||||||
O << name << ":\n";
|
O << name << ":\n";
|
||||||
O << "\t.zero " << Size << '\n';
|
O << "\t.zero " << Size << '\n';
|
||||||
} else if (GVar->hasLocalLinkage()) {
|
} else if (GVar->hasLocalLinkage()) {
|
||||||
O << TAI->getLCOMMDirective() << name << ',' << Size;
|
O << MAI->getLCOMMDirective() << name << ',' << Size;
|
||||||
} else {
|
} else {
|
||||||
O << ".comm " << name << ',' << Size;
|
O << ".comm " << name << ',' << Size;
|
||||||
}
|
}
|
||||||
O << "\t\t" << TAI->getCommentString() << " '";
|
O << "\t\t" << MAI->getCommentString() << " '";
|
||||||
WriteAsOperand(O, GVar, /*PrintType=*/false, GVar->getParent());
|
WriteAsOperand(O, GVar, /*PrintType=*/false, GVar->getParent());
|
||||||
O << "'\n";
|
O << "'\n";
|
||||||
return;
|
return;
|
||||||
@ -566,7 +566,7 @@ void LinuxAsmPrinter::PrintGlobalVariable(const GlobalVariable *GVar) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
EmitAlignment(Align, GVar);
|
EmitAlignment(Align, GVar);
|
||||||
O << name << ":\t\t\t\t" << TAI->getCommentString() << " '";
|
O << name << ":\t\t\t\t" << MAI->getCommentString() << " '";
|
||||||
WriteAsOperand(O, GVar, /*PrintType=*/false, GVar->getParent());
|
WriteAsOperand(O, GVar, /*PrintType=*/false, GVar->getParent());
|
||||||
O << "'\n";
|
O << "'\n";
|
||||||
|
|
||||||
|
@ -44,8 +44,8 @@ namespace {
|
|||||||
class VISIBILITY_HIDDEN MSP430AsmPrinter : public AsmPrinter {
|
class VISIBILITY_HIDDEN MSP430AsmPrinter : public AsmPrinter {
|
||||||
public:
|
public:
|
||||||
MSP430AsmPrinter(formatted_raw_ostream &O, TargetMachine &TM,
|
MSP430AsmPrinter(formatted_raw_ostream &O, TargetMachine &TM,
|
||||||
const MCAsmInfo *TAI, bool V)
|
const MCAsmInfo *MAI, bool V)
|
||||||
: AsmPrinter(O, TM, TAI, V) {}
|
: AsmPrinter(O, TM, MAI, V) {}
|
||||||
|
|
||||||
virtual const char *getPassName() const {
|
virtual const char *getPassName() const {
|
||||||
return "MSP430 Assembly Printer";
|
return "MSP430 Assembly Printer";
|
||||||
@ -132,7 +132,7 @@ bool MSP430AsmPrinter::runOnMachineFunction(MachineFunction &MF) {
|
|||||||
printMachineInstruction(II);
|
printMachineInstruction(II);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (TAI->hasDotTypeDotSizeDirective())
|
if (MAI->hasDotTypeDotSizeDirective())
|
||||||
O << "\t.size\t" << CurrentFnName << ", .-" << CurrentFnName << '\n';
|
O << "\t.size\t" << CurrentFnName << ", .-" << CurrentFnName << '\n';
|
||||||
|
|
||||||
// We didn't modify anything
|
// We didn't modify anything
|
||||||
@ -180,7 +180,7 @@ void MSP430AsmPrinter::printOperand(const MachineInstr *MI, int OpNum,
|
|||||||
}
|
}
|
||||||
case MachineOperand::MO_ExternalSymbol: {
|
case MachineOperand::MO_ExternalSymbol: {
|
||||||
bool isCallOp = Modifier && !strcmp(Modifier, "call");
|
bool isCallOp = Modifier && !strcmp(Modifier, "call");
|
||||||
std::string Name(TAI->getGlobalPrefix());
|
std::string Name(MAI->getGlobalPrefix());
|
||||||
Name += MO.getSymbolName();
|
Name += MO.getSymbolName();
|
||||||
if (isCallOp)
|
if (isCallOp)
|
||||||
O << '#';
|
O << '#';
|
||||||
|
@ -221,7 +221,7 @@ void MipsAsmPrinter::emitFunctionStart(MachineFunction &MF) {
|
|||||||
|
|
||||||
printVisibility(CurrentFnName, F->getVisibility());
|
printVisibility(CurrentFnName, F->getVisibility());
|
||||||
|
|
||||||
if ((TAI->hasDotTypeDotSizeDirective()) && Subtarget->isLinux())
|
if ((MAI->hasDotTypeDotSizeDirective()) && Subtarget->isLinux())
|
||||||
O << "\t.type\t" << CurrentFnName << ", @function\n";
|
O << "\t.type\t" << CurrentFnName << ", @function\n";
|
||||||
|
|
||||||
O << CurrentFnName << ":\n";
|
O << CurrentFnName << ":\n";
|
||||||
@ -241,7 +241,7 @@ void MipsAsmPrinter::emitFunctionEnd(MachineFunction &MF) {
|
|||||||
O << "\t.set\treorder\n";
|
O << "\t.set\treorder\n";
|
||||||
|
|
||||||
O << "\t.end\t" << CurrentFnName << '\n';
|
O << "\t.end\t" << CurrentFnName << '\n';
|
||||||
if (TAI->hasDotTypeDotSizeDirective() && !Subtarget->isLinux())
|
if (MAI->hasDotTypeDotSizeDirective() && !Subtarget->isLinux())
|
||||||
O << "\t.size\t" << CurrentFnName << ", .-" << CurrentFnName << '\n';
|
O << "\t.size\t" << CurrentFnName << ", .-" << CurrentFnName << '\n';
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -370,12 +370,12 @@ void MipsAsmPrinter::printOperand(const MachineInstr *MI, int opNum) {
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case MachineOperand::MO_JumpTableIndex:
|
case MachineOperand::MO_JumpTableIndex:
|
||||||
O << TAI->getPrivateGlobalPrefix() << "JTI" << getFunctionNumber()
|
O << MAI->getPrivateGlobalPrefix() << "JTI" << getFunctionNumber()
|
||||||
<< '_' << MO.getIndex();
|
<< '_' << MO.getIndex();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case MachineOperand::MO_ConstantPoolIndex:
|
case MachineOperand::MO_ConstantPoolIndex:
|
||||||
O << TAI->getPrivateGlobalPrefix() << "CPI"
|
O << MAI->getPrivateGlobalPrefix() << "CPI"
|
||||||
<< getFunctionNumber() << "_" << MO.getIndex();
|
<< getFunctionNumber() << "_" << MO.getIndex();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@ -480,8 +480,8 @@ void MipsAsmPrinter::PrintGlobalVariable(const GlobalVariable *GVar) {
|
|||||||
if (GVar->hasLocalLinkage())
|
if (GVar->hasLocalLinkage())
|
||||||
O << "\t.local\t" << name << '\n';
|
O << "\t.local\t" << name << '\n';
|
||||||
|
|
||||||
O << TAI->getCOMMDirective() << name << ',' << Size;
|
O << MAI->getCOMMDirective() << name << ',' << Size;
|
||||||
if (TAI->getCOMMDirectiveTakesAlignment())
|
if (MAI->getCOMMDirectiveTakesAlignment())
|
||||||
O << ',' << (1 << Align);
|
O << ',' << (1 << Align);
|
||||||
|
|
||||||
O << '\n';
|
O << '\n';
|
||||||
@ -503,7 +503,7 @@ void MipsAsmPrinter::PrintGlobalVariable(const GlobalVariable *GVar) {
|
|||||||
// or something. For now, just emit them as external.
|
// or something. For now, just emit them as external.
|
||||||
case GlobalValue::ExternalLinkage:
|
case GlobalValue::ExternalLinkage:
|
||||||
// If external or appending, declare as a global symbol
|
// If external or appending, declare as a global symbol
|
||||||
O << TAI->getGlobalDirective() << name << '\n';
|
O << MAI->getGlobalDirective() << name << '\n';
|
||||||
// Fall Through
|
// Fall Through
|
||||||
case GlobalValue::PrivateLinkage:
|
case GlobalValue::PrivateLinkage:
|
||||||
case GlobalValue::LinkerPrivateLinkage:
|
case GlobalValue::LinkerPrivateLinkage:
|
||||||
@ -523,7 +523,7 @@ void MipsAsmPrinter::PrintGlobalVariable(const GlobalVariable *GVar) {
|
|||||||
|
|
||||||
EmitAlignment(Align, GVar);
|
EmitAlignment(Align, GVar);
|
||||||
|
|
||||||
if (TAI->hasDotTypeDotSizeDirective() && printSizeAndType) {
|
if (MAI->hasDotTypeDotSizeDirective() && printSizeAndType) {
|
||||||
O << "\t.type " << name << ",@object\n";
|
O << "\t.type " << name << ",@object\n";
|
||||||
O << "\t.size " << name << ',' << Size << '\n';
|
O << "\t.size " << name << ',' << Size << '\n';
|
||||||
}
|
}
|
||||||
|
@ -37,7 +37,7 @@ PIC16AsmPrinter::PIC16AsmPrinter(formatted_raw_ostream &O, TargetMachine &TM,
|
|||||||
const MCAsmInfo *T, bool V)
|
const MCAsmInfo *T, bool V)
|
||||||
: AsmPrinter(O, TM, T, V), DbgInfo(O, T) {
|
: AsmPrinter(O, TM, T, V), DbgInfo(O, T) {
|
||||||
PTLI = static_cast<PIC16TargetLowering*>(TM.getTargetLowering());
|
PTLI = static_cast<PIC16TargetLowering*>(TM.getTargetLowering());
|
||||||
PTAI = static_cast<const PIC16MCAsmInfo*>(T);
|
PMAI = static_cast<const PIC16MCAsmInfo*>(T);
|
||||||
PTOF = (PIC16TargetObjectFile*)&PTLI->getObjFileLowering();
|
PTOF = (PIC16TargetObjectFile*)&PTLI->getObjFileLowering();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -199,18 +199,18 @@ void PIC16AsmPrinter::printLibcallDecls() {
|
|||||||
// If no libcalls used, return.
|
// If no libcalls used, return.
|
||||||
if (LibcallDecls.empty()) return;
|
if (LibcallDecls.empty()) return;
|
||||||
|
|
||||||
O << TAI->getCommentString() << "External decls for libcalls - BEGIN." <<"\n";
|
O << MAI->getCommentString() << "External decls for libcalls - BEGIN." <<"\n";
|
||||||
// Remove duplicate entries.
|
// Remove duplicate entries.
|
||||||
LibcallDecls.sort(is_before);
|
LibcallDecls.sort(is_before);
|
||||||
LibcallDecls.unique(is_duplicate);
|
LibcallDecls.unique(is_duplicate);
|
||||||
|
|
||||||
for (std::list<const char*>::const_iterator I = LibcallDecls.begin();
|
for (std::list<const char*>::const_iterator I = LibcallDecls.begin();
|
||||||
I != LibcallDecls.end(); I++) {
|
I != LibcallDecls.end(); I++) {
|
||||||
O << TAI->getExternDirective() << *I << "\n";
|
O << MAI->getExternDirective() << *I << "\n";
|
||||||
O << TAI->getExternDirective() << PAN::getArgsLabel(*I) << "\n";
|
O << MAI->getExternDirective() << PAN::getArgsLabel(*I) << "\n";
|
||||||
O << TAI->getExternDirective() << PAN::getRetvalLabel(*I) << "\n";
|
O << MAI->getExternDirective() << PAN::getRetvalLabel(*I) << "\n";
|
||||||
}
|
}
|
||||||
O << TAI->getCommentString() << "External decls for libcalls - END." <<"\n";
|
O << MAI->getCommentString() << "External decls for libcalls - END." <<"\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
/// doInitialization - Perfrom Module level initializations here.
|
/// doInitialization - Perfrom Module level initializations here.
|
||||||
@ -250,7 +250,7 @@ bool PIC16AsmPrinter::doInitialization(Module &M) {
|
|||||||
///
|
///
|
||||||
void PIC16AsmPrinter::EmitFunctionDecls(Module &M) {
|
void PIC16AsmPrinter::EmitFunctionDecls(Module &M) {
|
||||||
// Emit declarations for external functions.
|
// Emit declarations for external functions.
|
||||||
O <<"\n"<<TAI->getCommentString() << "Function Declarations - BEGIN." <<"\n";
|
O <<"\n"<<MAI->getCommentString() << "Function Declarations - BEGIN." <<"\n";
|
||||||
for (Module::iterator I = M.begin(), E = M.end(); I != E; I++) {
|
for (Module::iterator I = M.begin(), E = M.end(); I != E; I++) {
|
||||||
if (I->isIntrinsic())
|
if (I->isIntrinsic())
|
||||||
continue;
|
continue;
|
||||||
@ -272,15 +272,15 @@ void PIC16AsmPrinter::EmitFunctionDecls(Module &M) {
|
|||||||
// tracking both kind of references in printInstrunction.
|
// tracking both kind of references in printInstrunction.
|
||||||
if (I->isDeclaration() && PAN::isMemIntrinsic(Name)) continue;
|
if (I->isDeclaration() && PAN::isMemIntrinsic(Name)) continue;
|
||||||
|
|
||||||
const char *directive = I->isDeclaration() ? TAI->getExternDirective() :
|
const char *directive = I->isDeclaration() ? MAI->getExternDirective() :
|
||||||
TAI->getGlobalDirective();
|
MAI->getGlobalDirective();
|
||||||
|
|
||||||
O << directive << Name << "\n";
|
O << directive << Name << "\n";
|
||||||
O << directive << PAN::getRetvalLabel(Name) << "\n";
|
O << directive << PAN::getRetvalLabel(Name) << "\n";
|
||||||
O << directive << PAN::getArgsLabel(Name) << "\n";
|
O << directive << PAN::getArgsLabel(Name) << "\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
O << TAI->getCommentString() << "Function Declarations - END." <<"\n";
|
O << MAI->getCommentString() << "Function Declarations - END." <<"\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
// Emit variables imported from other Modules.
|
// Emit variables imported from other Modules.
|
||||||
@ -288,11 +288,11 @@ void PIC16AsmPrinter::EmitUndefinedVars(Module &M) {
|
|||||||
std::vector<const GlobalVariable*> Items = PTOF->ExternalVarDecls->Items;
|
std::vector<const GlobalVariable*> Items = PTOF->ExternalVarDecls->Items;
|
||||||
if (!Items.size()) return;
|
if (!Items.size()) return;
|
||||||
|
|
||||||
O << "\n" << TAI->getCommentString() << "Imported Variables - BEGIN" << "\n";
|
O << "\n" << MAI->getCommentString() << "Imported Variables - BEGIN" << "\n";
|
||||||
for (unsigned j = 0; j < Items.size(); j++) {
|
for (unsigned j = 0; j < Items.size(); j++) {
|
||||||
O << TAI->getExternDirective() << Mang->getMangledName(Items[j]) << "\n";
|
O << MAI->getExternDirective() << Mang->getMangledName(Items[j]) << "\n";
|
||||||
}
|
}
|
||||||
O << TAI->getCommentString() << "Imported Variables - END" << "\n";
|
O << MAI->getCommentString() << "Imported Variables - END" << "\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
// Emit variables defined in this module and are available to other modules.
|
// Emit variables defined in this module and are available to other modules.
|
||||||
@ -300,11 +300,11 @@ void PIC16AsmPrinter::EmitDefinedVars(Module &M) {
|
|||||||
std::vector<const GlobalVariable*> Items = PTOF->ExternalVarDefs->Items;
|
std::vector<const GlobalVariable*> Items = PTOF->ExternalVarDefs->Items;
|
||||||
if (!Items.size()) return;
|
if (!Items.size()) return;
|
||||||
|
|
||||||
O << "\n" << TAI->getCommentString() << "Exported Variables - BEGIN" << "\n";
|
O << "\n" << MAI->getCommentString() << "Exported Variables - BEGIN" << "\n";
|
||||||
for (unsigned j = 0; j < Items.size(); j++) {
|
for (unsigned j = 0; j < Items.size(); j++) {
|
||||||
O << TAI->getGlobalDirective() << Mang->getMangledName(Items[j]) << "\n";
|
O << MAI->getGlobalDirective() << Mang->getMangledName(Items[j]) << "\n";
|
||||||
}
|
}
|
||||||
O << TAI->getCommentString() << "Exported Variables - END" << "\n";
|
O << MAI->getCommentString() << "Exported Variables - END" << "\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
// Emit initialized data placed in ROM.
|
// Emit initialized data placed in ROM.
|
||||||
|
@ -70,7 +70,7 @@ namespace llvm {
|
|||||||
PIC16TargetObjectFile *PTOF;
|
PIC16TargetObjectFile *PTOF;
|
||||||
PIC16TargetLowering *PTLI;
|
PIC16TargetLowering *PTLI;
|
||||||
PIC16DbgInfo DbgInfo;
|
PIC16DbgInfo DbgInfo;
|
||||||
const PIC16MCAsmInfo *PTAI;
|
const PIC16MCAsmInfo *PMAI;
|
||||||
std::list<const char *> LibcallDecls; // List of extern decls.
|
std::list<const char *> LibcallDecls; // List of extern decls.
|
||||||
};
|
};
|
||||||
} // end of namespace
|
} // end of namespace
|
||||||
|
@ -32,7 +32,7 @@ namespace llvm {
|
|||||||
static MCSectionPIC16 *Create(const StringRef &Name,
|
static MCSectionPIC16 *Create(const StringRef &Name,
|
||||||
SectionKind K, MCContext &Ctx);
|
SectionKind K, MCContext &Ctx);
|
||||||
|
|
||||||
virtual void PrintSwitchToSection(const MCAsmInfo &TAI,
|
virtual void PrintSwitchToSection(const MCAsmInfo &MAI,
|
||||||
raw_ostream &OS) const;
|
raw_ostream &OS) const;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -450,7 +450,7 @@ void PIC16DbgInfo::EmitVarDebugInfo(Module &M) {
|
|||||||
bool HasAux = false;
|
bool HasAux = false;
|
||||||
int Aux[PIC16Dbg::AuxSize] = { 0 };
|
int Aux[PIC16Dbg::AuxSize] = { 0 };
|
||||||
std::string TagName = "";
|
std::string TagName = "";
|
||||||
std::string VarName = TAI->getGlobalPrefix()+DIGV.getGlobal()->getNameStr();
|
std::string VarName = MAI->getGlobalPrefix()+DIGV.getGlobal()->getNameStr();
|
||||||
PopulateDebugInfo(Ty, TypeNo, HasAux, Aux, TagName);
|
PopulateDebugInfo(Ty, TypeNo, HasAux, Aux, TagName);
|
||||||
// Emit debug info only if type information is availaible.
|
// Emit debug info only if type information is availaible.
|
||||||
if (TypeNo != PIC16Dbg::T_NULL) {
|
if (TypeNo != PIC16Dbg::T_NULL) {
|
||||||
|
@ -92,7 +92,7 @@ namespace llvm {
|
|||||||
|
|
||||||
class PIC16DbgInfo {
|
class PIC16DbgInfo {
|
||||||
formatted_raw_ostream &O;
|
formatted_raw_ostream &O;
|
||||||
const MCAsmInfo *TAI;
|
const MCAsmInfo *MAI;
|
||||||
std::string CurFile;
|
std::string CurFile;
|
||||||
unsigned CurLine;
|
unsigned CurLine;
|
||||||
|
|
||||||
@ -102,7 +102,7 @@ namespace llvm {
|
|||||||
|
|
||||||
public:
|
public:
|
||||||
PIC16DbgInfo(formatted_raw_ostream &o, const MCAsmInfo *T)
|
PIC16DbgInfo(formatted_raw_ostream &o, const MCAsmInfo *T)
|
||||||
: O(o), TAI(T) {
|
: O(o), MAI(T) {
|
||||||
CurFile = "";
|
CurFile = "";
|
||||||
CurLine = 0;
|
CurLine = 0;
|
||||||
EmitDebugDirectives = false;
|
EmitDebugDirectives = false;
|
||||||
|
@ -25,7 +25,7 @@ MCSectionPIC16 *MCSectionPIC16::Create(const StringRef &Name,
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void MCSectionPIC16::PrintSwitchToSection(const MCAsmInfo &TAI,
|
void MCSectionPIC16::PrintSwitchToSection(const MCAsmInfo &MAI,
|
||||||
raw_ostream &OS) const {
|
raw_ostream &OS) const {
|
||||||
OS << getName() << '\n';
|
OS << getName() << '\n';
|
||||||
}
|
}
|
||||||
|
@ -324,7 +324,7 @@ namespace {
|
|||||||
// Map symbol -> label of TOC entry.
|
// Map symbol -> label of TOC entry.
|
||||||
if (TOC.count(Name) == 0) {
|
if (TOC.count(Name) == 0) {
|
||||||
std::string Label;
|
std::string Label;
|
||||||
Label += TAI->getPrivateGlobalPrefix();
|
Label += MAI->getPrivateGlobalPrefix();
|
||||||
Label += "C";
|
Label += "C";
|
||||||
Label += utostr(LabelID++);
|
Label += utostr(LabelID++);
|
||||||
|
|
||||||
@ -406,17 +406,17 @@ void PPCAsmPrinter::printOp(const MachineOperand &MO) {
|
|||||||
printBasicBlockLabel(MO.getMBB());
|
printBasicBlockLabel(MO.getMBB());
|
||||||
return;
|
return;
|
||||||
case MachineOperand::MO_JumpTableIndex:
|
case MachineOperand::MO_JumpTableIndex:
|
||||||
O << TAI->getPrivateGlobalPrefix() << "JTI" << getFunctionNumber()
|
O << MAI->getPrivateGlobalPrefix() << "JTI" << getFunctionNumber()
|
||||||
<< '_' << MO.getIndex();
|
<< '_' << MO.getIndex();
|
||||||
// FIXME: PIC relocation model
|
// FIXME: PIC relocation model
|
||||||
return;
|
return;
|
||||||
case MachineOperand::MO_ConstantPoolIndex:
|
case MachineOperand::MO_ConstantPoolIndex:
|
||||||
O << TAI->getPrivateGlobalPrefix() << "CPI" << getFunctionNumber()
|
O << MAI->getPrivateGlobalPrefix() << "CPI" << getFunctionNumber()
|
||||||
<< '_' << MO.getIndex();
|
<< '_' << MO.getIndex();
|
||||||
return;
|
return;
|
||||||
case MachineOperand::MO_ExternalSymbol: {
|
case MachineOperand::MO_ExternalSymbol: {
|
||||||
// Computing the address of an external symbol, not calling it.
|
// Computing the address of an external symbol, not calling it.
|
||||||
std::string Name(TAI->getGlobalPrefix());
|
std::string Name(MAI->getGlobalPrefix());
|
||||||
Name += MO.getSymbolName();
|
Name += MO.getSymbolName();
|
||||||
|
|
||||||
if (TM.getRelocationModel() != Reloc::Static) {
|
if (TM.getRelocationModel() != Reloc::Static) {
|
||||||
@ -719,12 +719,12 @@ void PPCLinuxAsmPrinter::PrintGlobalVariable(const GlobalVariable *GVar) {
|
|||||||
O << name << ":\n";
|
O << name << ":\n";
|
||||||
O << "\t.zero " << Size << '\n';
|
O << "\t.zero " << Size << '\n';
|
||||||
} else if (GVar->hasLocalLinkage()) {
|
} else if (GVar->hasLocalLinkage()) {
|
||||||
O << TAI->getLCOMMDirective() << name << ',' << Size;
|
O << MAI->getLCOMMDirective() << name << ',' << Size;
|
||||||
} else {
|
} else {
|
||||||
O << ".comm " << name << ',' << Size;
|
O << ".comm " << name << ',' << Size;
|
||||||
}
|
}
|
||||||
if (VerboseAsm) {
|
if (VerboseAsm) {
|
||||||
O << "\t\t" << TAI->getCommentString() << " '";
|
O << "\t\t" << MAI->getCommentString() << " '";
|
||||||
WriteAsOperand(O, GVar, /*PrintType=*/false, GVar->getParent());
|
WriteAsOperand(O, GVar, /*PrintType=*/false, GVar->getParent());
|
||||||
O << "'";
|
O << "'";
|
||||||
}
|
}
|
||||||
@ -761,7 +761,7 @@ void PPCLinuxAsmPrinter::PrintGlobalVariable(const GlobalVariable *GVar) {
|
|||||||
EmitAlignment(Align, GVar);
|
EmitAlignment(Align, GVar);
|
||||||
O << name << ":";
|
O << name << ":";
|
||||||
if (VerboseAsm) {
|
if (VerboseAsm) {
|
||||||
O << "\t\t\t\t" << TAI->getCommentString() << " '";
|
O << "\t\t\t\t" << MAI->getCommentString() << " '";
|
||||||
WriteAsOperand(O, GVar, /*PrintType=*/false, GVar->getParent());
|
WriteAsOperand(O, GVar, /*PrintType=*/false, GVar->getParent());
|
||||||
O << "'";
|
O << "'";
|
||||||
}
|
}
|
||||||
@ -958,14 +958,14 @@ void PPCDarwinAsmPrinter::PrintGlobalVariable(const GlobalVariable *GVar) {
|
|||||||
O << "\t.zerofill __DATA, __common, " << name << ", "
|
O << "\t.zerofill __DATA, __common, " << name << ", "
|
||||||
<< Size << ", " << Align;
|
<< Size << ", " << Align;
|
||||||
} else if (GVar->hasLocalLinkage()) {
|
} else if (GVar->hasLocalLinkage()) {
|
||||||
O << TAI->getLCOMMDirective() << name << ',' << Size << ',' << Align;
|
O << MAI->getLCOMMDirective() << name << ',' << Size << ',' << Align;
|
||||||
} else if (!GVar->hasCommonLinkage()) {
|
} else if (!GVar->hasCommonLinkage()) {
|
||||||
O << "\t.globl " << name << '\n'
|
O << "\t.globl " << name << '\n'
|
||||||
<< TAI->getWeakDefDirective() << name << '\n';
|
<< MAI->getWeakDefDirective() << name << '\n';
|
||||||
EmitAlignment(Align, GVar);
|
EmitAlignment(Align, GVar);
|
||||||
O << name << ":";
|
O << name << ":";
|
||||||
if (VerboseAsm) {
|
if (VerboseAsm) {
|
||||||
O << "\t\t\t\t" << TAI->getCommentString() << " ";
|
O << "\t\t\t\t" << MAI->getCommentString() << " ";
|
||||||
WriteAsOperand(O, GVar, /*PrintType=*/false, GVar->getParent());
|
WriteAsOperand(O, GVar, /*PrintType=*/false, GVar->getParent());
|
||||||
}
|
}
|
||||||
O << '\n';
|
O << '\n';
|
||||||
@ -978,7 +978,7 @@ void PPCDarwinAsmPrinter::PrintGlobalVariable(const GlobalVariable *GVar) {
|
|||||||
O << ',' << Align;
|
O << ',' << Align;
|
||||||
}
|
}
|
||||||
if (VerboseAsm) {
|
if (VerboseAsm) {
|
||||||
O << "\t\t" << TAI->getCommentString() << " '";
|
O << "\t\t" << MAI->getCommentString() << " '";
|
||||||
WriteAsOperand(O, GVar, /*PrintType=*/false, GVar->getParent());
|
WriteAsOperand(O, GVar, /*PrintType=*/false, GVar->getParent());
|
||||||
O << "'";
|
O << "'";
|
||||||
}
|
}
|
||||||
@ -1013,7 +1013,7 @@ void PPCDarwinAsmPrinter::PrintGlobalVariable(const GlobalVariable *GVar) {
|
|||||||
EmitAlignment(Align, GVar);
|
EmitAlignment(Align, GVar);
|
||||||
O << name << ":";
|
O << name << ":";
|
||||||
if (VerboseAsm) {
|
if (VerboseAsm) {
|
||||||
O << "\t\t\t\t" << TAI->getCommentString() << " '";
|
O << "\t\t\t\t" << MAI->getCommentString() << " '";
|
||||||
WriteAsOperand(O, GVar, /*PrintType=*/false, GVar->getParent());
|
WriteAsOperand(O, GVar, /*PrintType=*/false, GVar->getParent());
|
||||||
O << "'";
|
O << "'";
|
||||||
}
|
}
|
||||||
@ -1097,7 +1097,7 @@ bool PPCDarwinAsmPrinter::doFinalization(Module &M) {
|
|||||||
|
|
||||||
O << '\n';
|
O << '\n';
|
||||||
|
|
||||||
if (TAI->doesSupportExceptionHandling() && MMI) {
|
if (MAI->doesSupportExceptionHandling() && MMI) {
|
||||||
// Add the (possibly multiple) personalities to the set of global values.
|
// Add the (possibly multiple) personalities to the set of global values.
|
||||||
// Only referenced functions get into the Personalities list.
|
// Only referenced functions get into the Personalities list.
|
||||||
const std::vector<Function *> &Personalities = MMI->getPersonalities();
|
const std::vector<Function *> &Personalities = MMI->getPersonalities();
|
||||||
|
@ -167,7 +167,7 @@ void SparcAsmPrinter::printOperand(const MachineInstr *MI, int opNum) {
|
|||||||
O << MO.getSymbolName();
|
O << MO.getSymbolName();
|
||||||
break;
|
break;
|
||||||
case MachineOperand::MO_ConstantPoolIndex:
|
case MachineOperand::MO_ConstantPoolIndex:
|
||||||
O << TAI->getPrivateGlobalPrefix() << "CPI" << getFunctionNumber() << "_"
|
O << MAI->getPrivateGlobalPrefix() << "CPI" << getFunctionNumber() << "_"
|
||||||
<< MO.getIndex();
|
<< MO.getIndex();
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
@ -239,8 +239,8 @@ void SparcAsmPrinter::PrintGlobalVariable(const GlobalVariable* GVar) {
|
|||||||
if (GVar->hasLocalLinkage())
|
if (GVar->hasLocalLinkage())
|
||||||
O << "\t.local " << name << '\n';
|
O << "\t.local " << name << '\n';
|
||||||
|
|
||||||
O << TAI->getCOMMDirective() << name << ',' << Size;
|
O << MAI->getCOMMDirective() << name << ',' << Size;
|
||||||
if (TAI->getCOMMDirectiveTakesAlignment())
|
if (MAI->getCOMMDirectiveTakesAlignment())
|
||||||
O << ',' << (1 << Align);
|
O << ',' << (1 << Align);
|
||||||
|
|
||||||
O << '\n';
|
O << '\n';
|
||||||
@ -262,7 +262,7 @@ void SparcAsmPrinter::PrintGlobalVariable(const GlobalVariable* GVar) {
|
|||||||
// their name or something. For now, just emit them as external.
|
// their name or something. For now, just emit them as external.
|
||||||
case GlobalValue::ExternalLinkage:
|
case GlobalValue::ExternalLinkage:
|
||||||
// If external or appending, declare as a global symbol
|
// If external or appending, declare as a global symbol
|
||||||
O << TAI->getGlobalDirective() << name << '\n';
|
O << MAI->getGlobalDirective() << name << '\n';
|
||||||
// FALL THROUGH
|
// FALL THROUGH
|
||||||
case GlobalValue::PrivateLinkage:
|
case GlobalValue::PrivateLinkage:
|
||||||
case GlobalValue::LinkerPrivateLinkage:
|
case GlobalValue::LinkerPrivateLinkage:
|
||||||
@ -280,7 +280,7 @@ void SparcAsmPrinter::PrintGlobalVariable(const GlobalVariable* GVar) {
|
|||||||
|
|
||||||
EmitAlignment(Align, GVar);
|
EmitAlignment(Align, GVar);
|
||||||
|
|
||||||
if (TAI->hasDotTypeDotSizeDirective()) {
|
if (MAI->hasDotTypeDotSizeDirective()) {
|
||||||
O << "\t.type " << name << ",#object\n";
|
O << "\t.type " << name << ",#object\n";
|
||||||
O << "\t.size " << name << ',' << Size << '\n';
|
O << "\t.size " << name << ',' << Size << '\n';
|
||||||
}
|
}
|
||||||
|
@ -44,8 +44,8 @@ namespace {
|
|||||||
class VISIBILITY_HIDDEN SystemZAsmPrinter : public AsmPrinter {
|
class VISIBILITY_HIDDEN SystemZAsmPrinter : public AsmPrinter {
|
||||||
public:
|
public:
|
||||||
SystemZAsmPrinter(formatted_raw_ostream &O, TargetMachine &TM,
|
SystemZAsmPrinter(formatted_raw_ostream &O, TargetMachine &TM,
|
||||||
const MCAsmInfo *TAI, bool V)
|
const MCAsmInfo *MAI, bool V)
|
||||||
: AsmPrinter(O, TM, TAI, V) {}
|
: AsmPrinter(O, TM, MAI, V) {}
|
||||||
|
|
||||||
virtual const char *getPassName() const {
|
virtual const char *getPassName() const {
|
||||||
return "SystemZ Assembly Printer";
|
return "SystemZ Assembly Printer";
|
||||||
@ -140,7 +140,7 @@ bool SystemZAsmPrinter::runOnMachineFunction(MachineFunction &MF) {
|
|||||||
printMachineInstruction(II);
|
printMachineInstruction(II);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (TAI->hasDotTypeDotSizeDirective())
|
if (MAI->hasDotTypeDotSizeDirective())
|
||||||
O << "\t.size\t" << CurrentFnName << ", .-" << CurrentFnName << '\n';
|
O << "\t.size\t" << CurrentFnName << ", .-" << CurrentFnName << '\n';
|
||||||
|
|
||||||
// Print out jump tables referenced by the function.
|
// Print out jump tables referenced by the function.
|
||||||
@ -182,7 +182,7 @@ void SystemZAsmPrinter::printPCRelImmOperand(const MachineInstr *MI, int OpNum)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
case MachineOperand::MO_ExternalSymbol: {
|
case MachineOperand::MO_ExternalSymbol: {
|
||||||
std::string Name(TAI->getGlobalPrefix());
|
std::string Name(MAI->getGlobalPrefix());
|
||||||
Name += MO.getSymbolName();
|
Name += MO.getSymbolName();
|
||||||
O << Name;
|
O << Name;
|
||||||
|
|
||||||
@ -224,12 +224,12 @@ void SystemZAsmPrinter::printOperand(const MachineInstr *MI, int OpNum,
|
|||||||
printBasicBlockLabel(MO.getMBB());
|
printBasicBlockLabel(MO.getMBB());
|
||||||
return;
|
return;
|
||||||
case MachineOperand::MO_JumpTableIndex:
|
case MachineOperand::MO_JumpTableIndex:
|
||||||
O << TAI->getPrivateGlobalPrefix() << "JTI" << getFunctionNumber() << '_'
|
O << MAI->getPrivateGlobalPrefix() << "JTI" << getFunctionNumber() << '_'
|
||||||
<< MO.getIndex();
|
<< MO.getIndex();
|
||||||
|
|
||||||
return;
|
return;
|
||||||
case MachineOperand::MO_ConstantPoolIndex:
|
case MachineOperand::MO_ConstantPoolIndex:
|
||||||
O << TAI->getPrivateGlobalPrefix() << "CPI" << getFunctionNumber() << '_'
|
O << MAI->getPrivateGlobalPrefix() << "CPI" << getFunctionNumber() << '_'
|
||||||
<< MO.getIndex();
|
<< MO.getIndex();
|
||||||
|
|
||||||
printOffset(MO.getOffset());
|
printOffset(MO.getOffset());
|
||||||
@ -242,7 +242,7 @@ void SystemZAsmPrinter::printOperand(const MachineInstr *MI, int OpNum,
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case MachineOperand::MO_ExternalSymbol: {
|
case MachineOperand::MO_ExternalSymbol: {
|
||||||
std::string Name(TAI->getGlobalPrefix());
|
std::string Name(MAI->getGlobalPrefix());
|
||||||
Name += MO.getSymbolName();
|
Name += MO.getSymbolName();
|
||||||
O << Name;
|
O << Name;
|
||||||
break;
|
break;
|
||||||
@ -330,12 +330,12 @@ void SystemZAsmPrinter::PrintGlobalVariable(const GlobalVariable* GVar) {
|
|||||||
if (GVar->hasLocalLinkage())
|
if (GVar->hasLocalLinkage())
|
||||||
O << "\t.local\t" << name << '\n';
|
O << "\t.local\t" << name << '\n';
|
||||||
|
|
||||||
O << TAI->getCOMMDirective() << name << ',' << Size;
|
O << MAI->getCOMMDirective() << name << ',' << Size;
|
||||||
if (TAI->getCOMMDirectiveTakesAlignment())
|
if (MAI->getCOMMDirectiveTakesAlignment())
|
||||||
O << ',' << (TAI->getAlignmentIsInBytes() ? (1 << Align) : Align);
|
O << ',' << (MAI->getAlignmentIsInBytes() ? (1 << Align) : Align);
|
||||||
|
|
||||||
if (VerboseAsm) {
|
if (VerboseAsm) {
|
||||||
O << "\t\t" << TAI->getCommentString() << ' ';
|
O << "\t\t" << MAI->getCommentString() << ' ';
|
||||||
WriteAsOperand(O, GVar, /*PrintType=*/false, GVar->getParent());
|
WriteAsOperand(O, GVar, /*PrintType=*/false, GVar->getParent());
|
||||||
}
|
}
|
||||||
O << '\n';
|
O << '\n';
|
||||||
@ -370,11 +370,11 @@ void SystemZAsmPrinter::PrintGlobalVariable(const GlobalVariable* GVar) {
|
|||||||
EmitAlignment(Align, GVar, 1);
|
EmitAlignment(Align, GVar, 1);
|
||||||
O << name << ":";
|
O << name << ":";
|
||||||
if (VerboseAsm) {
|
if (VerboseAsm) {
|
||||||
O << "\t\t\t\t" << TAI->getCommentString() << ' ';
|
O << "\t\t\t\t" << MAI->getCommentString() << ' ';
|
||||||
WriteAsOperand(O, GVar, /*PrintType=*/false, GVar->getParent());
|
WriteAsOperand(O, GVar, /*PrintType=*/false, GVar->getParent());
|
||||||
}
|
}
|
||||||
O << '\n';
|
O << '\n';
|
||||||
if (TAI->hasDotTypeDotSizeDirective())
|
if (MAI->hasDotTypeDotSizeDirective())
|
||||||
O << "\t.size\t" << name << ", " << Size << '\n';
|
O << "\t.size\t" << name << ", " << Size << '\n';
|
||||||
|
|
||||||
EmitGlobalConstant(C);
|
EmitGlobalConstant(C);
|
||||||
|
@ -73,21 +73,21 @@ bool TargetInstrInfo::isUnpredicatedTerminator(const MachineInstr *MI) const {
|
|||||||
/// Variable-length instructions are not handled here; this function
|
/// Variable-length instructions are not handled here; this function
|
||||||
/// may be overloaded in the target code to do that.
|
/// may be overloaded in the target code to do that.
|
||||||
unsigned TargetInstrInfo::getInlineAsmLength(const char *Str,
|
unsigned TargetInstrInfo::getInlineAsmLength(const char *Str,
|
||||||
const MCAsmInfo &TAI) const {
|
const MCAsmInfo &MAI) const {
|
||||||
|
|
||||||
|
|
||||||
// Count the number of instructions in the asm.
|
// Count the number of instructions in the asm.
|
||||||
bool atInsnStart = true;
|
bool atInsnStart = true;
|
||||||
unsigned Length = 0;
|
unsigned Length = 0;
|
||||||
for (; *Str; ++Str) {
|
for (; *Str; ++Str) {
|
||||||
if (*Str == '\n' || *Str == TAI.getSeparatorChar())
|
if (*Str == '\n' || *Str == MAI.getSeparatorChar())
|
||||||
atInsnStart = true;
|
atInsnStart = true;
|
||||||
if (atInsnStart && !isspace(*Str)) {
|
if (atInsnStart && !isspace(*Str)) {
|
||||||
Length += TAI.getMaxInstLength();
|
Length += MAI.getMaxInstLength();
|
||||||
atInsnStart = false;
|
atInsnStart = false;
|
||||||
}
|
}
|
||||||
if (atInsnStart && strncmp(Str, TAI.getCommentString(),
|
if (atInsnStart && strncmp(Str, MAI.getCommentString(),
|
||||||
strlen(TAI.getCommentString())) == 0)
|
strlen(MAI.getCommentString())) == 0)
|
||||||
atInsnStart = false;
|
atInsnStart = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -193,7 +193,7 @@ void X86ATTAsmPrinter::emitFunctionHeader(const MachineFunction &MF) {
|
|||||||
case Function::WeakODRLinkage:
|
case Function::WeakODRLinkage:
|
||||||
if (Subtarget->isTargetDarwin()) {
|
if (Subtarget->isTargetDarwin()) {
|
||||||
O << "\t.globl\t" << CurrentFnName << '\n';
|
O << "\t.globl\t" << CurrentFnName << '\n';
|
||||||
O << TAI->getWeakDefDirective() << CurrentFnName << '\n';
|
O << MAI->getWeakDefDirective() << CurrentFnName << '\n';
|
||||||
} else if (Subtarget->isTargetCygMing()) {
|
} else if (Subtarget->isTargetCygMing()) {
|
||||||
O << "\t.globl\t" << CurrentFnName << "\n"
|
O << "\t.globl\t" << CurrentFnName << "\n"
|
||||||
"\t.linkonce discard\n";
|
"\t.linkonce discard\n";
|
||||||
@ -217,8 +217,8 @@ void X86ATTAsmPrinter::emitFunctionHeader(const MachineFunction &MF) {
|
|||||||
|
|
||||||
O << CurrentFnName << ':';
|
O << CurrentFnName << ':';
|
||||||
if (VerboseAsm) {
|
if (VerboseAsm) {
|
||||||
O.PadToColumn(TAI->getCommentColumn());
|
O.PadToColumn(MAI->getCommentColumn());
|
||||||
O << TAI->getCommentString() << ' ';
|
O << MAI->getCommentString() << ' ';
|
||||||
WriteAsOperand(O, F, /*PrintType=*/false, F->getParent());
|
WriteAsOperand(O, F, /*PrintType=*/false, F->getParent());
|
||||||
}
|
}
|
||||||
O << '\n';
|
O << '\n';
|
||||||
@ -255,7 +255,7 @@ bool X86ATTAsmPrinter::runOnMachineFunction(MachineFunction &MF) {
|
|||||||
emitFunctionHeader(MF);
|
emitFunctionHeader(MF);
|
||||||
|
|
||||||
// Emit pre-function debug and/or EH information.
|
// Emit pre-function debug and/or EH information.
|
||||||
if (TAI->doesSupportDebugInformation() || TAI->doesSupportExceptionHandling())
|
if (MAI->doesSupportDebugInformation() || MAI->doesSupportExceptionHandling())
|
||||||
DW->BeginFunction(&MF);
|
DW->BeginFunction(&MF);
|
||||||
|
|
||||||
// Print out code for the function.
|
// Print out code for the function.
|
||||||
@ -287,11 +287,11 @@ bool X86ATTAsmPrinter::runOnMachineFunction(MachineFunction &MF) {
|
|||||||
O << "\tnop\n";
|
O << "\tnop\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
if (TAI->hasDotTypeDotSizeDirective())
|
if (MAI->hasDotTypeDotSizeDirective())
|
||||||
O << "\t.size\t" << CurrentFnName << ", .-" << CurrentFnName << '\n';
|
O << "\t.size\t" << CurrentFnName << ", .-" << CurrentFnName << '\n';
|
||||||
|
|
||||||
// Emit post-function debug information.
|
// Emit post-function debug information.
|
||||||
if (TAI->doesSupportDebugInformation() || TAI->doesSupportExceptionHandling())
|
if (MAI->doesSupportDebugInformation() || MAI->doesSupportExceptionHandling())
|
||||||
DW->EndFunction(&MF);
|
DW->EndFunction(&MF);
|
||||||
|
|
||||||
// Print out jump tables referenced by the function.
|
// Print out jump tables referenced by the function.
|
||||||
@ -308,11 +308,11 @@ void X86ATTAsmPrinter::printSymbolOperand(const MachineOperand &MO) {
|
|||||||
switch (MO.getType()) {
|
switch (MO.getType()) {
|
||||||
default: llvm_unreachable("unknown symbol type!");
|
default: llvm_unreachable("unknown symbol type!");
|
||||||
case MachineOperand::MO_JumpTableIndex:
|
case MachineOperand::MO_JumpTableIndex:
|
||||||
O << TAI->getPrivateGlobalPrefix() << "JTI" << getFunctionNumber() << '_'
|
O << MAI->getPrivateGlobalPrefix() << "JTI" << getFunctionNumber() << '_'
|
||||||
<< MO.getIndex();
|
<< MO.getIndex();
|
||||||
break;
|
break;
|
||||||
case MachineOperand::MO_ConstantPoolIndex:
|
case MachineOperand::MO_ConstantPoolIndex:
|
||||||
O << TAI->getPrivateGlobalPrefix() << "CPI" << getFunctionNumber() << '_'
|
O << MAI->getPrivateGlobalPrefix() << "CPI" << getFunctionNumber() << '_'
|
||||||
<< MO.getIndex();
|
<< MO.getIndex();
|
||||||
printOffset(MO.getOffset());
|
printOffset(MO.getOffset());
|
||||||
break;
|
break;
|
||||||
@ -535,18 +535,18 @@ void X86ATTAsmPrinter::printMemReference(const MachineInstr *MI, unsigned Op,
|
|||||||
|
|
||||||
void X86ATTAsmPrinter::printPICJumpTableSetLabel(unsigned uid,
|
void X86ATTAsmPrinter::printPICJumpTableSetLabel(unsigned uid,
|
||||||
const MachineBasicBlock *MBB) const {
|
const MachineBasicBlock *MBB) const {
|
||||||
if (!TAI->getSetDirective())
|
if (!MAI->getSetDirective())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
// We don't need .set machinery if we have GOT-style relocations
|
// We don't need .set machinery if we have GOT-style relocations
|
||||||
if (Subtarget->isPICStyleGOT())
|
if (Subtarget->isPICStyleGOT())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
O << TAI->getSetDirective() << ' ' << TAI->getPrivateGlobalPrefix()
|
O << MAI->getSetDirective() << ' ' << MAI->getPrivateGlobalPrefix()
|
||||||
<< getFunctionNumber() << '_' << uid << "_set_" << MBB->getNumber() << ',';
|
<< getFunctionNumber() << '_' << uid << "_set_" << MBB->getNumber() << ',';
|
||||||
printBasicBlockLabel(MBB, false, false, false);
|
printBasicBlockLabel(MBB, false, false, false);
|
||||||
if (Subtarget->isPICStyleRIPRel())
|
if (Subtarget->isPICStyleRIPRel())
|
||||||
O << '-' << TAI->getPrivateGlobalPrefix() << "JTI" << getFunctionNumber()
|
O << '-' << MAI->getPrivateGlobalPrefix() << "JTI" << getFunctionNumber()
|
||||||
<< '_' << uid << '\n';
|
<< '_' << uid << '\n';
|
||||||
else {
|
else {
|
||||||
O << '-';
|
O << '-';
|
||||||
@ -568,12 +568,12 @@ void X86ATTAsmPrinter::printPICJumpTableEntry(const MachineJumpTableInfo *MJTI,
|
|||||||
const MachineBasicBlock *MBB,
|
const MachineBasicBlock *MBB,
|
||||||
unsigned uid) const {
|
unsigned uid) const {
|
||||||
const char *JTEntryDirective = MJTI->getEntrySize() == 4 ?
|
const char *JTEntryDirective = MJTI->getEntrySize() == 4 ?
|
||||||
TAI->getData32bitsDirective() : TAI->getData64bitsDirective();
|
MAI->getData32bitsDirective() : MAI->getData64bitsDirective();
|
||||||
|
|
||||||
O << JTEntryDirective << ' ';
|
O << JTEntryDirective << ' ';
|
||||||
|
|
||||||
if (Subtarget->isPICStyleRIPRel() || Subtarget->isPICStyleStubPIC()) {
|
if (Subtarget->isPICStyleRIPRel() || Subtarget->isPICStyleStubPIC()) {
|
||||||
O << TAI->getPrivateGlobalPrefix() << getFunctionNumber()
|
O << MAI->getPrivateGlobalPrefix() << getFunctionNumber()
|
||||||
<< '_' << uid << "_set_" << MBB->getNumber();
|
<< '_' << uid << "_set_" << MBB->getNumber();
|
||||||
} else if (Subtarget->isPICStyleGOT()) {
|
} else if (Subtarget->isPICStyleGOT()) {
|
||||||
printBasicBlockLabel(MBB, false, false, false);
|
printBasicBlockLabel(MBB, false, false, false);
|
||||||
@ -950,7 +950,7 @@ void X86ATTAsmPrinter::PrintGlobalVariable(const GlobalVariable* GVar) {
|
|||||||
// Don't put things that should go in the cstring section into "comm".
|
// Don't put things that should go in the cstring section into "comm".
|
||||||
!TheSection->getKind().isMergeableCString()) {
|
!TheSection->getKind().isMergeableCString()) {
|
||||||
if (GVar->hasExternalLinkage()) {
|
if (GVar->hasExternalLinkage()) {
|
||||||
if (const char *Directive = TAI->getZeroFillDirective()) {
|
if (const char *Directive = MAI->getZeroFillDirective()) {
|
||||||
O << "\t.globl " << name << '\n';
|
O << "\t.globl " << name << '\n';
|
||||||
O << Directive << "__DATA, __common, " << name << ", "
|
O << Directive << "__DATA, __common, " << name << ", "
|
||||||
<< Size << ", " << Align << '\n';
|
<< Size << ", " << Align << '\n';
|
||||||
@ -962,41 +962,41 @@ void X86ATTAsmPrinter::PrintGlobalVariable(const GlobalVariable* GVar) {
|
|||||||
(GVar->hasLocalLinkage() || GVar->isWeakForLinker())) {
|
(GVar->hasLocalLinkage() || GVar->isWeakForLinker())) {
|
||||||
if (Size == 0) Size = 1; // .comm Foo, 0 is undefined, avoid it.
|
if (Size == 0) Size = 1; // .comm Foo, 0 is undefined, avoid it.
|
||||||
|
|
||||||
if (TAI->getLCOMMDirective() != NULL) {
|
if (MAI->getLCOMMDirective() != NULL) {
|
||||||
if (GVar->hasLocalLinkage()) {
|
if (GVar->hasLocalLinkage()) {
|
||||||
O << TAI->getLCOMMDirective() << name << ',' << Size;
|
O << MAI->getLCOMMDirective() << name << ',' << Size;
|
||||||
if (Subtarget->isTargetDarwin())
|
if (Subtarget->isTargetDarwin())
|
||||||
O << ',' << Align;
|
O << ',' << Align;
|
||||||
} else if (Subtarget->isTargetDarwin() && !GVar->hasCommonLinkage()) {
|
} else if (Subtarget->isTargetDarwin() && !GVar->hasCommonLinkage()) {
|
||||||
O << "\t.globl " << name << '\n'
|
O << "\t.globl " << name << '\n'
|
||||||
<< TAI->getWeakDefDirective() << name << '\n';
|
<< MAI->getWeakDefDirective() << name << '\n';
|
||||||
EmitAlignment(Align, GVar);
|
EmitAlignment(Align, GVar);
|
||||||
O << name << ":";
|
O << name << ":";
|
||||||
if (VerboseAsm) {
|
if (VerboseAsm) {
|
||||||
O.PadToColumn(TAI->getCommentColumn());
|
O.PadToColumn(MAI->getCommentColumn());
|
||||||
O << TAI->getCommentString() << ' ';
|
O << MAI->getCommentString() << ' ';
|
||||||
WriteAsOperand(O, GVar, /*PrintType=*/false, GVar->getParent());
|
WriteAsOperand(O, GVar, /*PrintType=*/false, GVar->getParent());
|
||||||
}
|
}
|
||||||
O << '\n';
|
O << '\n';
|
||||||
EmitGlobalConstant(C);
|
EmitGlobalConstant(C);
|
||||||
return;
|
return;
|
||||||
} else {
|
} else {
|
||||||
O << TAI->getCOMMDirective() << name << ',' << Size;
|
O << MAI->getCOMMDirective() << name << ',' << Size;
|
||||||
if (TAI->getCOMMDirectiveTakesAlignment())
|
if (MAI->getCOMMDirectiveTakesAlignment())
|
||||||
O << ',' << (TAI->getAlignmentIsInBytes() ? (1 << Align) : Align);
|
O << ',' << (MAI->getAlignmentIsInBytes() ? (1 << Align) : Align);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (!Subtarget->isTargetCygMing()) {
|
if (!Subtarget->isTargetCygMing()) {
|
||||||
if (GVar->hasLocalLinkage())
|
if (GVar->hasLocalLinkage())
|
||||||
O << "\t.local\t" << name << '\n';
|
O << "\t.local\t" << name << '\n';
|
||||||
}
|
}
|
||||||
O << TAI->getCOMMDirective() << name << ',' << Size;
|
O << MAI->getCOMMDirective() << name << ',' << Size;
|
||||||
if (TAI->getCOMMDirectiveTakesAlignment())
|
if (MAI->getCOMMDirectiveTakesAlignment())
|
||||||
O << ',' << (TAI->getAlignmentIsInBytes() ? (1 << Align) : Align);
|
O << ',' << (MAI->getAlignmentIsInBytes() ? (1 << Align) : Align);
|
||||||
}
|
}
|
||||||
if (VerboseAsm) {
|
if (VerboseAsm) {
|
||||||
O.PadToColumn(TAI->getCommentColumn());
|
O.PadToColumn(MAI->getCommentColumn());
|
||||||
O << TAI->getCommentString() << ' ';
|
O << MAI->getCommentString() << ' ';
|
||||||
WriteAsOperand(O, GVar, /*PrintType=*/false, GVar->getParent());
|
WriteAsOperand(O, GVar, /*PrintType=*/false, GVar->getParent());
|
||||||
}
|
}
|
||||||
O << '\n';
|
O << '\n';
|
||||||
@ -1013,7 +1013,7 @@ void X86ATTAsmPrinter::PrintGlobalVariable(const GlobalVariable* GVar) {
|
|||||||
case GlobalValue::LinkerPrivateLinkage:
|
case GlobalValue::LinkerPrivateLinkage:
|
||||||
if (Subtarget->isTargetDarwin()) {
|
if (Subtarget->isTargetDarwin()) {
|
||||||
O << "\t.globl " << name << '\n'
|
O << "\t.globl " << name << '\n'
|
||||||
<< TAI->getWeakDefDirective() << name << '\n';
|
<< MAI->getWeakDefDirective() << name << '\n';
|
||||||
} else if (Subtarget->isTargetCygMing()) {
|
} else if (Subtarget->isTargetCygMing()) {
|
||||||
O << "\t.globl\t" << name << "\n"
|
O << "\t.globl\t" << name << "\n"
|
||||||
"\t.linkonce same_size\n";
|
"\t.linkonce same_size\n";
|
||||||
@ -1039,15 +1039,15 @@ void X86ATTAsmPrinter::PrintGlobalVariable(const GlobalVariable* GVar) {
|
|||||||
EmitAlignment(Align, GVar);
|
EmitAlignment(Align, GVar);
|
||||||
O << name << ":";
|
O << name << ":";
|
||||||
if (VerboseAsm){
|
if (VerboseAsm){
|
||||||
O.PadToColumn(TAI->getCommentColumn());
|
O.PadToColumn(MAI->getCommentColumn());
|
||||||
O << TAI->getCommentString() << ' ';
|
O << MAI->getCommentString() << ' ';
|
||||||
WriteAsOperand(O, GVar, /*PrintType=*/false, GVar->getParent());
|
WriteAsOperand(O, GVar, /*PrintType=*/false, GVar->getParent());
|
||||||
}
|
}
|
||||||
O << '\n';
|
O << '\n';
|
||||||
|
|
||||||
EmitGlobalConstant(C);
|
EmitGlobalConstant(C);
|
||||||
|
|
||||||
if (TAI->hasDotTypeDotSizeDirective())
|
if (MAI->hasDotTypeDotSizeDirective())
|
||||||
O << "\t.size\t" << name << ", " << Size << '\n';
|
O << "\t.size\t" << name << ", " << Size << '\n';
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1066,7 +1066,7 @@ bool X86ATTAsmPrinter::doFinalization(Module &M) {
|
|||||||
|
|
||||||
// Add the (possibly multiple) personalities to the set of global value
|
// Add the (possibly multiple) personalities to the set of global value
|
||||||
// stubs. Only referenced functions get into the Personalities list.
|
// stubs. Only referenced functions get into the Personalities list.
|
||||||
if (TAI->doesSupportExceptionHandling() && MMI && !Subtarget->is64Bit()) {
|
if (MAI->doesSupportExceptionHandling() && MMI && !Subtarget->is64Bit()) {
|
||||||
const std::vector<Function*> &Personalities = MMI->getPersonalities();
|
const std::vector<Function*> &Personalities = MMI->getPersonalities();
|
||||||
for (unsigned i = 0, e = Personalities.size(); i != e; ++i) {
|
for (unsigned i = 0, e = Personalities.size(); i != e; ++i) {
|
||||||
if (Personalities[i])
|
if (Personalities[i])
|
||||||
@ -1110,7 +1110,7 @@ bool X86ATTAsmPrinter::doFinalization(Module &M) {
|
|||||||
EmitAlignment(2);
|
EmitAlignment(2);
|
||||||
for (StringMap<std::string>::iterator I = HiddenGVStubs.begin(),
|
for (StringMap<std::string>::iterator I = HiddenGVStubs.begin(),
|
||||||
E = HiddenGVStubs.end(); I != E; ++I)
|
E = HiddenGVStubs.end(); I != E; ++I)
|
||||||
O << I->getKeyData() << ":\n" << TAI->getData32bitsDirective()
|
O << I->getKeyData() << ":\n" << MAI->getData32bitsDirective()
|
||||||
<< I->second << '\n';
|
<< I->second << '\n';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -60,7 +60,7 @@ void X86ATTAsmPrinter::print_pcrel_imm(const MCInst *MI, unsigned OpNo) {
|
|||||||
else if (Op.isMBBLabel())
|
else if (Op.isMBBLabel())
|
||||||
// FIXME: Keep in sync with printBasicBlockLabel. printBasicBlockLabel
|
// FIXME: Keep in sync with printBasicBlockLabel. printBasicBlockLabel
|
||||||
// should eventually call into this code, not the other way around.
|
// should eventually call into this code, not the other way around.
|
||||||
O << TAI->getPrivateGlobalPrefix() << "BB" << Op.getMBBLabelFunction()
|
O << MAI->getPrivateGlobalPrefix() << "BB" << Op.getMBBLabelFunction()
|
||||||
<< '_' << Op.getMBBLabelBlock();
|
<< '_' << Op.getMBBLabelBlock();
|
||||||
else
|
else
|
||||||
llvm_unreachable("Unknown pcrel immediate operand");
|
llvm_unreachable("Unknown pcrel immediate operand");
|
||||||
|
@ -226,14 +226,14 @@ void X86IntelAsmPrinter::printOp(const MachineOperand &MO,
|
|||||||
case MachineOperand::MO_JumpTableIndex: {
|
case MachineOperand::MO_JumpTableIndex: {
|
||||||
bool isMemOp = Modifier && !strcmp(Modifier, "mem");
|
bool isMemOp = Modifier && !strcmp(Modifier, "mem");
|
||||||
if (!isMemOp) O << "OFFSET ";
|
if (!isMemOp) O << "OFFSET ";
|
||||||
O << TAI->getPrivateGlobalPrefix() << "JTI" << getFunctionNumber()
|
O << MAI->getPrivateGlobalPrefix() << "JTI" << getFunctionNumber()
|
||||||
<< "_" << MO.getIndex();
|
<< "_" << MO.getIndex();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
case MachineOperand::MO_ConstantPoolIndex: {
|
case MachineOperand::MO_ConstantPoolIndex: {
|
||||||
bool isMemOp = Modifier && !strcmp(Modifier, "mem");
|
bool isMemOp = Modifier && !strcmp(Modifier, "mem");
|
||||||
if (!isMemOp) O << "OFFSET ";
|
if (!isMemOp) O << "OFFSET ";
|
||||||
O << "[" << TAI->getPrivateGlobalPrefix() << "CPI"
|
O << "[" << MAI->getPrivateGlobalPrefix() << "CPI"
|
||||||
<< getFunctionNumber() << "_" << MO.getIndex();
|
<< getFunctionNumber() << "_" << MO.getIndex();
|
||||||
printOffset(MO.getOffset());
|
printOffset(MO.getOffset());
|
||||||
O << "]";
|
O << "]";
|
||||||
@ -258,7 +258,7 @@ void X86IntelAsmPrinter::printOp(const MachineOperand &MO,
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
case MachineOperand::MO_ExternalSymbol: {
|
case MachineOperand::MO_ExternalSymbol: {
|
||||||
O << TAI->getGlobalPrefix() << MO.getSymbolName();
|
O << MAI->getGlobalPrefix() << MO.getSymbolName();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
@ -293,7 +293,7 @@ void X86IntelAsmPrinter::print_pcrel_imm(const MachineInstr *MI, unsigned OpNo){
|
|||||||
}
|
}
|
||||||
|
|
||||||
case MachineOperand::MO_ExternalSymbol:
|
case MachineOperand::MO_ExternalSymbol:
|
||||||
O << TAI->getGlobalPrefix() << MO.getSymbolName();
|
O << MAI->getGlobalPrefix() << MO.getSymbolName();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -357,10 +357,10 @@ void X86IntelAsmPrinter::printMemReference(const MachineInstr *MI, unsigned Op,
|
|||||||
|
|
||||||
void X86IntelAsmPrinter::printPICJumpTableSetLabel(unsigned uid,
|
void X86IntelAsmPrinter::printPICJumpTableSetLabel(unsigned uid,
|
||||||
const MachineBasicBlock *MBB) const {
|
const MachineBasicBlock *MBB) const {
|
||||||
if (!TAI->getSetDirective())
|
if (!MAI->getSetDirective())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
O << TAI->getSetDirective() << ' ' << TAI->getPrivateGlobalPrefix()
|
O << MAI->getSetDirective() << ' ' << MAI->getPrivateGlobalPrefix()
|
||||||
<< getFunctionNumber() << '_' << uid << "_set_" << MBB->getNumber() << ',';
|
<< getFunctionNumber() << '_' << uid << "_set_" << MBB->getNumber() << ',';
|
||||||
printBasicBlockLabel(MBB, false, false, false);
|
printBasicBlockLabel(MBB, false, false, false);
|
||||||
O << '-' << "\"L" << getFunctionNumber() << "$pb\"'\n";
|
O << '-' << "\"L" << getFunctionNumber() << "$pb\"'\n";
|
||||||
@ -525,8 +525,8 @@ void X86IntelAsmPrinter::PrintGlobalVariable(const GlobalVariable *GV) {
|
|||||||
|
|
||||||
O << name << ":";
|
O << name << ":";
|
||||||
if (VerboseAsm)
|
if (VerboseAsm)
|
||||||
O.PadToColumn(TAI->getCommentColumn());
|
O.PadToColumn(MAI->getCommentColumn());
|
||||||
O << TAI->getCommentString()
|
O << MAI->getCommentString()
|
||||||
<< " " << GV->getName();
|
<< " " << GV->getName();
|
||||||
O << '\n';
|
O << '\n';
|
||||||
|
|
||||||
|
@ -97,7 +97,7 @@ namespace {
|
|||||||
void XCoreAsmPrinter::
|
void XCoreAsmPrinter::
|
||||||
emitGlobalDirective(const std::string &name)
|
emitGlobalDirective(const std::string &name)
|
||||||
{
|
{
|
||||||
O << TAI->getGlobalDirective() << name;
|
O << MAI->getGlobalDirective() << name;
|
||||||
O << "\n";
|
O << "\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -117,12 +117,12 @@ emitArrayBound(const std::string &name, const GlobalVariable *GV)
|
|||||||
if (const ArrayType *ATy = dyn_cast<ArrayType>(
|
if (const ArrayType *ATy = dyn_cast<ArrayType>(
|
||||||
cast<PointerType>(GV->getType())->getElementType()))
|
cast<PointerType>(GV->getType())->getElementType()))
|
||||||
{
|
{
|
||||||
O << TAI->getGlobalDirective() << name << ".globound" << "\n";
|
O << MAI->getGlobalDirective() << name << ".globound" << "\n";
|
||||||
O << TAI->getSetDirective() << name << ".globound" << ","
|
O << MAI->getSetDirective() << name << ".globound" << ","
|
||||||
<< ATy->getNumElements() << "\n";
|
<< ATy->getNumElements() << "\n";
|
||||||
if (GV->hasWeakLinkage() || GV->hasLinkOnceLinkage()) {
|
if (GV->hasWeakLinkage() || GV->hasLinkOnceLinkage()) {
|
||||||
// TODO Use COMDAT groups for LinkOnceLinkage
|
// TODO Use COMDAT groups for LinkOnceLinkage
|
||||||
O << TAI->getWeakDefDirective() << name << ".globound" << "\n";
|
O << MAI->getWeakDefDirective() << name << ".globound" << "\n";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -156,7 +156,7 @@ void XCoreAsmPrinter::PrintGlobalVariable(const GlobalVariable *GV) {
|
|||||||
emitGlobalDirective(name);
|
emitGlobalDirective(name);
|
||||||
// TODO Use COMDAT groups for LinkOnceLinkage
|
// TODO Use COMDAT groups for LinkOnceLinkage
|
||||||
if (GV->hasWeakLinkage() || GV->hasLinkOnceLinkage()) {
|
if (GV->hasWeakLinkage() || GV->hasLinkOnceLinkage()) {
|
||||||
O << TAI->getWeakDefDirective() << name << "\n";
|
O << MAI->getWeakDefDirective() << name << "\n";
|
||||||
}
|
}
|
||||||
// FALL THROUGH
|
// FALL THROUGH
|
||||||
case GlobalValue::InternalLinkage:
|
case GlobalValue::InternalLinkage:
|
||||||
@ -179,7 +179,7 @@ void XCoreAsmPrinter::PrintGlobalVariable(const GlobalVariable *GV) {
|
|||||||
if (GV->isThreadLocal()) {
|
if (GV->isThreadLocal()) {
|
||||||
Size *= MaxThreads;
|
Size *= MaxThreads;
|
||||||
}
|
}
|
||||||
if (TAI->hasDotTypeDotSizeDirective()) {
|
if (MAI->hasDotTypeDotSizeDirective()) {
|
||||||
O << "\t.type " << name << ",@object\n";
|
O << "\t.type " << name << ",@object\n";
|
||||||
O << "\t.size " << name << "," << Size << "\n";
|
O << "\t.size " << name << "," << Size << "\n";
|
||||||
}
|
}
|
||||||
@ -225,13 +225,13 @@ void XCoreAsmPrinter::emitFunctionStart(MachineFunction &MF) {
|
|||||||
case Function::WeakAnyLinkage:
|
case Function::WeakAnyLinkage:
|
||||||
case Function::WeakODRLinkage:
|
case Function::WeakODRLinkage:
|
||||||
// TODO Use COMDAT groups for LinkOnceLinkage
|
// TODO Use COMDAT groups for LinkOnceLinkage
|
||||||
O << TAI->getGlobalDirective() << CurrentFnName << "\n";
|
O << MAI->getGlobalDirective() << CurrentFnName << "\n";
|
||||||
O << TAI->getWeakDefDirective() << CurrentFnName << "\n";
|
O << MAI->getWeakDefDirective() << CurrentFnName << "\n";
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
// (1 << 1) byte aligned
|
// (1 << 1) byte aligned
|
||||||
EmitAlignment(MF.getAlignment(), F, 1);
|
EmitAlignment(MF.getAlignment(), F, 1);
|
||||||
if (TAI->hasDotTypeDotSizeDirective()) {
|
if (MAI->hasDotTypeDotSizeDirective()) {
|
||||||
O << "\t.type " << CurrentFnName << ",@function\n";
|
O << "\t.type " << CurrentFnName << ",@function\n";
|
||||||
}
|
}
|
||||||
O << CurrentFnName << ":\n";
|
O << CurrentFnName << ":\n";
|
||||||
@ -331,11 +331,11 @@ void XCoreAsmPrinter::printOperand(const MachineInstr *MI, int opNum) {
|
|||||||
O << MO.getSymbolName();
|
O << MO.getSymbolName();
|
||||||
break;
|
break;
|
||||||
case MachineOperand::MO_ConstantPoolIndex:
|
case MachineOperand::MO_ConstantPoolIndex:
|
||||||
O << TAI->getPrivateGlobalPrefix() << "CPI" << getFunctionNumber()
|
O << MAI->getPrivateGlobalPrefix() << "CPI" << getFunctionNumber()
|
||||||
<< '_' << MO.getIndex();
|
<< '_' << MO.getIndex();
|
||||||
break;
|
break;
|
||||||
case MachineOperand::MO_JumpTableIndex:
|
case MachineOperand::MO_JumpTableIndex:
|
||||||
O << TAI->getPrivateGlobalPrefix() << "JTI" << getFunctionNumber()
|
O << MAI->getPrivateGlobalPrefix() << "JTI" << getFunctionNumber()
|
||||||
<< '_' << MO.getIndex();
|
<< '_' << MO.getIndex();
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
@ -26,7 +26,7 @@ MCSectionXCore::Create(const StringRef &Section, unsigned Type,
|
|||||||
|
|
||||||
/// PrintTargetSpecificSectionFlags - This handles the XCore-specific cp/dp
|
/// PrintTargetSpecificSectionFlags - This handles the XCore-specific cp/dp
|
||||||
/// section flags.
|
/// section flags.
|
||||||
void MCSectionXCore::PrintTargetSpecificSectionFlags(const MCAsmInfo &TAI,
|
void MCSectionXCore::PrintTargetSpecificSectionFlags(const MCAsmInfo &MAI,
|
||||||
raw_ostream &OS) const {
|
raw_ostream &OS) const {
|
||||||
if (getFlags() & MCSectionXCore::SHF_CP_SECTION)
|
if (getFlags() & MCSectionXCore::SHF_CP_SECTION)
|
||||||
OS << 'c';
|
OS << 'c';
|
||||||
|
@ -44,7 +44,7 @@ public:
|
|||||||
|
|
||||||
/// PrintTargetSpecificSectionFlags - This handles the XCore-specific cp/dp
|
/// PrintTargetSpecificSectionFlags - This handles the XCore-specific cp/dp
|
||||||
/// section flags.
|
/// section flags.
|
||||||
virtual void PrintTargetSpecificSectionFlags(const MCAsmInfo &TAI,
|
virtual void PrintTargetSpecificSectionFlags(const MCAsmInfo &MAI,
|
||||||
raw_ostream &OS) const;
|
raw_ostream &OS) const;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
Loading…
Reference in New Issue
Block a user