#include "llvm/CodeGen/MachineModuleInfo.h"
#include "llvm/CodeGen/DwarfWriter.h"
#include "llvm/Analysis/DebugInfo.h"
+#include "llvm/MC/MCContext.h"
#include "llvm/MC/MCInst.h"
+#include "llvm/MC/MCSection.h"
+#include "llvm/MC/MCStreamer.h"
#include "llvm/Support/CommandLine.h"
#include "llvm/Support/ErrorHandling.h"
#include "llvm/Support/FormattedStream.h"
#include "llvm/Target/TargetAsmInfo.h"
#include "llvm/Target/TargetData.h"
#include "llvm/Target/TargetLowering.h"
+#include "llvm/Target/TargetLoweringObjectFile.h"
#include "llvm/Target/TargetOptions.h"
#include "llvm/Target/TargetRegisterInfo.h"
#include "llvm/ADT/SmallPtrSet.h"
const TargetAsmInfo *T, bool VDef)
: MachineFunctionPass(&ID), FunctionNumber(0), O(o),
TM(tm), TAI(T), TRI(tm.getRegisterInfo()),
+
+ OutContext(*new MCContext()),
+ OutStreamer(*createAsmStreamer(OutContext, O)),
+
IsInTextSection(false), LastMI(0), LastFn(0), Counter(~0U),
PrevDLT(0, ~0U, ~0U) {
DW = 0; MMI = 0;
for (gcp_iterator I = GCMetadataPrinters.begin(),
E = GCMetadataPrinters.end(); I != E; ++I)
delete I->second;
+
+ delete &OutStreamer;
+ delete &OutContext;
+}
+
+const TargetLoweringObjectFile &AsmPrinter::getObjFileLowering() const {
+ return TM.getTargetLowering()->getObjFileLowering();
}
+
/// SwitchToTextSection - Switch to the specified text section of the executable
/// if we are not already in it!
///
/// SwitchToSection - Switch to the specified section of the executable if we
/// are not already in it!
-void AsmPrinter::SwitchToSection(const Section* NS) {
- const std::string& NewSection = NS->getName();
+void AsmPrinter::SwitchToSection(const MCSection *NS) {
+ const std::string &NewSection = NS->getName();
// If we're already in this section, we're done.
if (CurrentSection == NewSection) return;
// If section is named we need to switch into it via special '.section'
// directive and also append funky flags. Otherwise - section name is just
// some magic assembler directive.
- if (NS->hasFlag(SectionFlags::Named))
+ if (NS->getKind().hasExplicitSection()) {
+ SmallString<32> FlagsStr;
+
+ getObjFileLowering().getSectionFlagsAsString(NS->getKind(), FlagsStr);
+
O << TAI->getSwitchToSectionDirective()
<< CurrentSection
- << TAI->getSectionFlags(NS->getFlags());
- else
+ << FlagsStr.c_str();
+ } else {
O << CurrentSection;
+ }
O << TAI->getDataSectionStartSuffix() << '\n';
}
- IsInTextSection = (NS->getFlags() & SectionFlags::Code);
+ IsInTextSection = NS->getKind().isText();
}
void AsmPrinter::getAnalysisUsage(AnalysisUsage &AU) const {
}
bool AsmPrinter::doInitialization(Module &M) {
+ // Initialize TargetLoweringObjectFile.
+ const_cast<TargetLoweringObjectFile&>(getObjFileLowering())
+ .Initialize(OutContext, TM);
+
Mang = new Mangler(M, TAI->getGlobalPrefix(), TAI->getPrivateGlobalPrefix(),
TAI->getLinkerPrivateGlobalPrefix());
}
if (TAI->getSetDirective()) {
- if (!M.alias_empty())
- SwitchToSection(TAI->getTextSection());
-
O << '\n';
for (Module::const_alias_iterator I = M.alias_begin(), E = M.alias_end();
I != E; ++I) {
delete Mang; Mang = 0;
DW = 0; MMI = 0;
+
+ OutStreamer.Finish();
return false;
}
namespace {
// SectionCPs - Keep track the alignment, constpool entries per Section.
struct SectionCPs {
- const Section *S;
+ const MCSection *S;
unsigned Alignment;
SmallVector<unsigned, 4> CPEs;
- SectionCPs(const Section *s, unsigned a) : S(s), Alignment(a) {};
+ SectionCPs(const MCSection *s, unsigned a) : S(s), Alignment(a) {};
};
}
SectionKind Kind;
switch (CPE.getRelocationInfo()) {
default: llvm_unreachable("Unknown section kind");
- case 2: Kind = SectionKind::getReadOnlyWithRel(); break;
- case 1: Kind = SectionKind::getReadOnlyWithRelLocal(); break;
+ case 2: Kind = SectionKind::get(SectionKind::ReadOnlyWithRel, false); break;
+ case 1:
+ Kind = SectionKind::get(SectionKind::ReadOnlyWithRelLocal,false);
+ break;
case 0:
- switch (TM.getTargetData()->getTypeAllocSize(CPE.getType())) {
- case 4: Kind = SectionKind::getMergableConst4(); break;
- case 8: Kind = SectionKind::getMergableConst8(); break;
- case 16: Kind = SectionKind::getMergableConst16(); break;
- default: Kind = SectionKind::getMergableConst(); break;
- }
+ switch (TM.getTargetData()->getTypeAllocSize(CPE.getType())) {
+ case 4: Kind = SectionKind::get(SectionKind::MergeableConst4,false); break;
+ case 8: Kind = SectionKind::get(SectionKind::MergeableConst8,false); break;
+ case 16: Kind = SectionKind::get(SectionKind::MergeableConst16,false);break;
+ default: Kind = SectionKind::get(SectionKind::MergeableConst,false); break;
+ }
}
- const Section *S = TAI->getSectionForMergableConstant(Kind);
+ const MCSection *S =
+ getObjFileLowering().getSectionForMergeableConstant(Kind);
// The number of sections are small, just do a linear search from the
// last section to the first.
// the appropriate section.
TargetLowering *LoweringInfo = TM.getTargetLowering();
- const char* JumpTableDataSection = TAI->getJumpTableDataSection();
+ const char *JumpTableDataSection = TAI->getJumpTableDataSection();
const Function *F = MF.getFunction();
- const Section *FuncSection = TAI->SectionForGlobal(F);
+ const MCSection *FuncSection =
+ getObjFileLowering().SectionForGlobal(F, Mang, TM);
+
bool JTInDiffSection = false;
if ((IsPic && !(LoweringInfo && LoweringInfo->usesGlobalOffsetTable())) ||
!JumpTableDataSection ||
- FuncSection->hasFlag(SectionFlags::Linkonce)) {
+ FuncSection->getKind().isWeak()) {
// In PIC mode, we need to emit the jump table to the same section as the
// function body itself, otherwise the label differences won't make sense.
// We should also do if the section name is NULL or function is declared in
O << ':';
if (printComment && MBB->getBasicBlock())
O << '\t' << TAI->getCommentString() << ' '
- << MBB->getBasicBlock()->getNameStart();
+ << MBB->getBasicBlock()->getNameStr();
}
/// printPICJumpTableSetLabel - This method prints a set label for the