FlagsStr = getTok().getStringContents();
Lex();
- AsmToken::TokenKind TypeStartToken;
- if (getContext().getAsmInfo().getCommentString()[0] == '@')
- TypeStartToken = AsmToken::Percent;
- else
- TypeStartToken = AsmToken::At;
-
bool Mergeable = FlagsStr.find('M') != StringRef::npos;
bool Group = FlagsStr.find('G') != StringRef::npos;
return TokError("Group section must specify the type");
} else {
Lex();
- if (getLexer().isNot(TypeStartToken))
- return TokError("expected the type");
+ if (getLexer().isNot(AsmToken::Percent) && getLexer().isNot(AsmToken::At))
+ return TokError("expected '@' or '%' before type");
Lex();
if (getParser().ParseIdentifier(TypeName))
return TokError("unexpected token in '.type' directive");
Lex();
- if (getLexer().isNot(AsmToken::At))
- return TokError("expected '@' before type");
+ if (getLexer().isNot(AsmToken::Percent) && getLexer().isNot(AsmToken::At))
+ return TokError("expected '@' or '%' before type");
Lex();
StringRef Type;
// Test that these names are accepted.
.section .note.GNU-stack,"",@progbits
+.section .note.GNU-stack2,"",%progbits
.section .note.GNU-,"",@progbits
.section -.note.GNU,"",@progbits
// CHECK: ('sh_name', 0x00000012) # '.note.GNU-stack'
-// CHECK: ('sh_name', 0x00000022) # '.note.GNU-'
-// CHECK: ('sh_name', 0x0000002d) # '-.note.GNU'
+// CHECK: ('sh_name', 0x00000022) # '.note.GNU-stack2'
+// CHECK: ('sh_name', 0x00000033) # '.note.GNU-'
+// CHECK: ('sh_name', 0x0000003e) # '-.note.GNU'
// Test that the dafults are used
.section .fini
.section .rodata
-// CHECK: (('sh_name', 0x00000038) # '.init'
+// CHECK: (('sh_name', 0x00000049) # '.init'
// CHECK-NEXT: ('sh_type', 0x00000001)
// CHECK-NEXT: ('sh_flags', 0x00000006)
// CHECK-NEXT: ('sh_addr', 0x00000000)
// CHECK-NEXT: ('sh_addralign', 0x00000001)
// CHECK-NEXT: ('sh_entsize', 0x00000000)
// CHECK-NEXT: ),
-// CHECK-NEXT: # Section 0x0000000a
-// CHECK-NEXT: (('sh_name', 0x0000003e) # '.fini'
+// CHECK-NEXT: # Section 0x0000000b
+// CHECK-NEXT: (('sh_name', 0x0000004f) # '.fini'
// CHECK-NEXT: ('sh_type', 0x00000001)
// CHECK-NEXT: ('sh_flags', 0x00000006)
// CHECK-NEXT: ('sh_addr', 0x00000000)
// CHECK-NEXT: ('sh_addralign', 0x00000001)
// CHECK-NEXT: ('sh_entsize', 0x00000000)
// CHECK-NEXT: ),
-// CHECK-NEXT: # Section 0x0000000b
-// CHECK-NEXT: (('sh_name', 0x00000044) # '.rodata'
+// CHECK-NEXT: # Section 0x0000000c
+// CHECK-NEXT: (('sh_name', 0x00000055) # '.rodata'
// CHECK-NEXT: ('sh_type', 0x00000001)
// CHECK-NEXT: ('sh_flags', 0x00000002)
// CHECK-NEXT: ('sh_addr', 0x00000000)
--- /dev/null
+// RUN: llvm-mc -filetype=obj -triple x86_64-pc-linux-gnu %s -o - | elf-dump | FileCheck %s
+
+// Test that both % and @ are accepted.
+ .global foo
+ .type foo,%function
+foo:
+
+ .global bar
+ .type bar,@object
+bar:
+
+// CHECK: # Symbol 0x00000004
+// CHECK-NEXT: (('st_name', 0x00000005) # 'bar'
+// CHECK-NEXT: ('st_bind', 0x00000001)
+// CHECK-NEXT: ('st_type', 0x00000001)
+// CHECK-NEXT: ('st_other', 0x00000000)
+// CHECK-NEXT: ('st_shndx', 0x00000001)
+// CHECK-NEXT: ('st_value', 0x00000000)
+// CHECK-NEXT: ('st_size', 0x00000000)
+// CHECK-NEXT: ),
+// CHECK-NEXT: # Symbol 0x00000005
+// CHECK-NEXT: (('st_name', 0x00000001) # 'foo'
+// CHECK-NEXT: ('st_bind', 0x00000001)
+// CHECK-NEXT: ('st_type', 0x00000002)
+// CHECK-NEXT: ('st_other', 0x00000000)
+// CHECK-NEXT: ('st_shndx', 0x00000001)
+// CHECK-NEXT: ('st_value', 0x00000000)
+// CHECK-NEXT: ('st_size', 0x00000000)
+// CHECK-NEXT: ),