Commit | Line | Data |
---|---|---|
98971e75 MY |
1 | ;;; ld-script.el --- GNU linker script editing mode for Emacs |
2 | ||
ba318903 | 3 | ;; Copyright (C) 2001-2014 Free Software Foundation, Inc. |
98971e75 MY |
4 | |
5 | ;; Author: Masatake YAMATO<jet@gyve.org> | |
6 | ;; Keywords: languages, faces | |
7 | ||
b8313039 JPW |
8 | ;; This file is part of GNU Emacs. |
9 | ||
b1fc2b50 | 10 | ;; GNU Emacs is free software: you can redistribute it and/or modify |
98971e75 | 11 | ;; it under the terms of the GNU General Public License as published by |
b1fc2b50 GM |
12 | ;; the Free Software Foundation, either version 3 of the License, or |
13 | ;; (at your option) any later version. | |
98971e75 | 14 | |
b1fc2b50 | 15 | ;; GNU Emacs is distributed in the hope that it will be useful, |
98971e75 MY |
16 | ;; but WITHOUT ANY WARRANTY; without even the implied warranty of |
17 | ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
18 | ;; GNU General Public License for more details. | |
19 | ||
20 | ;; You should have received a copy of the GNU General Public License | |
b1fc2b50 | 21 | ;; along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. |
98971e75 | 22 | |
b8313039 JPW |
23 | ;;; Commentary: |
24 | ||
25 | ;; Major mode for editing GNU linker (ld) scripts. | |
26 | ||
27 | ;;; Code: | |
98971e75 MY |
28 | |
29 | ;; Custom | |
30 | (defgroup ld-script nil | |
31 | "GNU linker script code editing commands for Emacs." | |
32 | :prefix "ld-script-" | |
33 | :group 'languages) | |
34 | ||
a5d37031 MB |
35 | (defvar ld-script-location-counter-face 'ld-script-location-counter) |
36 | (defface ld-script-location-counter | |
4c344753 | 37 | '((t :weight bold :inherit font-lock-builtin-face)) |
98971e75 MY |
38 | "Face for location counter in GNU ld script." |
39 | :group 'ld-script) | |
40 | ||
41 | ;; Syntax rules | |
b8313039 | 42 | (defvar ld-script-mode-syntax-table |
98971e75 MY |
43 | (let ((st (make-syntax-table))) |
44 | (modify-syntax-entry ?\ "-" st) | |
45 | (modify-syntax-entry ?{ "(}" st) | |
46 | (modify-syntax-entry ?} "){" st) | |
47 | (modify-syntax-entry ?\( "()" st) | |
48 | (modify-syntax-entry ?\) ")(" st) | |
49 | (modify-syntax-entry ?\[ "(]" st) | |
50 | (modify-syntax-entry ?\] ")[" st) | |
1d5963cc | 51 | (modify-syntax-entry ?_ "_" st) |
98971e75 MY |
52 | (modify-syntax-entry ?. "_" st) |
53 | (modify-syntax-entry ?\\ "\\" st) | |
54 | (modify-syntax-entry ?: "." st) | |
55 | (modify-syntax-entry ?, "." st) | |
56 | (modify-syntax-entry ?? "." st) | |
57 | (modify-syntax-entry ?= "." st) | |
58 | (modify-syntax-entry ?* ". 23" st) | |
59 | (modify-syntax-entry ?/ ". 14" st) | |
60 | (modify-syntax-entry ?+ "." st) | |
61 | (modify-syntax-entry ?- "." st) | |
62 | (modify-syntax-entry ?! "." st) | |
63 | (modify-syntax-entry ?~ "." st) | |
64 | (modify-syntax-entry ?% "." st) | |
65 | (modify-syntax-entry ?< "." st) | |
66 | (modify-syntax-entry ?> "." st) | |
67 | (modify-syntax-entry ?& "." st) | |
68 | (modify-syntax-entry ?| "." st) | |
69 | (modify-syntax-entry ?\" "\"" st) | |
70 | st) | |
71 | "Syntax table used while in `ld-script-mode'.") | |
72 | ||
73 | ;; Font lock keywords | |
75ee40be | 74 | ;; (The section number comes from ld's info.) |
b8313039 | 75 | (defvar ld-script-keywords |
75ee40be MY |
76 | '( |
77 | ;; 3.4.1 Setting the Entry Point | |
ce009d0b | 78 | "ENTRY" |
75ee40be MY |
79 | ;; 3.4.2 Commands Dealing with Files |
80 | "INCLUDE" "INPUT" "GROUP" "AS_NEEDED" "OUTPUT" "SEARCH_DIR" "STARTUP" | |
81 | ;; 3.4.3 Commands Dealing with Object File Formats | |
98971e75 | 82 | "OUTPUT_FORMAT" "TARGET" |
92d10796 AS |
83 | ;; 3.4.4 Assign alias names to memory regions |
84 | "REGION_ALIAS" | |
85 | ;; 3.4.5 Other Linker Script Commands | |
ce009d0b | 86 | "ASSERT" "EXTERN" "FORCE_COMMON_ALLOCATION" |
92d10796 AS |
87 | "INHIBIT_COMMON_ALLOCATION" "INSERT" "AFTER" "BEFORE" |
88 | "NOCROSSREFS" "OUTPUT_ARCH" "LD_FEATURE" | |
75ee40be | 89 | ;; 3.5.2 PROVIDE |
b8313039 | 90 | "PROVIDE" |
75ee40be | 91 | ;; 3.5.3 PROVIDE_HIDDEN |
5bc1b111 | 92 | "PROVIDE_HIDDEN" |
75ee40be | 93 | ;; 3.6 SECTIONS Command |
ce009d0b | 94 | "SECTIONS" |
75ee40be | 95 | ;; 3.6.4.2 Input Section Wildcard Patterns |
92d10796 | 96 | "SORT" "SORT_BY_NAME" "SORT_BY_ALIGNMENT" "SORT_BY_INIT_PRIORITY" |
75ee40be MY |
97 | ;; 3.6.4.3 Input Section for Common Symbols |
98 | "COMMON" | |
99 | ;; 3.6.4.4 Input Section and Garbage Collection | |
100 | "KEEP" | |
101 | ;; 3.6.5 Output Section Data | |
102 | "BYTE" "SHORT" "LONG" "QUAD" "SQUAD" "FILL" | |
103 | ;; 3.6.6 Output Section Keywords | |
104 | "CREATE_OBJECT_SYMBOLS" "CONSTRUCTORS" | |
105 | "__CTOR_LIST__" "__CTOR_END__" "__DTOR_LIST__" "__DTOR_END__" | |
106 | ;; 3.6.7 Output Section Discarding | |
107 | ;; See `ld-script-font-lock-keywords' | |
108 | ;; 3.6.8.1 Output Section Type | |
98971e75 | 109 | "NOLOAD" "DSECT" "COPY" "INFO" "OVERLAY" |
75ee40be | 110 | ;; 3.6.8.2 Output Section LMA |
98971e75 | 111 | "AT" |
75ee40be MY |
112 | ;; 3.6.8.4 Forced Input Alignment |
113 | "SUBALIGN" | |
92d10796 AS |
114 | ;; 3.6.8.5 Output Section Constraint |
115 | "ONLY_IF_RO" "ONLY_IF_RW" | |
116 | ;; 3.6.8.7 Output Section Phdr | |
75ee40be MY |
117 | ":PHDR" |
118 | ;; 3.7 MEMORY Command | |
98971e75 | 119 | "MEMORY" |
75ee40be | 120 | ;; 3.8 PHDRS Command |
98971e75 | 121 | "PHDRS" "FILEHDR" "FLAGS" |
92d10796 | 122 | "PT_NULL" "PT_LOAD" "PT_DYNAMIC" "PT_INTERP" "PT_NOTE" "PT_SHLIB" "PT_PHDR" |
75ee40be | 123 | ;; 3.9 VERSION Command |
98971e75 MY |
124 | "VERSION") |
125 | "Keywords used of GNU ld script.") | |
126 | ||
92d10796 AS |
127 | |
128 | ;; 3.10.2 Symbolic Constants | |
129 | ;; 3.10.9 Builtin Functions | |
b8313039 | 130 | (defvar ld-script-builtins |
92d10796 AS |
131 | '("CONSTANT" |
132 | "MAXPAGESIZE" | |
133 | "COMMONPAGESIZE" | |
134 | "ABSOLUTE" | |
98971e75 MY |
135 | "ADDR" |
136 | "ALIGN" | |
92d10796 | 137 | "ALIGNOF" |
98971e75 | 138 | "BLOCK" |
6f9a47ab MY |
139 | "DATA_SEGMENT_ALIGN" |
140 | "DATA_SEGMENT_END" | |
141 | "DATA_SEGMENT_RELRO_END" | |
98971e75 | 142 | "DEFINED" |
75ee40be | 143 | "LENGTH" "len" "l" |
98971e75 MY |
144 | "LOADADDR" |
145 | "MAX" | |
146 | "MIN" | |
147 | "NEXT" | |
75ee40be | 148 | "ORIGIN" "org" "o" |
6f9a47ab | 149 | "SEGMENT_START" |
98971e75 MY |
150 | "SIZEOF" |
151 | "SIZEOF_HEADERS" | |
152 | "sizeof_headers") | |
153 | "Builtin functions of GNU ld script.") | |
154 | ||
155 | (defvar ld-script-font-lock-keywords | |
4076cbf6 | 156 | (append |
1d5963cc SM |
157 | `((,(concat "\\_<" (regexp-opt ld-script-keywords) "\\_>") |
158 | 0 font-lock-keyword-face) | |
159 | (,(concat "\\_<" (regexp-opt ld-script-builtins) "\\_>") | |
160 | 0 font-lock-builtin-face) | |
75ee40be MY |
161 | ;; 3.6.7 Output Section Discarding |
162 | ;; 3.6.4.1 Input Section Basics | |
92d10796 | 163 | ;; 3.6.8.7 Output Section Phdr |
75ee40be | 164 | ("/DISCARD/\\|EXCLUDE_FILE\\|:NONE" . font-lock-warning-face) |
4076cbf6 MY |
165 | ("\\W\\(\\.\\)\\W" 1 ld-script-location-counter-face) |
166 | ) | |
167 | cpp-font-lock-keywords) | |
b8313039 | 168 | "Default font-lock-keywords for `ld-script-mode'.") |
98971e75 | 169 | |
98971e75 | 170 | ;;;###autoload |
c5cde042 | 171 | (define-derived-mode ld-script-mode prog-mode "LD-Script" |
98971e75 MY |
172 | "A major mode to edit GNU ld script files" |
173 | (set (make-local-variable 'comment-start) "/* ") | |
174 | (set (make-local-variable 'comment-end) " */") | |
4c344753 SM |
175 | (set (make-local-variable 'font-lock-defaults) |
176 | '(ld-script-font-lock-keywords nil))) | |
98971e75 | 177 | |
b8313039 JPW |
178 | (provide 'ld-script) |
179 | ||
98971e75 | 180 | ;;; ld-script.el ends here |