forked from OSchip/llvm-project
[X86] Avoid mangling frameescape labels
x86 Windows uses the '_' prefix for all global symbols, and this was mistakenly being applied to frameescape labels, which are not externally visible global symbols. They use the private global prefix 'L'. The *right* way to fix this is probably to stop masquerading this label as an ExternalSymbol and create a new SDNode type. These labels are not "external", and we know they will be resolved by assembly time. Having a custom SDNode type would allow us to do better X86 address mode matching, so it's probably worth doing eventually. llvm-svn: 236123
This commit is contained in:
parent
d7d088f815
commit
c695471365
|
@ -213,7 +213,11 @@ namespace X86II {
|
|||
/// the offset from beginning of section.
|
||||
///
|
||||
/// This is the TLS offset for the COFF/Windows TLS mechanism.
|
||||
MO_SECREL
|
||||
MO_SECREL,
|
||||
|
||||
/// MO_NOPREFIX - On a symbol operand this indicates that the symbol should
|
||||
/// not be mangled with a prefix.
|
||||
MO_NOPREFIX,
|
||||
};
|
||||
|
||||
enum : uint64_t {
|
||||
|
|
|
@ -1009,7 +1009,9 @@ bool X86DAGToDAGISel::MatchAddressRecursively(SDValue N, X86ISelAddressMode &AM,
|
|||
if (!AM.hasSymbolicDisplacement())
|
||||
if (const auto *ESNode = dyn_cast<ExternalSymbolSDNode>(N.getOperand(0)))
|
||||
if (ESNode->getOpcode() == ISD::TargetExternalSymbol) {
|
||||
// Use the symbol and don't prefix it.
|
||||
AM.ES = ESNode->getSymbol();
|
||||
AM.SymbolFlags = X86II::MO_NOPREFIX;
|
||||
return false;
|
||||
}
|
||||
break;
|
||||
|
|
|
@ -154,7 +154,10 @@ GetSymbolFromOperand(const MachineOperand &MO) const {
|
|||
const GlobalValue *GV = MO.getGlobal();
|
||||
AsmPrinter.getNameWithPrefix(Name, GV);
|
||||
} else if (MO.isSymbol()) {
|
||||
getMang()->getNameWithPrefix(Name, MO.getSymbolName());
|
||||
if (MO.getTargetFlags() == X86II::MO_NOPREFIX)
|
||||
Name += MO.getSymbolName();
|
||||
else
|
||||
getMang()->getNameWithPrefix(Name, MO.getSymbolName());
|
||||
} else if (MO.isMBB()) {
|
||||
Name += MO.getMBB()->getSymbol()->getName();
|
||||
}
|
||||
|
@ -231,6 +234,7 @@ MCOperand X86MCInstLower::LowerSymbolOperand(const MachineOperand &MO,
|
|||
case X86II::MO_DARWIN_NONLAZY:
|
||||
case X86II::MO_DLLIMPORT:
|
||||
case X86II::MO_DARWIN_STUB:
|
||||
case X86II::MO_NOPREFIX:
|
||||
break;
|
||||
|
||||
case X86II::MO_TLVP: RefKind = MCSymbolRefExpr::VK_TLVP; break;
|
||||
|
|
|
@ -37,15 +37,15 @@ define void @print_framealloc_from_fp(i8* %fp) {
|
|||
; X86: pushl %esi
|
||||
; X86: subl $8, %esp
|
||||
; X86: movl 16(%esp), %esi
|
||||
; X86: movl _Lalloc_func$frame_escape_0(%esi), %eax
|
||||
; X86: movl Lalloc_func$frame_escape_0(%esi), %eax
|
||||
; X86: movl %eax, 4(%esp)
|
||||
; X86: movl $_str, (%esp)
|
||||
; X86: calll _printf
|
||||
; X86: movl _Lalloc_func$frame_escape_1(%esi), %eax
|
||||
; X86: movl Lalloc_func$frame_escape_1(%esi), %eax
|
||||
; X86: movl %eax, 4(%esp)
|
||||
; X86: movl $_str, (%esp)
|
||||
; X86: calll _printf
|
||||
; X86: movl $42, _Lalloc_func$frame_escape_1(%esi)
|
||||
; X86: movl $42, Lalloc_func$frame_escape_1(%esi)
|
||||
; X86: addl $8, %esp
|
||||
; X86: popl %esi
|
||||
; X86: retl
|
||||
|
|
Loading…
Reference in New Issue