diff options
| author | Daniel Dunbar <daniel@zuster.org> | 2011-04-29 18:20:17 +0000 | 
|---|---|---|
| committer | Daniel Dunbar <daniel@zuster.org> | 2011-04-29 18:20:17 +0000 | 
| commit | bea7b93c884412b61a068dc459027089d9764e7e (patch) | |
| tree | 56d156f34f22355fc82bad2115ae681a6131506a | |
| parent | b200f93125eb019d69c220fa447faea4f5d4eb8a (diff) | |
| download | bcm5719-llvm-bea7b93c884412b61a068dc459027089d9764e7e.tar.gz bcm5719-llvm-bea7b93c884412b61a068dc459027089d9764e7e.zip  | |
MC: Change variable symbols to be recognized as defined, by assigning their sections based on FindAssociatedSection().
llvm-svn: 130523
| -rw-r--r-- | llvm/lib/MC/MCSymbol.cpp | 10 | ||||
| -rw-r--r-- | llvm/test/MC/MachO/variable-exprs.s | 446 | 
2 files changed, 453 insertions, 3 deletions
diff --git a/llvm/lib/MC/MCSymbol.cpp b/llvm/lib/MC/MCSymbol.cpp index 1c71f267a4b..c2fad1674aa 100644 --- a/llvm/lib/MC/MCSymbol.cpp +++ b/llvm/lib/MC/MCSymbol.cpp @@ -58,9 +58,13 @@ void MCSymbol::setVariableValue(const MCExpr *Value) {           "Invalid redefinition!");    this->Value = Value; -  // Mark the variable as absolute as appropriate. -  if (isa<MCConstantExpr>(Value)) -    setAbsolute(); +  // Variables should always be marked as in the same "section" as the value. +  const MCSection *Section = Value->FindAssociatedSection(); +  if (Section) { +    setSection(*Section); +  } else { +    setUndefined(); +  }  }  void MCSymbol::print(raw_ostream &OS) const { diff --git a/llvm/test/MC/MachO/variable-exprs.s b/llvm/test/MC/MachO/variable-exprs.s new file mode 100644 index 00000000000..8eeb82f0faf --- /dev/null +++ b/llvm/test/MC/MachO/variable-exprs.s @@ -0,0 +1,446 @@ +// RUN: llvm-mc -triple i386-apple-darwin10 %s -filetype=obj -o %t.o +// RUN: macho-dump --dump-section-data < %t.o > %t.dump +// RUN: FileCheck --check-prefix=CHECK-I386 < %t.dump %s + +// RUN: llvm-mc -triple x86_64-apple-darwin10 %s -filetype=obj -o %t.o +// RUN: macho-dump --dump-section-data < %t.o > %t.dump +// RUN: FileCheck --check-prefix=CHECK-X86_64 < %t.dump %s + +.data + +        .long 0 +a: +        .long 0 +b = a + +c:      .long b + +d2 = d +.globl d2 +d3 = d + 4 +.globl d3 + +e = a + 4 + +g: +f = g +        .long 0 +         +        .long b +        .long e +        .long a + 4 +        .long d +        .long d2 +        .long d3 +        .long f +        .long g + +/// +        .text +t0: +Lt0_a: +        ret + +	.data +Lt0_b: +Lt0_x = Lt0_a - Lt0_b +	.quad	Lt0_x + +// CHECK-I386: ('cputype', 7) +// CHECK-I386: ('cpusubtype', 3) +// CHECK-I386: ('filetype', 1) +// CHECK-I386: ('num_load_commands', 3) +// CHECK-I386: ('load_commands_size', 296) +// CHECK-I386: ('flag', 0) +// CHECK-I386: ('load_commands', [ +// CHECK-I386:   # Load Command 0 +// CHECK-I386:  (('command', 1) +// CHECK-I386:   ('size', 192) +// CHECK-I386:   ('segment_name', '\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00') +// CHECK-I386:   ('vm_addr', 0) +// CHECK-I386:   ('vm_size', 57) +// CHECK-I386:   ('file_offset', 324) +// CHECK-I386:   ('file_size', 57) +// CHECK-I386:   ('maxprot', 7) +// CHECK-I386:   ('initprot', 7) +// CHECK-I386:   ('num_sections', 2) +// CHECK-I386:   ('flags', 0) +// CHECK-I386:   ('sections', [ +// CHECK-I386:     # Section 0 +// CHECK-I386:    (('section_name', '__text\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00') +// CHECK-I386:     ('segment_name', '__TEXT\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00') +// CHECK-I386:     ('address', 0) +// CHECK-I386:     ('size', 1) +// CHECK-I386:     ('offset', 324) +// CHECK-I386:     ('alignment', 0) +// CHECK-I386:     ('reloc_offset', 0) +// CHECK-I386:     ('num_reloc', 0) +// CHECK-I386:     ('flags', 0x80000400) +// CHECK-I386:     ('reserved1', 0) +// CHECK-I386:     ('reserved2', 0) +// CHECK-I386:    ), +// CHECK-I386:   ('_relocations', [ +// CHECK-I386:   ]) +// CHECK-I386:   ('_section_data', 'c3') +// CHECK-I386:     # Section 1 +// CHECK-I386:    (('section_name', '__data\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00') +// CHECK-I386:     ('segment_name', '__DATA\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00') +// CHECK-I386:     ('address', 1) +// CHECK-I386:     ('size', 56) +// CHECK-I386:     ('offset', 325) +// CHECK-I386:     ('alignment', 0) +// CHECK-I386:     ('reloc_offset', 384) +// CHECK-I386:     ('num_reloc', 9) +// CHECK-I386:     ('flags', 0x0) +// CHECK-I386:     ('reserved1', 0) +// CHECK-I386:     ('reserved2', 0) +// CHECK-I386:    ), +// CHECK-I386:   ('_relocations', [ +// CHECK-I386:     # Relocation 0 +// CHECK-I386:     (('word-0', 0x2c), +// CHECK-I386:      ('word-1', 0x4000002)), +// CHECK-I386:     # Relocation 1 +// CHECK-I386:     (('word-0', 0x28), +// CHECK-I386:      ('word-1', 0x4000002)), +// CHECK-I386:     # Relocation 2 +// CHECK-I386:     (('word-0', 0x24), +// CHECK-I386:      ('word-1', 0xc000009)), +// CHECK-I386:     # Relocation 3 +// CHECK-I386:     (('word-0', 0x20), +// CHECK-I386:      ('word-1', 0xc000008)), +// CHECK-I386:     # Relocation 4 +// CHECK-I386:     (('word-0', 0x1c), +// CHECK-I386:      ('word-1', 0xc000007)), +// CHECK-I386:     # Relocation 5 +// CHECK-I386:     (('word-0', 0xa0000018), +// CHECK-I386:      ('word-1', 0x5)), +// CHECK-I386:     # Relocation 6 +// CHECK-I386:     (('word-0', 0x14), +// CHECK-I386:      ('word-1', 0x4000002)), +// CHECK-I386:     # Relocation 7 +// CHECK-I386:     (('word-0', 0x10), +// CHECK-I386:      ('word-1', 0x4000002)), +// CHECK-I386:     # Relocation 8 +// CHECK-I386:     (('word-0', 0x8), +// CHECK-I386:      ('word-1', 0x4000002)), +// CHECK-I386:   ]) +// CHECK-I386:   ('_section_data', '00000000 00000000 05000000 00000000 05000000 09000000 09000000 00000000 00000000 00000000 0d000000 0d000000 cfffffff ffffffff') +// CHECK-I386:   ]) +// CHECK-I386:  ), +// CHECK-I386:   # Load Command 1 +// CHECK-I386:  (('command', 2) +// CHECK-I386:   ('size', 24) +// CHECK-I386:   ('symoff', 456) +// CHECK-I386:   ('nsyms', 10) +// CHECK-I386:   ('stroff', 576) +// CHECK-I386:   ('strsize', 24) +// CHECK-I386:   ('_string_data', '\x00d2\x00d\x00d3\x00a\x00b\x00c\x00e\x00g\x00f\x00t0\x00') +// CHECK-I386:   ('_symbols', [ +// CHECK-I386:     # Symbol 0 +// CHECK-I386:    (('n_strx', 9) +// CHECK-I386:     ('n_type', 0xe) +// CHECK-I386:     ('n_sect', 2) +// CHECK-I386:     ('n_desc', 0) +// CHECK-I386:     ('n_value', 5) +// CHECK-I386:     ('_string', 'a') +// CHECK-I386:    ), +// CHECK-I386:     # Symbol 1 +// CHECK-I386:    (('n_strx', 11) +// CHECK-I386:     ('n_type', 0xe) +// CHECK-I386:     ('n_sect', 2) +// CHECK-I386:     ('n_desc', 0) +// CHECK-I386:     ('n_value', 5) +// CHECK-I386:     ('_string', 'b') +// CHECK-I386:    ), +// CHECK-I386:     # Symbol 2 +// CHECK-I386:    (('n_strx', 13) +// CHECK-I386:     ('n_type', 0xe) +// CHECK-I386:     ('n_sect', 2) +// CHECK-I386:     ('n_desc', 0) +// CHECK-I386:     ('n_value', 9) +// CHECK-I386:     ('_string', 'c') +// CHECK-I386:    ), +// CHECK-I386:     # Symbol 3 +// CHECK-I386:    (('n_strx', 15) +// CHECK-I386:     ('n_type', 0xe) +// CHECK-I386:     ('n_sect', 2) +// CHECK-I386:     ('n_desc', 0) +// CHECK-I386:     ('n_value', 9) +// CHECK-I386:     ('_string', 'e') +// CHECK-I386:    ), +// CHECK-I386:     # Symbol 4 +// CHECK-I386:    (('n_strx', 17) +// CHECK-I386:     ('n_type', 0xe) +// CHECK-I386:     ('n_sect', 2) +// CHECK-I386:     ('n_desc', 0) +// CHECK-I386:     ('n_value', 13) +// CHECK-I386:     ('_string', 'g') +// CHECK-I386:    ), +// CHECK-I386:     # Symbol 5 +// CHECK-I386:    (('n_strx', 19) +// CHECK-I386:     ('n_type', 0xe) +// CHECK-I386:     ('n_sect', 2) +// CHECK-I386:     ('n_desc', 0) +// CHECK-I386:     ('n_value', 13) +// CHECK-I386:     ('_string', 'f') +// CHECK-I386:    ), +// CHECK-I386:     # Symbol 6 +// CHECK-I386:    (('n_strx', 21) +// CHECK-I386:     ('n_type', 0xe) +// CHECK-I386:     ('n_sect', 1) +// CHECK-I386:     ('n_desc', 0) +// CHECK-I386:     ('n_value', 0) +// CHECK-I386:     ('_string', 't0') +// CHECK-I386:    ), +// CHECK-I386:     # Symbol 7 +// CHECK-I386:    (('n_strx', 4) +// CHECK-I386:     ('n_type', 0x1) +// CHECK-I386:     ('n_sect', 0) +// CHECK-I386:     ('n_desc', 0) +// CHECK-I386:     ('n_value', 0) +// CHECK-I386:     ('_string', 'd') +// CHECK-I386:    ), +// CHECK-I386:     # Symbol 8 +// CHECK-I386:    (('n_strx', 1) +// CHECK-I386:     ('n_type', 0x1) +// CHECK-I386:     ('n_sect', 0) +// CHECK-I386:     ('n_desc', 0) +// CHECK-I386:     ('n_value', 0) +// CHECK-I386:     ('_string', 'd2') +// CHECK-I386:    ), +// CHECK-I386:     # Symbol 9 +// CHECK-I386:    (('n_strx', 6) +// CHECK-I386:     ('n_type', 0x1) +// CHECK-I386:     ('n_sect', 0) +// CHECK-I386:     ('n_desc', 0) +// CHECK-I386:     ('n_value', 0) +// CHECK-I386:     ('_string', 'd3') +// CHECK-I386:    ), +// CHECK-I386:   ]) +// CHECK-I386:  ), +// CHECK-I386:   # Load Command 2 +// CHECK-I386:  (('command', 11) +// CHECK-I386:   ('size', 80) +// CHECK-I386:   ('ilocalsym', 0) +// CHECK-I386:   ('nlocalsym', 7) +// CHECK-I386:   ('iextdefsym', 7) +// CHECK-I386:   ('nextdefsym', 0) +// CHECK-I386:   ('iundefsym', 7) +// CHECK-I386:   ('nundefsym', 3) +// CHECK-I386:   ('tocoff', 0) +// CHECK-I386:   ('ntoc', 0) +// CHECK-I386:   ('modtaboff', 0) +// CHECK-I386:   ('nmodtab', 0) +// CHECK-I386:   ('extrefsymoff', 0) +// CHECK-I386:   ('nextrefsyms', 0) +// CHECK-I386:   ('indirectsymoff', 0) +// CHECK-I386:   ('nindirectsyms', 0) +// CHECK-I386:   ('extreloff', 0) +// CHECK-I386:   ('nextrel', 0) +// CHECK-I386:   ('locreloff', 0) +// CHECK-I386:   ('nlocrel', 0) +// CHECK-I386:   ('_indirect_symbols', [ +// CHECK-I386:   ]) +// CHECK-I386:  ), +// CHECK-I386: ]) + +// CHECK-X86_64: ('cputype', 16777223) +// CHECK-X86_64: ('cpusubtype', 3) +// CHECK-X86_64: ('filetype', 1) +// CHECK-X86_64: ('num_load_commands', 3) +// CHECK-X86_64: ('load_commands_size', 336) +// CHECK-X86_64: ('flag', 0) +// CHECK-X86_64: ('reserved', 0) +// CHECK-X86_64: ('load_commands', [ +// CHECK-X86_64:   # Load Command 0 +// CHECK-X86_64:  (('command', 25) +// CHECK-X86_64:   ('size', 232) +// CHECK-X86_64:   ('segment_name', '\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00') +// CHECK-X86_64:   ('vm_addr', 0) +// CHECK-X86_64:   ('vm_size', 57) +// CHECK-X86_64:   ('file_offset', 368) +// CHECK-X86_64:   ('file_size', 57) +// CHECK-X86_64:   ('maxprot', 7) +// CHECK-X86_64:   ('initprot', 7) +// CHECK-X86_64:   ('num_sections', 2) +// CHECK-X86_64:   ('flags', 0) +// CHECK-X86_64:   ('sections', [ +// CHECK-X86_64:     # Section 0 +// CHECK-X86_64:    (('section_name', '__text\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00') +// CHECK-X86_64:     ('segment_name', '__TEXT\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00') +// CHECK-X86_64:     ('address', 0) +// CHECK-X86_64:     ('size', 1) +// CHECK-X86_64:     ('offset', 368) +// CHECK-X86_64:     ('alignment', 0) +// CHECK-X86_64:     ('reloc_offset', 0) +// CHECK-X86_64:     ('num_reloc', 0) +// CHECK-X86_64:     ('flags', 0x80000400) +// CHECK-X86_64:     ('reserved1', 0) +// CHECK-X86_64:     ('reserved2', 0) +// CHECK-X86_64:     ('reserved3', 0) +// CHECK-X86_64:    ), +// CHECK-X86_64:   ('_relocations', [ +// CHECK-X86_64:   ]) +// CHECK-X86_64:   ('_section_data', 'c3') +// CHECK-X86_64:     # Section 1 +// CHECK-X86_64:    (('section_name', '__data\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00') +// CHECK-X86_64:     ('segment_name', '__DATA\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00') +// CHECK-X86_64:     ('address', 1) +// CHECK-X86_64:     ('size', 56) +// CHECK-X86_64:     ('offset', 369) +// CHECK-X86_64:     ('alignment', 0) +// CHECK-X86_64:     ('reloc_offset', 428) +// CHECK-X86_64:     ('num_reloc', 9) +// CHECK-X86_64:     ('flags', 0x0) +// CHECK-X86_64:     ('reserved1', 0) +// CHECK-X86_64:     ('reserved2', 0) +// CHECK-X86_64:     ('reserved3', 0) +// CHECK-X86_64:    ), +// CHECK-X86_64:   ('_relocations', [ +// CHECK-X86_64:     # Relocation 0 +// CHECK-X86_64:     (('word-0', 0x2c), +// CHECK-X86_64:      ('word-1', 0xc000004)), +// CHECK-X86_64:     # Relocation 1 +// CHECK-X86_64:     (('word-0', 0x28), +// CHECK-X86_64:      ('word-1', 0xc000005)), +// CHECK-X86_64:     # Relocation 2 +// CHECK-X86_64:     (('word-0', 0x24), +// CHECK-X86_64:      ('word-1', 0xc000009)), +// CHECK-X86_64:     # Relocation 3 +// CHECK-X86_64:     (('word-0', 0x20), +// CHECK-X86_64:      ('word-1', 0xc000008)), +// CHECK-X86_64:     # Relocation 4 +// CHECK-X86_64:     (('word-0', 0x1c), +// CHECK-X86_64:      ('word-1', 0xc000007)), +// CHECK-X86_64:     # Relocation 5 +// CHECK-X86_64:     (('word-0', 0x18), +// CHECK-X86_64:      ('word-1', 0xc000000)), +// CHECK-X86_64:     # Relocation 6 +// CHECK-X86_64:     (('word-0', 0x14), +// CHECK-X86_64:      ('word-1', 0xc000003)), +// CHECK-X86_64:     # Relocation 7 +// CHECK-X86_64:     (('word-0', 0x10), +// CHECK-X86_64:      ('word-1', 0xc000001)), +// CHECK-X86_64:     # Relocation 8 +// CHECK-X86_64:     (('word-0', 0x8), +// CHECK-X86_64:      ('word-1', 0xc000001)), +// CHECK-X86_64:   ]) +// CHECK-X86_64:   ('_section_data', '00000000 00000000 00000000 00000000 00000000 00000000 04000000 00000000 00000000 00000000 00000000 00000000 cfffffff ffffffff') +// CHECK-X86_64:   ]) +// CHECK-X86_64:  ), +// CHECK-X86_64:   # Load Command 1 +// CHECK-X86_64:  (('command', 2) +// CHECK-X86_64:   ('size', 24) +// CHECK-X86_64:   ('symoff', 500) +// CHECK-X86_64:   ('nsyms', 10) +// CHECK-X86_64:   ('stroff', 660) +// CHECK-X86_64:   ('strsize', 24) +// CHECK-X86_64:   ('_string_data', '\x00d2\x00d\x00d3\x00a\x00b\x00c\x00e\x00g\x00f\x00t0\x00') +// CHECK-X86_64:   ('_symbols', [ +// CHECK-X86_64:     # Symbol 0 +// CHECK-X86_64:    (('n_strx', 9) +// CHECK-X86_64:     ('n_type', 0xe) +// CHECK-X86_64:     ('n_sect', 2) +// CHECK-X86_64:     ('n_desc', 0) +// CHECK-X86_64:     ('n_value', 5) +// CHECK-X86_64:     ('_string', 'a') +// CHECK-X86_64:    ), +// CHECK-X86_64:     # Symbol 1 +// CHECK-X86_64:    (('n_strx', 11) +// CHECK-X86_64:     ('n_type', 0xe) +// CHECK-X86_64:     ('n_sect', 2) +// CHECK-X86_64:     ('n_desc', 0) +// CHECK-X86_64:     ('n_value', 5) +// CHECK-X86_64:     ('_string', 'b') +// CHECK-X86_64:    ), +// CHECK-X86_64:     # Symbol 2 +// CHECK-X86_64:    (('n_strx', 13) +// CHECK-X86_64:     ('n_type', 0xe) +// CHECK-X86_64:     ('n_sect', 2) +// CHECK-X86_64:     ('n_desc', 0) +// CHECK-X86_64:     ('n_value', 9) +// CHECK-X86_64:     ('_string', 'c') +// CHECK-X86_64:    ), +// CHECK-X86_64:     # Symbol 3 +// CHECK-X86_64:    (('n_strx', 15) +// CHECK-X86_64:     ('n_type', 0xe) +// CHECK-X86_64:     ('n_sect', 2) +// CHECK-X86_64:     ('n_desc', 0) +// CHECK-X86_64:     ('n_value', 9) +// CHECK-X86_64:     ('_string', 'e') +// CHECK-X86_64:    ), +// CHECK-X86_64:     # Symbol 4 +// CHECK-X86_64:    (('n_strx', 17) +// CHECK-X86_64:     ('n_type', 0xe) +// CHECK-X86_64:     ('n_sect', 2) +// CHECK-X86_64:     ('n_desc', 0) +// CHECK-X86_64:     ('n_value', 13) +// CHECK-X86_64:     ('_string', 'g') +// CHECK-X86_64:    ), +// CHECK-X86_64:     # Symbol 5 +// CHECK-X86_64:    (('n_strx', 19) +// CHECK-X86_64:     ('n_type', 0xe) +// CHECK-X86_64:     ('n_sect', 2) +// CHECK-X86_64:     ('n_desc', 0) +// CHECK-X86_64:     ('n_value', 13) +// CHECK-X86_64:     ('_string', 'f') +// CHECK-X86_64:    ), +// CHECK-X86_64:     # Symbol 6 +// CHECK-X86_64:    (('n_strx', 21) +// CHECK-X86_64:     ('n_type', 0xe) +// CHECK-X86_64:     ('n_sect', 1) +// CHECK-X86_64:     ('n_desc', 0) +// CHECK-X86_64:     ('n_value', 0) +// CHECK-X86_64:     ('_string', 't0') +// CHECK-X86_64:    ), +// CHECK-X86_64:     # Symbol 7 +// CHECK-X86_64:    (('n_strx', 4) +// CHECK-X86_64:     ('n_type', 0x1) +// CHECK-X86_64:     ('n_sect', 0) +// CHECK-X86_64:     ('n_desc', 0) +// CHECK-X86_64:     ('n_value', 0) +// CHECK-X86_64:     ('_string', 'd') +// CHECK-X86_64:    ), +// CHECK-X86_64:     # Symbol 8 +// CHECK-X86_64:    (('n_strx', 1) +// CHECK-X86_64:     ('n_type', 0x1) +// CHECK-X86_64:     ('n_sect', 0) +// CHECK-X86_64:     ('n_desc', 0) +// CHECK-X86_64:     ('n_value', 0) +// CHECK-X86_64:     ('_string', 'd2') +// CHECK-X86_64:    ), +// CHECK-X86_64:     # Symbol 9 +// CHECK-X86_64:    (('n_strx', 6) +// CHECK-X86_64:     ('n_type', 0x1) +// CHECK-X86_64:     ('n_sect', 0) +// CHECK-X86_64:     ('n_desc', 0) +// CHECK-X86_64:     ('n_value', 0) +// CHECK-X86_64:     ('_string', 'd3') +// CHECK-X86_64:    ), +// CHECK-X86_64:   ]) +// CHECK-X86_64:  ), +// CHECK-X86_64:   # Load Command 2 +// CHECK-X86_64:  (('command', 11) +// CHECK-X86_64:   ('size', 80) +// CHECK-X86_64:   ('ilocalsym', 0) +// CHECK-X86_64:   ('nlocalsym', 7) +// CHECK-X86_64:   ('iextdefsym', 7) +// CHECK-X86_64:   ('nextdefsym', 0) +// CHECK-X86_64:   ('iundefsym', 7) +// CHECK-X86_64:   ('nundefsym', 3) +// CHECK-X86_64:   ('tocoff', 0) +// CHECK-X86_64:   ('ntoc', 0) +// CHECK-X86_64:   ('modtaboff', 0) +// CHECK-X86_64:   ('nmodtab', 0) +// CHECK-X86_64:   ('extrefsymoff', 0) +// CHECK-X86_64:   ('nextrefsyms', 0) +// CHECK-X86_64:   ('indirectsymoff', 0) +// CHECK-X86_64:   ('nindirectsyms', 0) +// CHECK-X86_64:   ('extreloff', 0) +// CHECK-X86_64:   ('nextrel', 0) +// CHECK-X86_64:   ('locreloff', 0) +// CHECK-X86_64:   ('nlocrel', 0) +// CHECK-X86_64:   ('_indirect_symbols', [ +// CHECK-X86_64:   ]) +// CHECK-X86_64:  ), +// CHECK-X86_64: ])  | 

