// sections and expected to be contiguous (e.g. ObjC metadata).
unsigned AlignLog = getGVAlignmentLog2(GV, *TD);
+ if (DD)
+ DD->setSymbolSize(GVSym, Size);
+
// Handle common and BSS local symbols (.lcomm).
if (GVKind.isCommon() || GVKind.isBSSLocal()) {
if (Size == 0) Size = 1; // .comm Foo, 0 is undefined, avoid it.
Asm->EmitLabelReference(Span.Start, PtrSize);
// Calculate the size as being from the span start to it's end.
- // If we have no valid end symbol, then we just cover the first byte.
- // (this sucks, but I can't seem to figure out how to get the size)
- if (Span.End)
+ if (Span.End) {
Asm->EmitLabelDifference(Span.End, Span.Start, PtrSize);
- else
- Asm->OutStreamer.EmitIntValue(1, PtrSize);
+ } else {
+ // For symbols without an end marker (e.g. common), we
+ // write a single arange entry containing just that one symbol.
+ uint64_t Size = SymSize[Span.Start];
+ if (Size == 0)
+ Size = 1;
+
+ Asm->OutStreamer.EmitIntValue(Size, PtrSize);
+ }
}
Asm->OutStreamer.AddComment("ARange terminator");
// List of all labels used in the output.
std::vector<SymbolCU> Labels;
+ // Size of each symbol emitted (for those symbols that have a specific size).
+ DenseMap <const MCSymbol *, uint64_t> SymSize;
+
// Provides a unique id per text section.
typedef DenseMap<const MCSection *, SmallVector<SymbolCU, 8> > SectionMapType;
SectionMapType SectionMap;
/// \brief Add a label so that arange data can be generated for it.
void addLabel(SymbolCU SCU) { Labels.push_back(SCU); }
+ /// \brief For symbols that have a size designated (e.g. common symbols),
+ /// this tracks that size.
+ void setSymbolSize(const MCSymbol *Sym, uint64_t Size) { SymSize[Sym] = Size;}
+
/// \brief Look up the source id with the given directory and source file
/// names. If none currently exists, create a new id and insert it in the
/// SourceIds map.
void MCAsmStreamer::EmitCommonSymbol(MCSymbol *Symbol, uint64_t Size,
unsigned ByteAlignment) {
- const MCSection *Section = getContext().getObjectFileInfo()->getBSSSection();
- AssignSection(Symbol, Section);
+ // Common symbols do not belong to any actual section.
+ AssignSection(Symbol, NULL);
OS << "\t.comm\t" << *Symbol << ',' << Size;
if (ByteAlignment != 0) {
/// @param Size - The size of the common symbol.
void MCAsmStreamer::EmitLocalCommonSymbol(MCSymbol *Symbol, uint64_t Size,
unsigned ByteAlign) {
- const MCSection *Section = getContext().getObjectFileInfo()->getBSSSection();
- AssignSection(Symbol, Section);
+ // Common symbols do not belong to any actual section.
+ AssignSection(Symbol, NULL);
OS << "\t.lcomm\t" << *Symbol << ',' << Size;
if (ByteAlign > 1) {
; -- finish --
; CHECK-HEADER: # ARange terminator
-
+; <text section> - it should have made one span covering all functions in this CU.
; CHECK-CODE: .short 2 # DWARF Arange version number
; CHECK-CODE: .quad .Lfunc_begin0
+; CHECK-CODE-NEXT: .Lset1 = .L.text_end-.Lfunc_begin0
; CHECK-CODE: # ARange terminator
+; <data section> - it should have made one span covering all vars in this CU.
; CHECK-DATA: .short 2 # DWARF Arange version number
; CHECK-DATA: .quad some_data
; CHECK-DATA-NEXT: -some_data
-; CHECK-DATA-NEXT: .quad
; CHECK-DATA: # ARange terminator
+; <common symbols> - it should have made one span for each symbol.
; CHECK-BSS: .short 2 # DWARF Arange version number
; CHECK-BSS: .quad some_bss
-; CHECK-BSS-NEXT: -some_bss
-; CHECK-BSS-NEXT: .quad
+; CHECK-BSS-NEXT: .quad 4
; CHECK-BSS: # ARange terminator
+; <other sections> - it should have made one span covering all vars in this CU.
; CHECK-CUSTOM: .short 2 # DWARF Arange version number
; CHECK-CUSTOM: .quad some_other
; CHECK-CUSTOM-NEXT: -some_other
-; CHECK-CUSTOM-NEXT: .quad
; CHECK-CUSTOM: # ARange terminator