Skip to content

Commit 67f2bc3

Browse files
author
git apple-llvm automerger
committed
Merge commit '0548d1ca24b7' from llvm.org/master into apple/main
2 parents ff05c3b + 0548d1c commit 67f2bc3

File tree

7 files changed

+166
-17
lines changed

7 files changed

+166
-17
lines changed

llvm/include/llvm/MC/MCWinCOFFStreamer.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@ class MCWinCOFFStreamer : public MCObjectStreamer {
5858
unsigned ByteAlignment) override;
5959
void emitLocalCommonSymbol(MCSymbol *Symbol, uint64_t Size,
6060
unsigned ByteAlignment) override;
61+
void emitWeakReference(MCSymbol *Alias, const MCSymbol *Symbol) override;
6162
void emitZerofill(MCSection *Section, MCSymbol *Symbol, uint64_t Size,
6263
unsigned ByteAlignment, SMLoc Loc = SMLoc()) override;
6364
void emitTBSSSymbol(MCSection *Section, MCSymbol *Symbol, uint64_t Size,

llvm/lib/MC/MCParser/COFFMasmParser.cpp

Lines changed: 27 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
#include "llvm/MC/MCRegisterInfo.h"
2222
#include "llvm/MC/MCSectionCOFF.h"
2323
#include "llvm/MC/MCStreamer.h"
24+
#include "llvm/MC/MCSymbolCOFF.h"
2425
#include "llvm/MC/SectionKind.h"
2526
#include "llvm/Support/SMLoc.h"
2627
#include <cassert>
@@ -53,6 +54,8 @@ class COFFMasmParser : public MCAsmParserExtension {
5354
bool ParseDirectiveSegmentEnd(StringRef, SMLoc);
5455
bool ParseDirectiveIncludelib(StringRef, SMLoc);
5556

57+
bool ParseDirectiveAlias(StringRef, SMLoc);
58+
5659
bool ParseSEHDirectiveAllocStack(StringRef, SMLoc);
5760
bool ParseSEHDirectiveEndProlog(StringRef, SMLoc);
5861

@@ -124,7 +127,7 @@ class COFFMasmParser : public MCAsmParserExtension {
124127
// purge
125128

126129
// Miscellaneous directives
127-
// alias
130+
addDirectiveHandler<&COFFMasmParser::ParseDirectiveAlias>("alias");
128131
// assume
129132
// .fpo
130133
addDirectiveHandler<&COFFMasmParser::ParseDirectiveIncludelib>(
@@ -343,13 +346,11 @@ bool COFFMasmParser::ParseDirectiveProc(StringRef Directive, SMLoc Loc) {
343346
nextLoc = getTok().getLoc();
344347
}
345348
}
346-
MCSymbol *Sym = getContext().getOrCreateSymbol(Label);
349+
MCSymbolCOFF *Sym = cast<MCSymbolCOFF>(getContext().getOrCreateSymbol(Label));
347350

348-
// Define symbol as simple function
349-
getStreamer().BeginCOFFSymbolDef(Sym);
350-
getStreamer().EmitCOFFSymbolStorageClass(2);
351-
getStreamer().EmitCOFFSymbolType(0x20);
352-
getStreamer().EndCOFFSymbolDef();
351+
// Define symbol as simple external function
352+
Sym->setExternal(true);
353+
Sym->setType(COFF::IMAGE_SYM_DTYPE_FUNCTION << COFF::SCT_COMPLEX_TYPE_SHIFT);
353354

354355
bool Framed = false;
355356
if (getLexer().is(AsmToken::Identifier) &&
@@ -384,6 +385,25 @@ bool COFFMasmParser::ParseDirectiveEndProc(StringRef Directive, SMLoc Loc) {
384385
return false;
385386
}
386387

388+
bool COFFMasmParser::ParseDirectiveAlias(StringRef Directive, SMLoc Loc) {
389+
std::string AliasName, ActualName;
390+
if (getTok().isNot(AsmToken::Less) ||
391+
getParser().parseAngleBracketString(AliasName))
392+
return Error(getTok().getLoc(), "expected <aliasName>");
393+
if (getParser().parseToken(AsmToken::Equal))
394+
return addErrorSuffix(" in " + Directive + " directive");
395+
if (getTok().isNot(AsmToken::Less) ||
396+
getParser().parseAngleBracketString(ActualName))
397+
return Error(getTok().getLoc(), "expected <actualName>");
398+
399+
MCSymbol *Alias = getContext().getOrCreateSymbol(AliasName);
400+
MCSymbol *Actual = getContext().getOrCreateSymbol(ActualName);
401+
402+
getStreamer().emitWeakReference(Alias, Actual);
403+
404+
return false;
405+
}
406+
387407
bool COFFMasmParser::ParseSEHDirectiveAllocStack(StringRef Directive,
388408
SMLoc Loc) {
389409
int64_t Size;

llvm/lib/MC/MCWinCOFFStreamer.cpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -308,6 +308,16 @@ void MCWinCOFFStreamer::emitLocalCommonSymbol(MCSymbol *S, uint64_t Size,
308308
PopSection();
309309
}
310310

311+
void MCWinCOFFStreamer::emitWeakReference(MCSymbol *AliasS,
312+
const MCSymbol *Symbol) {
313+
auto *Alias = cast<MCSymbolCOFF>(AliasS);
314+
emitSymbolAttribute(Alias, MCSA_Weak);
315+
316+
getAssembler().registerSymbol(*Symbol);
317+
Alias->setVariableValue(MCSymbolRefExpr::create(
318+
Symbol, MCSymbolRefExpr::VK_WEAKREF, getContext()));
319+
}
320+
311321
void MCWinCOFFStreamer::emitZerofill(MCSection *Section, MCSymbol *Symbol,
312322
uint64_t Size, unsigned ByteAlignment,
313323
SMLoc Loc) {

llvm/test/tools/llvm-ml/alias.test

Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
1+
; RUN: llvm-ml -filetype=obj %s | llvm-readobj --syms - | FileCheck %s
2+
3+
.code
4+
5+
proc1 PROC
6+
ret
7+
proc1 ENDP
8+
9+
proc2 PROC
10+
ret
11+
proc2 ENDP
12+
13+
alias <t1> = <proc1>
14+
; CHECK: Symbol {
15+
; CHECK: Name: t1
16+
; CHECK-NEXT: Value: 0
17+
; CHECK-NEXT: Section: IMAGE_SYM_UNDEFINED (0)
18+
; CHECK-NEXT: BaseType: Null
19+
; CHECK-NEXT: ComplexType: Null
20+
; CHECK-NEXT: StorageClass: WeakExternal
21+
; CHECK-NEXT: AuxSymbolCount: 1
22+
; CHECK-NEXT: AuxWeakExternal {
23+
; CHECK-NEXT: Linked: proc1
24+
; CHECK-NEXT: Search: Alias
25+
; CHECK-NEXT: }
26+
; CHECK-NEXT: }
27+
28+
alias <t2> = <proc2>
29+
; CHECK: Symbol {
30+
; CHECK: Name: t2
31+
; CHECK-NEXT: Value: 0
32+
; CHECK-NEXT: Section: IMAGE_SYM_UNDEFINED (0)
33+
; CHECK-NEXT: BaseType: Null
34+
; CHECK-NEXT: ComplexType: Null
35+
; CHECK-NEXT: StorageClass: WeakExternal
36+
; CHECK-NEXT: AuxSymbolCount: 1
37+
; CHECK-NEXT: AuxWeakExternal {
38+
; CHECK-NEXT: Linked: proc2
39+
; CHECK-NEXT: Search: Alias
40+
; CHECK-NEXT: }
41+
; CHECK-NEXT: }
42+
43+
alias <t3> = <foo>
44+
; CHECK: Symbol {
45+
; CHECK: Name: t3
46+
; CHECK-NEXT: Value: 0
47+
; CHECK-NEXT: Section: IMAGE_SYM_UNDEFINED (0)
48+
; CHECK-NEXT: BaseType: Null
49+
; CHECK-NEXT: ComplexType: Null
50+
; CHECK-NEXT: StorageClass: WeakExternal
51+
; CHECK-NEXT: AuxSymbolCount: 1
52+
; CHECK-NEXT: AuxWeakExternal {
53+
; CHECK-NEXT: Linked: foo
54+
; CHECK-NEXT: Search: Alias
55+
; CHECK-NEXT: }
56+
; CHECK-NEXT: }
57+
58+
alias <t4> = <bar>
59+
bar PROC
60+
ret
61+
bar ENDP
62+
63+
; CHECK: Symbol {
64+
; CHECK: Name: t4
65+
; CHECK-NEXT: Value: 0
66+
; CHECK-NEXT: Section: IMAGE_SYM_UNDEFINED (0)
67+
; CHECK-NEXT: BaseType: Null
68+
; CHECK-NEXT: ComplexType: Null
69+
; CHECK-NEXT: StorageClass: WeakExternal
70+
; CHECK-NEXT: AuxSymbolCount: 1
71+
; CHECK-NEXT: AuxWeakExternal {
72+
; CHECK-NEXT: Linked: bar
73+
; CHECK-NEXT: Search: Alias
74+
; CHECK-NEXT: }
75+
; CHECK-NEXT: }
76+
77+
alias <t5> = <t2>
78+
; CHECK: Symbol {
79+
; CHECK: Name: t5
80+
; CHECK-NEXT: Value: 0
81+
; CHECK-NEXT: Section: IMAGE_SYM_UNDEFINED (0)
82+
; CHECK-NEXT: BaseType: Null
83+
; CHECK-NEXT: ComplexType: Null
84+
; CHECK-NEXT: StorageClass: WeakExternal
85+
; CHECK-NEXT: AuxSymbolCount: 1
86+
; CHECK-NEXT: AuxWeakExternal {
87+
; CHECK-NEXT: Linked: t2
88+
; CHECK-NEXT: Search: Alias
89+
; CHECK-NEXT: }
90+
; CHECK-NEXT: }
91+
92+
END
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
; RUN: not llvm-ml -filetype=asm %s 2>&1 | FileCheck %s
2+
3+
.code
4+
5+
foo PROC
6+
ret
7+
foo ENDP
8+
9+
bar PROC
10+
ret
11+
bar ENDP
12+
13+
t1:
14+
alias foo = bar
15+
alias foo = <bar>
16+
alias <foo> = bar
17+
18+
; CHECK: error: expected <aliasName>
19+
; CHECK: error: expected <aliasName>
20+
; CHECK: error: expected <actualName>
21+
22+
t2:
23+
alias <foo> <bar>
24+
alias <foo>, <bar>
25+
26+
; CHECK: error: unexpected token in alias directive
27+
; CHECK: error: unexpected token in alias directive
28+
29+
t3:
30+
alias <foo = bar>
31+
alias <foo = bar
32+
33+
; CHECK: error: unexpected token in alias directive
34+
; CHECK: error: expected <aliasName>
35+
36+
END

llvm/test/tools/llvm-ml/proc.test

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,6 @@ t1 PROC
77
ret
88
t1 ENDP
99

10-
; CHECK: .def t1
11-
; CHECK-NEXT: .scl 2
12-
; CHECK-NEXT: .type 32
13-
; CHECK-NEXT: .endef
14-
1510
; CHECK: t1:
1611
; CHECK: ret
1712

llvm/test/tools/llvm-ml/proc_frame.test

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,6 @@ t1 PROC FRAME
1313
ret
1414
t1 ENDP
1515

16-
; CHECK: .def t1
17-
; CHECK-NEXT: .scl 2
18-
; CHECK-NEXT: .type 32
19-
; CHECK-NEXT: .endef
20-
2116
; CHECK: .seh_proc t1
2217

2318
; CHECK: t1:

0 commit comments

Comments
 (0)