Module: Unarm

Extended by:
UnarmBind
Defined in:
lib/unarm/unarm.rb

Defined Under Namespace

Modules: CPU Classes: ArmIns, Data, Ins, Parser, RawSymbols, Symbol, Symbols, ThumbIns

Constant Summary

Constants included from UnarmBind

UnarmBind::ARGUMENT_KIND, UnarmBind::ARGUMENT_KIND_MAP, UnarmBind::Arg, UnarmBind::Args, UnarmBind::CONDITION, UnarmBind::CONDITION_MAP, UnarmBind::CO_REG, UnarmBind::CO_REG_MAP, UnarmBind::ENDIAN, UnarmBind::ENDIAN_MAP, UnarmBind::OPCODE, UnarmBind::OPCODE_MNEMONIC, UnarmBind::REGISTER, UnarmBind::REGISTER_MAP, UnarmBind::SHIFT, UnarmBind::SHIFT_MAP, UnarmBind::STATUS_REG, UnarmBind::STATUS_REG_MAP

Class Method Summary collapse

Class Method Details

.cpuObject



410
# File 'lib/unarm/unarm.rb', line 410

def self.cpu = @cpu

.get_raw_symbols(loc) ⇒ Object Also known as: get_raw_syms



595
596
597
598
599
600
# File 'lib/unarm/unarm.rb', line 595

def self.get_raw_symbols(loc)
  syms = loc == 'arm7' ? @symbols7 : @symbols9
  loc = 'arm9' if !syms.locs.has_key?(loc)
  locs = %w[arm7 arm9].include?(loc) ? [loc] : ['arm9', loc]
  @raw_syms[loc] ||= RawSymbols.new(Symbols.new(syms: syms, locs: locs))
end

.load_symbols7(file_path) ⇒ Object



581
582
583
# File 'lib/unarm/unarm.rb', line 581

def self.load_symbols7(file_path)
  @symbols7 = Symbols.new(file_path: file_path)
end

.load_symbols9(file_path) ⇒ Object



577
578
579
# File 'lib/unarm/unarm.rb', line 577

def self.load_symbols9(file_path)
  @symbols9 = Symbols.new(file_path: file_path)
end

.raw_symsObject



419
# File 'lib/unarm/unarm.rb', line 419

def self.raw_syms = @raw_syms

.shitty_demangle(sym) ⇒ Object



421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
# File 'lib/unarm/unarm.rb', line 421

def self.shitty_demangle(sym)
  return sym unless sym.start_with?('_Z')

  sym = sym[2..]

  is_vtable = false

  if sym.start_with? 'NK'
    sym = sym[2..]

  elsif sym.start_with? 'N'
    sym = sym[1..]

  elsif sym.start_with? 'TV'
    sym = sym[(sym[2] == 'N' ? 3 : 2)..]
    is_vtable = true

  end

  names = []
  loop do
    break if sym.nil? || sym.empty? || !sym[0].match?(/\d/)
    len_end = sym.index(/\D/)
    n_len   = Integer(sym[...len_end], exception: false)
    n       = sym[len_end, n_len]
    names   << n
    sym     = sym[len_end + n_len..]
  end

  unless sym.nil?
    if sym.start_with? 'nw'
      names << 'new'

    elsif sym.start_with? 'na'
      names << 'new[]'

    elsif sym.start_with? 'dl'
      names << 'delete'

    elsif sym.start_with? 'da'
      names << 'delete[]'

    elsif sym.start_with? 'eq'
      names << '=='

    elsif sym.start_with? 'ne'
      names << '!='

    elsif sym.match? /[DC]\d/
      names << sym[..1]
    end
  end

  names.join('::') + (is_vtable ? '::vtable' : '')
end

.symbol_mapObject Also known as: sym_map



585
586
587
588
589
590
591
592
593
# File 'lib/unarm/unarm.rb', line 585

def self.symbol_map
  if @cpu == CPU::ARM9
    raise 'Symbols9 not loaded' if !@symbols9
    @symbols9.map
  else
    raise 'Symbols7 not loaded' if !@symbols7
    @symbols7.map
  end
end

.symbolsObject



415
416
417
# File 'lib/unarm/unarm.rb', line 415

def self.symbols
  @cpu == CPU::ARM9 ? symbols9 : symbols7
end

.symbols7Object



413
# File 'lib/unarm/unarm.rb', line 413

def self.symbols7 = @symbols7

.symbols9Object



412
# File 'lib/unarm/unarm.rb', line 412

def self.symbols9 = @symbols9

.use_arm7Object



406
407
408
# File 'lib/unarm/unarm.rb', line 406

def self.use_arm7
  @cpu = CPU::ARM7
end

.use_arm9Object



402
403
404
# File 'lib/unarm/unarm.rb', line 402

def self.use_arm9
  @cpu = CPU::ARM9
end