diff options
author | Chris Lattner <sabre@nondot.org> | 2010-01-23 07:47:02 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2010-01-23 07:47:02 +0000 |
commit | b1301f7bceecfd74fd2d60f106288afc1e5c0f80 (patch) | |
tree | 2927d1c3c704c4b8c165483bec21a33e77ecb569 /llvm/lib/MC | |
parent | 76bdea32900ab533b0c059ec8b71fff59c919632 (diff) | |
download | bcm5719-llvm-b1301f7bceecfd74fd2d60f106288afc1e5c0f80.tar.gz bcm5719-llvm-b1301f7bceecfd74fd2d60f106288afc1e5c0f80.zip |
mcize lcomm, simplify .comm, extend both to support 64-bit sizes.
llvm-svn: 94299
Diffstat (limited to 'llvm/lib/MC')
-rw-r--r-- | llvm/lib/MC/MCAsmInfo.cpp | 3 | ||||
-rw-r--r-- | llvm/lib/MC/MCAsmInfoCOFF.cpp | 2 | ||||
-rw-r--r-- | llvm/lib/MC/MCAsmStreamer.cpp | 22 | ||||
-rw-r--r-- | llvm/lib/MC/MCMachOStreamer.cpp | 7 | ||||
-rw-r--r-- | llvm/lib/MC/MCNullStreamer.cpp | 3 |
5 files changed, 28 insertions, 9 deletions
diff --git a/llvm/lib/MC/MCAsmInfo.cpp b/llvm/lib/MC/MCAsmInfo.cpp index b96b4e9156f..547f904d70f 100644 --- a/llvm/lib/MC/MCAsmInfo.cpp +++ b/llvm/lib/MC/MCAsmInfo.cpp @@ -52,8 +52,7 @@ MCAsmInfo::MCAsmInfo() { PICJumpTableDirective = 0; GlobalDirective = "\t.globl\t"; SetDirective = 0; - LCOMMDirective = 0; - COMMDirective = "\t.comm\t"; + HasLCOMMDirective = false; COMMDirectiveTakesAlignment = true; HasDotTypeDotSizeDirective = true; HasSingleParameterDotFile = true; diff --git a/llvm/lib/MC/MCAsmInfoCOFF.cpp b/llvm/lib/MC/MCAsmInfoCOFF.cpp index 5ca66b56d57..e395acdd313 100644 --- a/llvm/lib/MC/MCAsmInfoCOFF.cpp +++ b/llvm/lib/MC/MCAsmInfoCOFF.cpp @@ -18,7 +18,7 @@ using namespace llvm; MCAsmInfoCOFF::MCAsmInfoCOFF() { GlobalPrefix = "_"; - LCOMMDirective = "\t.lcomm\t"; + HasLCOMMDirective = true; COMMDirectiveTakesAlignment = false; HasDotTypeDotSizeDirective = false; HasSingleParameterDotFile = false; diff --git a/llvm/lib/MC/MCAsmStreamer.cpp b/llvm/lib/MC/MCAsmStreamer.cpp index ded2b42bd8c..bf39239e7a7 100644 --- a/llvm/lib/MC/MCAsmStreamer.cpp +++ b/llvm/lib/MC/MCAsmStreamer.cpp @@ -93,9 +93,15 @@ public: virtual void EmitSymbolDesc(MCSymbol *Symbol, unsigned DescValue); - virtual void EmitCommonSymbol(MCSymbol *Symbol, unsigned Size, + virtual void EmitCommonSymbol(MCSymbol *Symbol, uint64_t Size, unsigned ByteAlignment); + /// EmitLocalCommonSymbol - Emit a local common (.lcomm) symbol. + /// + /// @param Symbol - The common symbol to emit. + /// @param Size - The size of the common symbol. + virtual void EmitLocalCommonSymbol(MCSymbol *Symbol, uint64_t Size); + virtual void EmitZerofill(const MCSection *Section, MCSymbol *Symbol = 0, unsigned Size = 0, unsigned ByteAlignment = 0); @@ -245,9 +251,9 @@ void MCAsmStreamer::EmitSymbolDesc(MCSymbol *Symbol, unsigned DescValue) { EmitEOL(); } -void MCAsmStreamer::EmitCommonSymbol(MCSymbol *Symbol, unsigned Size, +void MCAsmStreamer::EmitCommonSymbol(MCSymbol *Symbol, uint64_t Size, unsigned ByteAlignment) { - OS << MAI.getCOMMDirective() << *Symbol << ',' << Size; + OS << "\t.comm\t" << *Symbol << ',' << Size; if (ByteAlignment != 0 && MAI.getCOMMDirectiveTakesAlignment()) { if (MAI.getAlignmentIsInBytes()) OS << ',' << ByteAlignment; @@ -257,6 +263,16 @@ void MCAsmStreamer::EmitCommonSymbol(MCSymbol *Symbol, unsigned Size, EmitEOL(); } +/// EmitLocalCommonSymbol - Emit a local common (.lcomm) symbol. +/// +/// @param Symbol - The common symbol to emit. +/// @param Size - The size of the common symbol. +void MCAsmStreamer::EmitLocalCommonSymbol(MCSymbol *Symbol, uint64_t Size) { + assert(MAI.hasLCOMMDirective() && "Doesn't have .lcomm, can't emit it!"); + OS << "\t.lcomm\t" << *Symbol << ',' << Size; + EmitEOL(); +} + void MCAsmStreamer::EmitZerofill(const MCSection *Section, MCSymbol *Symbol, unsigned Size, unsigned ByteAlignment) { // Note: a .zerofill directive does not switch sections. diff --git a/llvm/lib/MC/MCMachOStreamer.cpp b/llvm/lib/MC/MCMachOStreamer.cpp index 14301824ba8..e559c65f2c1 100644 --- a/llvm/lib/MC/MCMachOStreamer.cpp +++ b/llvm/lib/MC/MCMachOStreamer.cpp @@ -122,8 +122,11 @@ public: virtual void EmitAssignment(MCSymbol *Symbol, const MCExpr *Value); virtual void EmitSymbolAttribute(MCSymbol *Symbol, MCSymbolAttr Attribute); virtual void EmitSymbolDesc(MCSymbol *Symbol, unsigned DescValue); - virtual void EmitCommonSymbol(MCSymbol *Symbol, unsigned Size, + virtual void EmitCommonSymbol(MCSymbol *Symbol, uint64_t Size, unsigned ByteAlignment); + virtual void EmitLocalCommonSymbol(MCSymbol *Symbol, uint64_t Size) { + assert(0 && "macho doesn't support this directive"); + } virtual void EmitZerofill(const MCSection *Section, MCSymbol *Symbol = 0, unsigned Size = 0, unsigned ByteAlignment = 0); virtual void EmitBytes(StringRef Data, unsigned AddrSpace); @@ -270,7 +273,7 @@ void MCMachOStreamer::EmitSymbolDesc(MCSymbol *Symbol, unsigned DescValue) { getSymbolData(*Symbol).setFlags(DescValue & SF_DescFlagsMask); } -void MCMachOStreamer::EmitCommonSymbol(MCSymbol *Symbol, unsigned Size, +void MCMachOStreamer::EmitCommonSymbol(MCSymbol *Symbol, uint64_t Size, unsigned ByteAlignment) { // FIXME: Darwin 'as' does appear to allow redef of a .comm by itself. assert(Symbol->isUndefined() && "Cannot define a symbol twice!"); diff --git a/llvm/lib/MC/MCNullStreamer.cpp b/llvm/lib/MC/MCNullStreamer.cpp index 46da4c4f9ce..7c219b324a9 100644 --- a/llvm/lib/MC/MCNullStreamer.cpp +++ b/llvm/lib/MC/MCNullStreamer.cpp @@ -39,8 +39,9 @@ namespace { virtual void EmitSymbolDesc(MCSymbol *Symbol, unsigned DescValue) {} - virtual void EmitCommonSymbol(MCSymbol *Symbol, unsigned Size, + virtual void EmitCommonSymbol(MCSymbol *Symbol, uint64_t Size, unsigned ByteAlignment) {} + virtual void EmitLocalCommonSymbol(MCSymbol *Symbol, uint64_t Size) {} virtual void EmitZerofill(const MCSection *Section, MCSymbol *Symbol = 0, unsigned Size = 0, unsigned ByteAlignment = 0) {} |