llvm-6502/include/llvm/MC
Peter Collingbourne c39f5dd0e2 MC: For variable symbols, maintain MCSymbol::Section as a cache.
Fixes PR19582.

Previously, when an asm assignment (.set or =) was created, we would look up
the section immediately in MCSymbol::setVariableValue. This caused symbols
to receive the wrong section if the RHS of the assignment had not been seen
yet. This had a knock-on effect in the object file emitters, causing them
to emit extra symbols, or to give symbols the wrong visibility or the wrong
section. For example, in the following asm:

.data
.Llocal:

.text
leaq .Llocal1(%rip), %rdi
.Llocal1 = .Llocal2
.Llocal2 = .Llocal

the first assignment would give .Llocal1 a null section, which would never get
fixed up by the second assignment. This would cause the ELF object file emitter
to consider .Llocal1 to be an undefined symbol and give it external linkage,
even though .Llocal1 should not have been emitted at all in the object file.

Or in the following asm:

alias_to_local = Ltmp0
Ltmp0:

the Mach-O object file emitter would give the alias_to_local symbol a n_type
of N_SECT and a n_sect of 0.  This is invalid under the Mach-O specification,
which requires N_SECT symbols to receive a non-zero section number if the
symbol is defined in a section in the object file.

https://developer.apple.com/library/mac/documentation/DeveloperTools/Conceptual/MachORuntime/#//apple_ref/c/tag/nlist

After this change we do not look up the section when the assignment is created,
but instead look it up on demand and store it in Section, which is treated
as a cache if the symbol is a variable symbol.

This change also fixes a bug in MCExpr::FindAssociatedSection. Previously,
if we saw a subtraction, we would return the first referenced section, even in
cases where we should have been returning the absolute pseudo-section. Now we
always return the absolute pseudo-section for expressions that subtract two
section-derived expressions. This isn't always correct (e.g. if one of the
sections ends up being laid out at an absolute address), but it's probably
the best we can do without more context.

This allows us to remove code in two places where we appear to have been
working around this bug, in MachObjectWriter::markAbsoluteVariableSymbols
and in X86AsmPrinter::EmitStartOfAsmFile.

Re-applies r233595 (aka D8586), which was reverted in r233898.

