Skip to content

Commit 8eb636e

Browse files
committed
MC-COFF: Fix Simple and Complex type. Fixes PR8320.
llvm-svn: 116037
1 parent 9367aa0 commit 8eb636e

File tree

2 files changed

+25
-12
lines changed

2 files changed

+25
-12
lines changed

llvm/include/llvm/Support/COFF.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -139,7 +139,7 @@ namespace COFF {
139139
IMAGE_SYM_DTYPE_ARRAY = 3, ///< An array of base type.
140140

141141
/// Type is formed as (base + (derived << SCT_COMPLEX_TYPE_SHIFT))
142-
SCT_COMPLEX_TYPE_SHIFT = 8
142+
SCT_COMPLEX_TYPE_SHIFT = 4
143143
};
144144

145145
struct section {

llvm/test/Scripts/coff-dump.py

Lines changed: 24 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -167,7 +167,8 @@ def symname(value):
167167
('Name', ('scalar', '<8s', symname)),
168168
('Value', ('scalar', '<L', '%d' )),
169169
('SectionNumber', ('scalar', '<H', '%d' )),
170-
('SimpleType', ('enum', '<B', '%d', {
170+
('_Type', ('scalar', '<H', None )),
171+
('SimpleType', ('enum', '& _Type 15', '%d', {
171172
0: 'IMAGE_SYM_TYPE_NULL',
172173
1: 'IMAGE_SYM_TYPE_VOID',
173174
2: 'IMAGE_SYM_TYPE_CHAR',
@@ -184,8 +185,8 @@ def symname(value):
184185
13: 'IMAGE_SYM_TYPE_WORD',
185186
14: 'IMAGE_SYM_TYPE_UINT',
186187
15: 'IMAGE_SYM_TYPE_DWORD',
187-
})),
188-
('ComplexType', ('enum', '<B', '%d', {
188+
})), # (Type & 0xF0) >> 4
189+
('ComplexType', ('enum', '>> & _Type 240 4', '%d', {
189190
0: 'IMAGE_SYM_DTYPE_NULL',
190191
1: 'IMAGE_SYM_DTYPE_POINTER',
191192
2: 'IMAGE_SYM_DTYPE_FUNCTION',
@@ -317,7 +318,7 @@ def print_binary_data(size):
317318
write("%s|%s|\n" % (bytes, text))
318319
return value
319320

320-
idlit = re.compile("[a-zA-Z][a-zA-Z0-9_-]*")
321+
idlit = re.compile("[a-zA-Z_][a-zA-Z0-9_-]*")
321322
numlit = re.compile("[0-9]+")
322323

323324
def read_value(expr):
@@ -335,11 +336,6 @@ def eval():
335336
if expr == 'false':
336337
return False
337338

338-
if len(token) > 1 and token[0] in ('=', '@', '<', '!', '>'):
339-
val = read(expr)
340-
assert(len(val) == 1)
341-
return val[0]
342-
343339
if token == '+':
344340
return eval() + eval()
345341
if token == '-':
@@ -348,6 +344,19 @@ def eval():
348344
return eval() * eval()
349345
if token == '/':
350346
return eval() / eval()
347+
if token == '&':
348+
return eval() & eval()
349+
if token == '|':
350+
return eval() | eval()
351+
if token == '>>':
352+
return eval() >> eval()
353+
if token == '<<':
354+
return eval() << eval()
355+
356+
if len(token) > 1 and token[0] in ('=', '@', '<', '!', '>'):
357+
val = read(expr)
358+
assert(len(val) == 1)
359+
return val[0]
351360

352361
if idlit.match(token):
353362
return Fields[token]
@@ -373,6 +382,8 @@ def write_value(format,value):
373382
elif format_type is types.TupleType:
374383
Fields['this'] = value
375384
handle_element(format)
385+
elif format_type is types.NoneType:
386+
pass
376387
else:
377388
raise RuntimeError("unexpected type: %s" % repr(format_type))
378389

@@ -448,11 +459,13 @@ def handle_struct(entry):
448459
name = member[0]
449460
type = member[1]
450461

451-
write("%s = "%name.ljust(24))
462+
if name[0] != "_":
463+
write("%s = " % name.ljust(24))
452464

453465
value = handle_element(type)
454466

455-
write("\n")
467+
if name[0] != "_":
468+
write("\n")
456469

457470
Fields[name] = value
458471
newFields[name] = value

0 commit comments

Comments
 (0)