Skip to content

Commit 633d222

Browse files
committedJun 28, 2019
[WebAssembly] Added visibility and ident directives to WasmAsmParser.
Summary: These are output by clang -S, so can now be roundtripped thru clang. (partially) fixes: https://bugs.llvm.org/show_bug.cgi?id=34544 Reviewers: dschuff Subscribers: sbc100, jgravelle-google, aheejin, sunfish, llvm-commits Tags: #llvm Differential Revision: https://reviews.llvm.org/D63901 llvm-svn: 364658
1 parent 3b4f086 commit 633d222

File tree

2 files changed

+89
-32
lines changed

2 files changed

+89
-32
lines changed
 

‎llvm/lib/MC/MCParser/WasmAsmParser.cpp

+54
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,15 @@ class WasmAsmParser : public MCAsmParserExtension {
5656
addDirectiveHandler<&WasmAsmParser::parseSectionDirective>(".section");
5757
addDirectiveHandler<&WasmAsmParser::parseDirectiveSize>(".size");
5858
addDirectiveHandler<&WasmAsmParser::parseDirectiveType>(".type");
59+
addDirectiveHandler<&WasmAsmParser::ParseDirectiveIdent>(".ident");
60+
addDirectiveHandler<
61+
&WasmAsmParser::ParseDirectiveSymbolAttribute>(".weak");
62+
addDirectiveHandler<
63+
&WasmAsmParser::ParseDirectiveSymbolAttribute>(".local");
64+
addDirectiveHandler<
65+
&WasmAsmParser::ParseDirectiveSymbolAttribute>(".internal");
66+
addDirectiveHandler<
67+
&WasmAsmParser::ParseDirectiveSymbolAttribute>(".hidden");
5968
}
6069

6170
bool error(const StringRef &Msg, const AsmToken &Tok) {
@@ -198,6 +207,51 @@ class WasmAsmParser : public MCAsmParserExtension {
198207
Lex();
199208
return expect(AsmToken::EndOfStatement, "EOL");
200209
}
210+
211+
// FIXME: Shared with ELF.
212+
/// ParseDirectiveIdent
213+
/// ::= .ident string
214+
bool ParseDirectiveIdent(StringRef, SMLoc) {
215+
if (getLexer().isNot(AsmToken::String))
216+
return TokError("unexpected token in '.ident' directive");
217+
StringRef Data = getTok().getIdentifier();
218+
Lex();
219+
if (getLexer().isNot(AsmToken::EndOfStatement))
220+
return TokError("unexpected token in '.ident' directive");
221+
Lex();
222+
getStreamer().EmitIdent(Data);
223+
return false;
224+
}
225+
226+
// FIXME: Shared with ELF.
227+
/// ParseDirectiveSymbolAttribute
228+
/// ::= { ".local", ".weak", ... } [ identifier ( , identifier )* ]
229+
bool ParseDirectiveSymbolAttribute(StringRef Directive, SMLoc) {
230+
MCSymbolAttr Attr = StringSwitch<MCSymbolAttr>(Directive)
231+
.Case(".weak", MCSA_Weak)
232+
.Case(".local", MCSA_Local)
233+
.Case(".hidden", MCSA_Hidden)
234+
.Case(".internal", MCSA_Internal)
235+
.Case(".protected", MCSA_Protected)
236+
.Default(MCSA_Invalid);
237+
assert(Attr != MCSA_Invalid && "unexpected symbol attribute directive!");
238+
if (getLexer().isNot(AsmToken::EndOfStatement)) {
239+
while (true) {
240+
StringRef Name;
241+
if (getParser().parseIdentifier(Name))
242+
return TokError("expected identifier in directive");
243+
MCSymbol *Sym = getContext().getOrCreateSymbol(Name);
244+
getStreamer().EmitSymbolAttribute(Sym, Attr);
245+
if (getLexer().is(AsmToken::EndOfStatement))
246+
break;
247+
if (getLexer().isNot(AsmToken::Comma))
248+
return TokError("unexpected token in directive");
249+
Lex();
250+
}
251+
}
252+
Lex();
253+
return false;
254+
}
201255
};
202256

203257
} // end anonymous namespace

‎llvm/test/MC/WebAssembly/basic-assembly.s

+35-32
Original file line numberDiff line numberDiff line change
@@ -50,14 +50,14 @@ test0:
5050
br_table {0, 1, 2} # 2 entries, default
5151
end_block # first entry jumps here.
5252
i32.const 1
53-
br 2
53+
br 2
5454
end_block # second entry jumps here.
5555
i32.const 2
56-
br 1
56+
br 1
5757
end_block # default jumps here.
5858
i32.const 3
5959
end_block # "switch" exit.
60-
if # void
60+
if # void
6161
if i32
6262
end_if
6363
else
@@ -72,32 +72,34 @@ test0:
7272
atomic.notify 0
7373
.LBB0_3:
7474
catch
75-
local.set 0
75+
local.set 0
7676
block i32
77-
local.get 0
78-
br_on_exn 0, __cpp_exception
77+
local.get 0
78+
br_on_exn 0, __cpp_exception
7979
rethrow
8080
.LBB0_4:
8181
end_block
8282
end_try
83-
i32.const .L.str
83+
i32.const .L.str
8484
throw 0
8585
.LBB0_5:
8686
#i32.trunc_sat_f32_s
8787
global.get __stack_pointer
8888
end_function
8989

