mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-11-01 15:11:24 +00:00
Add AsmParser support for the ELF .previous directive. Patch by Roman Divacky.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@112849 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
3e234e7579
commit
1674b0b0e4
@ -54,6 +54,10 @@ namespace llvm {
|
||||
/// kept up to date by SwitchSection.
|
||||
const MCSection *CurSection;
|
||||
|
||||
/// PrevSection - This is the previous section code is being emitted to, it is
|
||||
/// kept up to date by SwitchSection.
|
||||
const MCSection *PrevSection;
|
||||
|
||||
public:
|
||||
virtual ~MCStreamer();
|
||||
|
||||
@ -96,6 +100,10 @@ namespace llvm {
|
||||
/// emitting code to.
|
||||
const MCSection *getCurrentSection() const { return CurSection; }
|
||||
|
||||
/// getPreviousSection - Return the previous section that the streamer is
|
||||
/// emitting code to.
|
||||
const MCSection *getPreviousSection() const { return PrevSection; }
|
||||
|
||||
/// SwitchSection - Set the current section where code is being emitted to
|
||||
/// @p Section. This is required to update CurSection.
|
||||
///
|
||||
|
@ -217,6 +217,7 @@ static inline int64_t truncateToSize(int64_t Value, unsigned Bytes) {
|
||||
void MCAsmStreamer::SwitchSection(const MCSection *Section) {
|
||||
assert(Section && "Cannot switch to a null section!");
|
||||
if (Section != CurSection) {
|
||||
PrevSection = CurSection;
|
||||
CurSection = Section;
|
||||
Section->PrintSwitchToSection(MAI, OS);
|
||||
}
|
||||
|
@ -26,6 +26,7 @@ namespace {
|
||||
/// @{
|
||||
|
||||
virtual void SwitchSection(const MCSection *Section) {
|
||||
PrevSection = CurSection;
|
||||
CurSection = Section;
|
||||
}
|
||||
|
||||
|
@ -77,6 +77,7 @@ void MCObjectStreamer::SwitchSection(const MCSection *Section) {
|
||||
// If already in this section, then this is a noop.
|
||||
if (Section == CurSection) return;
|
||||
|
||||
PrevSection = CurSection;
|
||||
CurSection = Section;
|
||||
CurSectionData = &getAssembler().getOrCreateSectionData(*Section);
|
||||
}
|
||||
|
@ -50,6 +50,7 @@ public:
|
||||
AddDirectiveHandler<&ELFAsmParser::ParseDirectiveSize>(".size");
|
||||
AddDirectiveHandler<&ELFAsmParser::ParseDirectiveLEB128>(".sleb128");
|
||||
AddDirectiveHandler<&ELFAsmParser::ParseDirectiveLEB128>(".uleb128");
|
||||
AddDirectiveHandler<&ELFAsmParser::ParseDirectivePrevious>(".previous");
|
||||
}
|
||||
|
||||
bool ParseSectionDirectiveData(StringRef, SMLoc) {
|
||||
@ -111,6 +112,7 @@ public:
|
||||
bool ParseDirectiveLEB128(StringRef, SMLoc);
|
||||
bool ParseDirectiveSection(StringRef, SMLoc);
|
||||
bool ParseDirectiveSize(StringRef, SMLoc);
|
||||
bool ParseDirectivePrevious(StringRef, SMLoc);
|
||||
};
|
||||
|
||||
}
|
||||
@ -272,6 +274,14 @@ bool ELFAsmParser::ParseDirectiveLEB128(StringRef DirName, SMLoc) {
|
||||
return TokError("LEB128 not supported yet");
|
||||
}
|
||||
|
||||
bool ELFAsmParser::ParseDirectivePrevious(StringRef DirName, SMLoc) {
|
||||
const MCSection *PreviousSection = getStreamer().getPreviousSection();
|
||||
if (PreviousSection != NULL)
|
||||
getStreamer().SwitchSection(PreviousSection);
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
namespace llvm {
|
||||
|
||||
MCAsmParserExtension *createELFAsmParser() {
|
||||
|
@ -15,7 +15,8 @@
|
||||
#include <cstdlib>
|
||||
using namespace llvm;
|
||||
|
||||
MCStreamer::MCStreamer(MCContext &Ctx) : Context(Ctx), CurSection(0) {
|
||||
MCStreamer::MCStreamer(MCContext &Ctx) : Context(Ctx), CurSection(0),
|
||||
PrevSection(0) {
|
||||
}
|
||||
|
||||
MCStreamer::~MCStreamer() {
|
||||
|
13
test/MC/AsmParser/ELF/directive_previous.s
Normal file
13
test/MC/AsmParser/ELF/directive_previous.s
Normal file
@ -0,0 +1,13 @@
|
||||
# RUN: llvm-mc -triple i386-pc-linux-gnu %s | FileCheck %s
|
||||
|
||||
.bss
|
||||
# CHECK: .bss
|
||||
|
||||
.text
|
||||
# CHECK: .text
|
||||
|
||||
.previous
|
||||
# CHECK: .bss
|
||||
|
||||
.previous
|
||||
# CHECK: .text
|
Loading…
Reference in New Issue
Block a user