Differential Revision: http://reviews.llvm.org/D8798

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@233995 91177308-0d34-0410-b5e6-96231b3b80d8
2015-04-03 01:46:11 +00:00
..
MCParser Fix uses of reserved identifiers starting with an underscore followed by an uppercase letter 2015-03-16 18:06:57 +00:00
ConstantPools.h [Modules] Add some missing includes to make files compile stand-alone. 2014-10-12 22:49:26 +00:00
MachineLocation.h Add inequality operator for MachineLocation. 2014-04-01 21:54:52 +00:00
MCAsmBackend.h Removing LLVM_DELETED_FUNCTION, as MSVC 2012 was the last reason for requiring the macro. NFC; LLVM edition. 2015-02-15 22:54:22 +00:00
MCAsmInfo.h [NVPTXAsmPrinter] do not print .align on function headers 2015-03-12 01:50:30 +00:00
MCAsmInfoCOFF.h [C++11] Add 'override' keyword to virtual methods that override their base class. 2014-03-08 07:02:02 +00:00
MCAsmInfoDarwin.h Recommit r224935 with a fix for the ObjC++/AArch64 bug that that revision 2015-01-09 18:55:42 +00:00
MCAsmInfoELF.h Move getNonexecutableStackSection up to the base ELF class. 2014-10-15 15:44:16 +00:00
MCAsmLayout.h Fix uses of reserved identifiers starting with an underscore followed by an uppercase letter 2015-03-16 18:06:57 +00:00
MCAssembler.h Fix uses of reserved identifiers starting with an underscore followed by an uppercase letter 2015-03-16 18:06:57 +00:00
MCCodeEmitter.h Removing LLVM_DELETED_FUNCTION, as MSVC 2012 was the last reason for requiring the macro. NFC; LLVM edition. 2015-02-15 22:54:22 +00:00
MCCodeGenInfo.h Teach ISel not to optimize 'optnone' functions (revised). 2013-11-22 19:11:24 +00:00
MCContext.h [WinEH] Generate .xdata for catch handlers 2015-03-31 22:35:44 +00:00
MCDirectives.h Darwin: Add assembler directives to create version-min load commands. 2014-03-18 22:09:05 +00:00
MCDisassembler.h MCDisassembler::getInstruction():: Prune also "\param Region", since it was removed in r221751. [-Wdocumentation] 2014-11-12 07:42:26 +00:00
MCDwarf.h [cleanup] Re-sort all the #include lines in LLVM using 2015-01-14 11:23:27 +00:00
MCELF.h [MC] Constify MCELF::GetVisibility and MCELF::getOther 2014-07-11 17:34:44 +00:00
MCELFObjectWriter.h Add support for Nuxi CloudABI. 2015-03-09 18:40:45 +00:00
MCELFStreamer.h Simplify handling of --noexecstack by using getNonexecutableStackSection. 2014-10-15 16:12:52 +00:00
MCELFSymbolFlags.h ARM: take care not to set the ThumbFunc bit on TLS data symbols 2014-06-30 09:37:24 +00:00
MCExpr.h Fix PR23025. 2015-03-26 21:11:00 +00:00
MCExternalSymbolizer.h Remove redundant symbolization support from MCDisassembler interface. 2014-04-11 20:07:58 +00:00
MCFixedLenDisassembler.h
MCFixup.h Fix pr19645. 2014-05-03 19:57:04 +00:00
MCFixupKindInfo.h
MCInst.h [MC] Constifying MCInst::size() 2015-02-17 19:46:23 +00:00
MCInstBuilder.h
MCInstPrinter.h Delete MCInstPrinter::AvailableFeatures. 2015-03-28 21:07:24 +00:00
MCInstrAnalysis.h MC: Add some missing include guards 2014-01-17 22:39:45 +00:00
MCInstrDesc.h Revert "Use std::bitset for SubtargetFeatures" 2015-03-24 12:56:59 +00:00
MCInstrInfo.h
MCInstrItineraries.h don't repeat function name in comments 2014-10-07 17:28:04 +00:00
MCLabel.h Removing LLVM_DELETED_FUNCTION, as MSVC 2012 was the last reason for requiring the macro. NFC; LLVM edition. 2015-02-15 22:54:22 +00:00
MCLinkerOptimizationHint.h [cleanup] Re-sort all the #include lines in LLVM using 2015-01-14 11:23:27 +00:00
MCMachObjectWriter.h MC: For variable symbols, maintain MCSymbol::Section as a cache. 2015-04-03 01:46:11 +00:00
MCMachOSymbolFlags.h Fix ODR violation. 2013-10-25 03:29:42 +00:00
MCObjectFileInfo.h Remove useless .debug_macinfo section setup. 2015-03-02 19:52:42 +00:00
MCObjectStreamer.h Don't declare all text sections at the start of the .s 2015-03-20 20:00:01 +00:00
MCObjectWriter.h clang-format bits of code to make another patch readable. 2015-03-25 19:24:39 +00:00
MCRegisterInfo.h MCRegisterInfo: Add MCSubRegIndexIterator. 2014-12-10 01:13:06 +00:00
MCRelocationInfo.h Removing LLVM_DELETED_FUNCTION, as MSVC 2012 was the last reason for requiring the macro. NFC; LLVM edition. 2015-02-15 22:54:22 +00:00
MCSchedule.h typos 2014-10-07 17:00:16 +00:00
MCSection.h Close unique sections when switching away from them. 2015-03-27 15:01:40 +00:00
MCSectionCOFF.h Close unique sections when switching away from them. 2015-03-27 15:01:40 +00:00
MCSectionELF.h Close unique sections when switching away from them. 2015-03-27 15:01:40 +00:00
MCSectionMachO.h Create symbols marking the start of a section earlier. 2015-03-10 22:00:25 +00:00
MCStreamer.h Refactor how passes get a symbol at the end of a section. 2015-03-23 21:22:04 +00:00
MCSubtargetInfo.h Revert "Use std::bitset for SubtargetFeatures" 2015-03-24 12:56:59 +00:00
MCSymbol.h MC: For variable symbols, maintain MCSymbol::Section as a cache. 2015-04-03 01:46:11 +00:00
MCSymbolizer.h Removing LLVM_DELETED_FUNCTION, as MSVC 2012 was the last reason for requiring the macro. NFC; LLVM edition. 2015-02-15 22:54:22 +00:00
MCTargetAsmParser.h Removing LLVM_DELETED_FUNCTION, as MSVC 2012 was the last reason for requiring the macro. NFC; LLVM edition. 2015-02-15 22:54:22 +00:00
MCTargetOptions.h Migrate ABIName to MCTargetOptions so that it can be shared between 2015-01-14 00:50:31 +00:00
MCTargetOptionsCommandFlags.h [cleanup] Re-sort all the #include lines in LLVM using 2015-01-14 11:23:27 +00:00
MCValue.h [MC] Remove various unused MCAsmInfo parameters. 2015-02-05 00:58:51 +00:00
MCWin64EH.h MC: split Win64EHUnwindEmitter into a shared streamer 2014-08-07 02:59:41 +00:00
MCWinCOFFObjectWriter.h ARM: fail less catastrophically on invalid Windows input 2015-01-22 04:03:32 +00:00
MCWinCOFFStreamer.h Simplify handling of --noexecstack by using getNonexecutableStackSection. 2014-10-15 16:12:52 +00:00
MCWinEH.h MC Win64: Put unwind info for COMDAT code into the same COMDAT group 2014-09-04 17:42:03 +00:00
SectionKind.h Remove MergeableConst. 2015-01-29 14:12:41 +00:00
StringTableBuilder.h Remove StringMap::GetOrCreateValue in favor of StringMap::insert 2014-11-19 05:49:42 +00:00
SubtargetFeature.h Make llc use getHostCPUFeatures when 'native' is specified for cpu. 2015-03-31 05:52:57 +00:00
YAML.h Invert the MC -> Object dependency. 2014-07-03 02:01:39 +00:00