90-
.section .rodata..L.str,"",@
90+
.section .rodata..L.str,"",@
91+
.hidden .L.str
9192
.L.str:
92-
.int8 'H'
93-
.asciz "ello, World!"
94-
.size .L.str, 14
93+
.int8 'H'
94+
.asciz "ello, World!"
95+
.size .L.str, 14
9596

96-
.globaltype __stack_pointer, i32
97+
.ident "clang version 9.0.0 (trunk 364502) (llvm/trunk 364571)"
98+
.globaltype __stack_pointer, i32
9799

98100
# CHECK: .text
99101
# CHECK-LABEL: test0:
100-
# CHECK-NEXT: .functype test0 (i32, i64) -> (i32)
102+
# CHECK-NEXT: .functype test0 (i32, i64) -> (i32)
101103
# CHECK-NEXT: .eventtype __cpp_exception i32
102104
# CHECK-NEXT: .local f32, f64
103105
# CHECK-NEXT: local.get 2
@@ -113,9 +115,9 @@ test0:
113115
# CHECK-NEXT: i32.const 1
114116
# CHECK-NEXT: local.get 0
115117
# CHECK-NEXT: i32.ge_s
116-
# CHECK-NEXT: br_if 0 # 0: down to label0
118+
# CHECK-NEXT: br_if 0 # 0: down to label0
117119
# CHECK-NEXT: .LBB0_1:
118-
# CHECK-NEXT: loop i32 # label1:
120+
# CHECK-NEXT: loop i32 # label1:
119121
# CHECK-NEXT: call something1
120122
# CHECK-NEXT: i64.const 1234
121123
# CHECK-NEXT: i32.call something2
@@ -126,10 +128,10 @@ test0:
126128
# CHECK-NEXT: local.tee 0
127129
# CHECK-NEXT: local.get 0
128130
# CHECK-NEXT: i32.lt_s
129-
# CHECK-NEXT: br_if 0 # 0: up to label1
131+
# CHECK-NEXT: br_if 0 # 0: up to label1
130132
# CHECK-NEXT: .LBB0_2:
131133
# CHECK-NEXT: end_loop
132-
# CHECK-NEXT: end_block # label0:
134+
# CHECK-NEXT: end_block # label0:
133135
# CHECK-NEXT: local.get 4
134136
# CHECK-NEXT: local.get 5
135137
# CHECK-NEXT: block
@@ -139,13 +141,13 @@ test0:
139141
# CHECK-NEXT: br_table {0, 1, 2} # 1: down to label4
140142
# CHECK-NEXT: # 2: down to label3
141143
# CHECK-NEXT: end_block # label5:
142-
# CHECK-NEXT: i32.const 1
143-
# CHECK-NEXT: br 2 # 2: down to label2
144+
# CHECK-NEXT: i32.const 1
145+
# CHECK-NEXT: br 2 # 2: down to label2
144146
# CHECK-NEXT: end_block # label4:
145-
# CHECK-NEXT: i32.const 2
146-
# CHECK-NEXT: br 1 # 1: down to label2
147+
# CHECK-NEXT: i32.const 2
148+
# CHECK-NEXT: br 1 # 1: down to label2
147149
# CHECK-NEXT: end_block # label3:
148-
# CHECK-NEXT: i32.const 3
150+
# CHECK-NEXT: i32.const 3
149151
# CHECK-NEXT: end_block # label2:
150152
# CHECK-NEXT: if
151153
# CHECK-NEXT: if i32
@@ -159,23 +161,24 @@ test0:
159161
# CHECK-NEXT: atomic.notify 0
160162
# CHECK-NEXT: .LBB0_3:
161163
# CHECK-NEXT: catch
162-
# CHECK-NEXT: local.set 0
164+
# CHECK-NEXT: local.set 0
163165
# CHECK-NEXT: block i32
164-
# CHECK-NEXT: local.get 0
165-
# CHECK-NEXT: br_on_exn 0, __cpp_exception
166+
# CHECK-NEXT: local.get 0
167+
# CHECK-NEXT: br_on_exn 0, __cpp_exception
166168
# CHECK-NEXT: rethrow
167169
# CHECK-NEXT: .LBB0_4:
168170
# CHECK-NEXT: end_block
169171
# CHECK-NEXT: end_try
170-
# CHECK-NEXT: i32.const .L.str
171-
# CHECK-NEXT: throw 0
172+
# CHECK-NEXT: i32.const .L.str
173+
# CHECK-NEXT: throw 0
172174
# CHECK-NEXT: .LBB0_5:
173175
# CHECK-NEXT: global.get __stack_pointer
174176
# CHECK-NEXT: end_function
175177

176-
# CHECK: .section .rodata..L.str,"",@
177-
# CHECK-NEXT:.L.str:
178-
# CHECK-NEXT: .int8 72
179-
# CHECK-NEXT: .asciz "ello, World!"
178+
# CHECK: .section .rodata..L.str,"",@
179+
# CHECK-NEXT: .hidden .L.str
180+
# CHECK-NEXT: .L.str:
181+
# CHECK-NEXT: .int8 72
182+
# CHECK-NEXT: .asciz "ello, World!"
180183

181-
# CHECK: .globaltype __stack_pointer, i32
184+
# CHECK: .globaltype __stack_pointer, i32

0 commit comments

Comments
 (0)
Please sign in to comment.