Add emitThumbSet to the arm target streamer.

This fixes the asm printer implementation and lets the parser be unaware of
what .thumb_set is.

llvm-svn: 207381
This commit is contained in:
Rafael Espindola 2014-04-27 20:23:58 +00:00
parent 2893b2e1da
commit 466d66358d
5 changed files with 35 additions and 30 deletions

View File

@ -121,6 +121,8 @@ public:
virtual void AnnotateTLSDescriptorSequence(const MCSymbolRefExpr *SRE); virtual void AnnotateTLSDescriptorSequence(const MCSymbolRefExpr *SRE);
virtual void emitThumbSet(MCSymbol *Symbol, const MCExpr *Value);
void finish() override; void finish() override;
/// Callback used to implement the ldr= pseudo. /// Callback used to implement the ldr= pseudo.

View File

@ -9372,36 +9372,7 @@ bool ARMAsmParser::parseDirectiveThumbSet(SMLoc L) {
Lex(); Lex();
MCSymbol *Alias = getContext().GetOrCreateSymbol(Name); MCSymbol *Alias = getContext().GetOrCreateSymbol(Name);
if (const MCSymbolRefExpr *SRE = dyn_cast<MCSymbolRefExpr>(Value)) { getTargetStreamer().emitThumbSet(Alias, Value);
MCSymbol *Sym = getContext().LookupSymbol(SRE->getSymbol().getName());
if (!Sym->isDefined()) {
getStreamer().EmitSymbolAttribute(Sym, MCSA_Global);
getStreamer().EmitAssignment(Alias, Value);
return false;
}
const MCObjectFileInfo::Environment Format =
getContext().getObjectFileInfo()->getObjectFileType();
switch (Format) {
case MCObjectFileInfo::IsCOFF: {
char Type = COFF::IMAGE_SYM_DTYPE_FUNCTION << COFF::SCT_COMPLEX_TYPE_SHIFT;
getStreamer().EmitCOFFSymbolType(Type);
// .set values are always local in COFF
getStreamer().EmitSymbolAttribute(Alias, MCSA_Local);
break;
}
case MCObjectFileInfo::IsELF:
getStreamer().EmitSymbolAttribute(Alias, MCSA_ELF_TypeFunction);
break;
case MCObjectFileInfo::IsMachO:
break;
}
}
// FIXME: set the function as being a thumb function via the assembler
getStreamer().EmitThumbFunc(Alias);
getStreamer().EmitAssignment(Alias, Value);
return false; return false;
} }

View File

@ -140,6 +140,7 @@ class ARMTargetAsmStreamer : public ARMTargetStreamer {
void finishAttributeSection() override; void finishAttributeSection() override;
void AnnotateTLSDescriptorSequence(const MCSymbolRefExpr *SRE) override; void AnnotateTLSDescriptorSequence(const MCSymbolRefExpr *SRE) override;
void emitThumbSet(MCSymbol *Symbol, const MCExpr *Value) override;
public: public:
ARMTargetAsmStreamer(MCStreamer &S, formatted_raw_ostream &OS, ARMTargetAsmStreamer(MCStreamer &S, formatted_raw_ostream &OS,
@ -261,6 +262,10 @@ ARMTargetAsmStreamer::AnnotateTLSDescriptorSequence(const MCSymbolRefExpr *S) {
OS << "\t.tlsdescseq\t" << S->getSymbol().getName(); OS << "\t.tlsdescseq\t" << S->getSymbol().getName();
} }
void ARMTargetAsmStreamer::emitThumbSet(MCSymbol *Symbol, const MCExpr *Value) {
OS << "\t.thumb_set\t" << *Symbol << ", " << *Value << '\n';
}
void ARMTargetAsmStreamer::emitInst(uint32_t Inst, char Suffix) { void ARMTargetAsmStreamer::emitInst(uint32_t Inst, char Suffix) {
OS << "\t.inst"; OS << "\t.inst";
if (Suffix) if (Suffix)
@ -410,6 +415,7 @@ private:
void emitLabel(MCSymbol *Symbol) override; void emitLabel(MCSymbol *Symbol) override;
void AnnotateTLSDescriptorSequence(const MCSymbolRefExpr *SRE) override; void AnnotateTLSDescriptorSequence(const MCSymbolRefExpr *SRE) override;
void emitThumbSet(MCSymbol *Symbol, const MCExpr *Value) override;
size_t calculateContentSize() const; size_t calculateContentSize() const;
@ -998,6 +1004,23 @@ void
ARMTargetELFStreamer::AnnotateTLSDescriptorSequence(const MCSymbolRefExpr *S) { ARMTargetELFStreamer::AnnotateTLSDescriptorSequence(const MCSymbolRefExpr *S) {
getStreamer().EmitFixup(S, FK_Data_4); getStreamer().EmitFixup(S, FK_Data_4);
} }
void ARMTargetELFStreamer::emitThumbSet(MCSymbol *Symbol, const MCExpr *Value) {
if (const MCSymbolRefExpr *SRE = dyn_cast<MCSymbolRefExpr>(Value)) {
// FIXME: Doing a lookup in here is a hack.
MCSymbol *Sym =
getStreamer().getContext().LookupSymbol(SRE->getSymbol().getName());
if (!Sym->isDefined()) {
getStreamer().EmitSymbolAttribute(Sym, MCSA_Global);
getStreamer().EmitAssignment(Symbol, Value);
return;
}
}
getStreamer().EmitThumbFunc(Symbol);
getStreamer().EmitAssignment(Symbol, Value);
}
void ARMTargetELFStreamer::emitInst(uint32_t Inst, char Suffix) { void ARMTargetELFStreamer::emitInst(uint32_t Inst, char Suffix) {
getStreamer().emitInst(Inst, Suffix); getStreamer().emitInst(Inst, Suffix);
} }

View File

@ -246,3 +246,7 @@ void ARMTargetStreamer::AnnotateTLSDescriptorSequence(
const MCSymbolRefExpr *SRE) { const MCSymbolRefExpr *SRE) {
llvm_unreachable("unimplemented"); llvm_unreachable("unimplemented");
} }
void ARMTargetStreamer::emitThumbSet(MCSymbol *Symbol, const MCExpr *Value) {
llvm_unreachable("unimplemented");
}

View File

@ -1,6 +1,9 @@
@ RUN: llvm-mc -triple armv7-eabi -filetype obj -o - %s | llvm-readobj -t \ @ RUN: llvm-mc -triple armv7-eabi -filetype obj -o - %s | llvm-readobj -t \
@ RUN: | FileCheck %s @ RUN: | FileCheck %s
@ RUN: llvm-mc -triple armv7-eabi -filetype asm -o - %s \
@ RUN: | FileCheck --check-prefix=ASM %s
.syntax unified .syntax unified
.arm .arm
@ -11,6 +14,8 @@ arm_func:
.thumb_set alias_arm_func, arm_func .thumb_set alias_arm_func, arm_func
@ ASM: .thumb_set alias_arm_func, arm_func
.thumb .thumb
.type thumb_func,%function .type thumb_func,%function