aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2009-06-24 05:13:15 +0000
committerChris Lattner <sabre@nondot.org>2009-06-24 05:13:15 +0000
commit529fb545e7e876c8ea640efb6858f414e50a9f81 (patch)
tree0bc4b2cc6d125b4315ff9daf01ea9c61226f8596
parent64a845e8361b7f27dc06b069ecd71c83927a654f (diff)
implement a bunch of synonyms for section switching.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@74062 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--tools/llvm-mc/AsmParser.cpp115
-rw-r--r--tools/llvm-mc/AsmParser.h4
2 files changed, 115 insertions, 4 deletions
diff --git a/tools/llvm-mc/AsmParser.cpp b/tools/llvm-mc/AsmParser.cpp
index 37cb4aecf8..e493812e88 100644
--- a/tools/llvm-mc/AsmParser.cpp
+++ b/tools/llvm-mc/AsmParser.cpp
@@ -196,8 +196,100 @@ bool AsmParser::ParseStatement() {
// Otherwise, we have a normal instruction or directive.
if (IDVal[0] == '.') {
+ // FIXME: This should be driven based on a hash lookup and callback.
if (!strcmp(IDVal, ".section"))
- return ParseDirectiveSection();
+ return ParseDirectiveDarwinSection();
+ if (!strcmp(IDVal, ".text"))
+ // FIXME: This changes behavior based on the -static flag to the
+ // assembler.
+ return ParseDirectiveSectionSwitch("__TEXT,__text",
+ "regular,pure_instructions");
+ if (!strcmp(IDVal, ".const"))
+ return ParseDirectiveSectionSwitch("__TEXT,__const");
+ if (!strcmp(IDVal, ".static_const"))
+ return ParseDirectiveSectionSwitch("__TEXT,__static_const");
+ if (!strcmp(IDVal, ".cstring"))
+ return ParseDirectiveSectionSwitch("__TEXT,__cstring","cstring_literals");
+ if (!strcmp(IDVal, ".literal4"))
+ return ParseDirectiveSectionSwitch("__TEXT,__literal4", "4byte_literals");
+ if (!strcmp(IDVal, ".literal8"))
+ return ParseDirectiveSectionSwitch("__TEXT,__literal8", "8byte_literals");
+ if (!strcmp(IDVal, ".literal16"))
+ return ParseDirectiveSectionSwitch("__TEXT,__literal16",
+ "16byte_literals");
+ if (!strcmp(IDVal, ".constructor"))
+ return ParseDirectiveSectionSwitch("__TEXT,__constructor");
+ if (!strcmp(IDVal, ".destructor"))
+ return ParseDirectiveSectionSwitch("__TEXT,__destructor");
+ if (!strcmp(IDVal, ".fvmlib_init0"))
+ return ParseDirectiveSectionSwitch("__TEXT,__fvmlib_init0");
+ if (!strcmp(IDVal, ".fvmlib_init1"))
+ return ParseDirectiveSectionSwitch("__TEXT,__fvmlib_init1");
+ if (!strcmp(IDVal, ".symbol_stub")) // FIXME: Different on PPC.
+ return ParseDirectiveSectionSwitch("__IMPORT,__jump_table,symbol_stubs",
+ "self_modifying_code+pure_instructions,5");
+ // FIXME: .picsymbol_stub on PPC.
+ if (!strcmp(IDVal, ".data"))
+ return ParseDirectiveSectionSwitch("__DATA,__data");
+ if (!strcmp(IDVal, ".static_data"))
+ return ParseDirectiveSectionSwitch("__DATA,__static_data");
+ if (!strcmp(IDVal, ".non_lazy_symbol_pointer"))
+ return ParseDirectiveSectionSwitch("__DATA,__nl_symbol_pointer",
+ "non_lazy_symbol_pointers");
+ if (!strcmp(IDVal, ".lazy_symbol_pointer"))
+ return ParseDirectiveSectionSwitch("__DATA,__la_symbol_pointer",
+ "lazy_symbol_pointers");
+ if (!strcmp(IDVal, ".dyld"))
+ return ParseDirectiveSectionSwitch("__DATA,__dyld");
+ if (!strcmp(IDVal, ".mod_init_func"))
+ return ParseDirectiveSectionSwitch("__DATA,__mod_init_func",
+ "mod_init_funcs");
+ if (!strcmp(IDVal, ".mod_term_func"))
+ return ParseDirectiveSectionSwitch("__DATA,__mod_term_func",
+ "mod_term_funcs");
+ if (!strcmp(IDVal, ".const_data"))
+ return ParseDirectiveSectionSwitch("__DATA,__const", "regular");
+
+
+ // FIXME: Verify attributes on sections.
+ if (!strcmp(IDVal, ".objc_class"))
+ return ParseDirectiveSectionSwitch("__OBJC,__class");
+ if (!strcmp(IDVal, ".objc_meta_class"))
+ return ParseDirectiveSectionSwitch("__OBJC,__meta_class");
+ if (!strcmp(IDVal, ".objc_cat_cls_meth"))
+ return ParseDirectiveSectionSwitch("__OBJC,__cat_cls_meth");
+ if (!strcmp(IDVal, ".objc_cat_inst_meth"))
+ return ParseDirectiveSectionSwitch("__OBJC,__cat_inst_meth");
+ if (!strcmp(IDVal, ".objc_protocol"))
+ return ParseDirectiveSectionSwitch("__OBJC,__protocol");
+ if (!strcmp(IDVal, ".objc_string_object"))
+ return ParseDirectiveSectionSwitch("__OBJC,__string_object");
+ if (!strcmp(IDVal, ".objc_cls_meth"))
+ return ParseDirectiveSectionSwitch("__OBJC,__cls_meth");
+ if (!strcmp(IDVal, ".objc_inst_meth"))
+ return ParseDirectiveSectionSwitch("__OBJC,__inst_meth");
+ if (!strcmp(IDVal, ".objc_cls_refs"))
+ return ParseDirectiveSectionSwitch("__OBJC,__cls_refs");
+ if (!strcmp(IDVal, ".objc_message_refs"))
+ return ParseDirectiveSectionSwitch("__OBJC,__message_refs");
+ if (!strcmp(IDVal, ".objc_symbols"))
+ return ParseDirectiveSectionSwitch("__OBJC,__symbols");
+ if (!strcmp(IDVal, ".objc_category"))
+ return ParseDirectiveSectionSwitch("__OBJC,__category");
+ if (!strcmp(IDVal, ".objc_class_vars"))
+ return ParseDirectiveSectionSwitch("__OBJC,__class_vars");
+ if (!strcmp(IDVal, ".objc_instance_vars"))
+ return ParseDirectiveSectionSwitch("__OBJC,__instance_vars");
+ if (!strcmp(IDVal, ".objc_module_info"))
+ return ParseDirectiveSectionSwitch("__OBJC,__module_info");
+ if (!strcmp(IDVal, ".objc_class_names"))
+ return ParseDirectiveSectionSwitch("__TEXT,__cstring","cstring_literals");
+ if (!strcmp(IDVal, ".objc_meth_var_types"))
+ return ParseDirectiveSectionSwitch("__TEXT,__cstring","cstring_literals");
+ if (!strcmp(IDVal, ".objc_meth_var_names"))
+ return ParseDirectiveSectionSwitch("__TEXT,__cstring","cstring_literals");
+ if (!strcmp(IDVal, ".objc_selector_strs"))
+ return ParseDirectiveSectionSwitch("__OBJC,__selector_strs");
Lexer.PrintMessage(IDLoc, "warning: ignoring directive for now");
@@ -225,8 +317,10 @@ bool AsmParser::ParseStatement() {
}
/// ParseDirectiveSection:
-/// ::= .section identifier
-bool AsmParser::ParseDirectiveSection() {
+/// ::= .section identifier (',' identifier)*
+/// FIXME: This should actually parse out the segment, section, attributes and
+/// sizeof_stub fields.
+bool AsmParser::ParseDirectiveDarwinSection() {
if (Lexer.isNot(asmtok::Identifier))
return TokError("expected identifier after '.section' directive");
@@ -252,3 +346,18 @@ bool AsmParser::ParseDirectiveSection() {
return false;
}
+bool AsmParser::ParseDirectiveSectionSwitch(const char *Section,
+ const char *Directives) {
+ if (Lexer.isNot(asmtok::EndOfStatement))
+ return TokError("unexpected token in section switching directive");
+ Lexer.Lex();
+
+ std::string SectionStr = Section;
+ if (Directives && Directives[0]) {
+ SectionStr += ",";
+ SectionStr += Directives;
+ }
+
+ Out.SwitchSection(Ctx.GetSection(Section));
+ return false;
+}
diff --git a/tools/llvm-mc/AsmParser.h b/tools/llvm-mc/AsmParser.h
index 9e432e861f..c793d782b8 100644
--- a/tools/llvm-mc/AsmParser.h
+++ b/tools/llvm-mc/AsmParser.h
@@ -54,7 +54,9 @@ private:
bool ParseX86MemOperand(X86Operand &Op);
// Directive Parsing.
- bool ParseDirectiveSection();
+ bool ParseDirectiveDarwinSection(); // Darwin specific ".section".
+ bool ParseDirectiveSectionSwitch(const char *Section,
+ const char *Directives = 0);
};