[llvm-commits] [llvm] r100265 - in /llvm/trunk/lib/Target/ARM/Disassembler: ARMDisassemblerCore.cpp ARMDisassemblerCore.h

Johnny Chen johnny.chen at apple.com
Fri Apr 2 22:09:26 PDT 2010


I have a git directory where I use GitX to browse the checkins:

[21:54:11] johnny:/Volumes/data/llvm/git/trunk (local-trunk) $ nm Debug/bin/llvm-mc | grep LLVMInitializeARM
000000010012af58 t _LLVMInitializeARMAsmParser
000000010012f530 t _LLVMInitializeARMAsmPrinter
00000001001b202d t _LLVMInitializeARMTarget
00000001001c029d t _LLVMInitializeARMTargetInfo
0000000100009849 t __GLOBAL__I_LLVMInitializeARMAsmPrinter
[21:58:34] johnny:/Volumes/data/llvm/git/trunk (local-trunk) $ 

And I also have a svn directory for my development:

[21:51:38] johnny:/Volumes/data/llvm/svn/commit $ nm ./Release/bin/llvm-mc | grep LLVMInitializeARM
000000010016d8b0 t _LLVMInitializeARMAsmParser
0000000100170330 t _LLVMInitializeARMAsmPrinter
0000000100158df0 t _LLVMInitializeARMDisassembler
0000000100203250 t _LLVMInitializeARMTarget
0000000100214180 t _LLVMInitializeARMTargetInfo
0000000100012fe0 t __GLOBAL__I_LLVMInitializeARMAsmPrinter
[21:58:25] johnny:/Volumes/data/llvm/svn/commit $ 

As you can see, the git dir's llvm-mc is missing the arm disassembler stuff.
The relevant definition LLVMInitializeARMDisassembler is in the git dir's ./Debug/lib/libLLVMARMDisassembler.a;
however, I have a hard time figuring out why it is not in the git dir's llvm-mc executable.  Any pointer?

Thanks.

On Apr 2, 2010, at 9:52 PM, Chris Lattner wrote:

> On Apr 2, 2010, at 9:10 PM, Johnny Chen wrote:
>> Author: johnny
>> Date: Fri Apr  2 23:10:56 2010
>> New Revision: 100265
>> 
>> URL: http://llvm.org/viewvc/llvm-project?rev=100265&view=rev
>> Log:
>> Get rid of the middleman (ARMAlgorithm), which causes more trouble than the
>> abstraction it brings.  And also get rid of the atexit() handler, it does not
>> belong in the lib directory. :-)
> 
> Awesome, thanks Johnny!
> 
> -Chris
> 
>> 
>> Modified:
>>   llvm/trunk/lib/Target/ARM/Disassembler/ARMDisassemblerCore.cpp
>>   llvm/trunk/lib/Target/ARM/Disassembler/ARMDisassemblerCore.h
>> 
>> Modified: llvm/trunk/lib/Target/ARM/Disassembler/ARMDisassemblerCore.cpp
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/Disassembler/ARMDisassemblerCore.cpp?rev=100265&r1=100264&r2=100265&view=diff
>> ==============================================================================
>> --- llvm/trunk/lib/Target/ARM/Disassembler/ARMDisassemblerCore.cpp (original)
>> +++ llvm/trunk/lib/Target/ARM/Disassembler/ARMDisassemblerCore.cpp Fri Apr  2 23:10:56 2010
>> @@ -8,8 +8,8 @@
>> //===----------------------------------------------------------------------===//
>> //
>> // This file is part of the ARM Disassembler.
>> -// It contains code to represent the core concepts of Builder, Builder Factory,
>> -// as well as the Algorithm to solve the problem of disassembling an ARM instr.
>> +// It contains code to represent the core concepts of Builder and DisassembleFP
>> +// to solve the problem of disassembling an ARM instr.
>> //
>> //===----------------------------------------------------------------------===//
>> 
>> @@ -3127,40 +3127,12 @@
>>  NULL
>> };
>> 
>> -/// Algorithms - Algorithms stores a map from Format to ARMAlgorithm*.
>> -static std::vector<ARMAlgorithm*> Algorithms;
>> -
>> -/// DoCleanup - Do cleanup of Algorithms upon exit.
>> -void ARMAlgorithm::DoCleanup() {
>> -  for (unsigned i = 0; i < array_lengthof(FuncPtrs); ++i)
>> -    if (Algorithms[i])
>> -      delete Algorithms[i];
>> -}
>> -
>> -/// GetInstance - GetInstance returns an instance of ARMAlgorithm given the
>> -/// encoding Format.  API clients should not free up the returned instance.
>> -ARMAlgorithm *ARMAlgorithm::GetInstance(ARMFormat Format) {
>> -  /// Init the first time.
>> -  if (Algorithms.size() == 0) {
>> -    Algorithms.resize(array_lengthof(FuncPtrs));
>> -    for (unsigned i = 0, num = array_lengthof(FuncPtrs); i < num; ++i)
>> -      if (FuncPtrs[i])
>> -        Algorithms[i] = new ARMAlgorithm(FuncPtrs[i]);
>> -      else
>> -        Algorithms[i] = NULL;
>> -
>> -    // Register cleanup routine.
>> -    atexit(DoCleanup);
>> -  }
>> -  return Algorithms[Format];
>> -}
>> -
>> /// BuildIt - BuildIt performs the build step for this ARM Basic MC Builder.
>> /// The general idea is to set the Opcode for the MCInst, followed by adding
>> /// the appropriate MCOperands to the MCInst.  ARM Basic MC Builder delegates
>> -/// to the Algo (ARM Disassemble Algorithm) object to perform Format-specific
>> -/// disassembly, followed by TryPredicateAndSBitModifier() to do
>> -/// PredicateOperand and OptionalDefOperand which follow the Dst/Src Operands.
>> +/// to the Format-specific disassemble function for disassembly, followed by
>> +/// TryPredicateAndSBitModifier() to do PredicateOperand and OptionalDefOperand
>> +/// which follow the Dst/Src Operands.
>> bool ARMBasicMCBuilder::BuildIt(MCInst &MI, uint32_t insn) {
>>  // Stage 1 sets the Opcode.
>>  MI.setOpcode(Opcode);
>> @@ -3168,9 +3140,12 @@
>>  if (NumOps == 0)
>>    return true;
>> 
>> -  // Stage 2 calls the ARM Disassembly Algorithm to build the operand list.
>> +  // Stage 2 calls the format-specific disassemble function to build the operand
>> +  // list.
>> +  if (Disasm == NULL)
>> +    return false;
>>  unsigned NumOpsAdded = 0;
>> -  bool OK = Algo.Solve(MI, Opcode, insn, NumOps, NumOpsAdded, this);
>> +  bool OK = (*Disasm)(MI, Opcode, insn, NumOps, NumOpsAdded, this);
>> 
>>  if (!OK) return false;
>>  if (NumOpsAdded >= NumOps)
>> @@ -3256,6 +3231,15 @@
>>  return Status;
>> }
>> 
>> +/// Opcode, Format, and NumOperands make up an ARM Basic MCBuilder.
>> +ARMBasicMCBuilder::ARMBasicMCBuilder(unsigned opc, ARMFormat format,
>> +                                     unsigned short num)
>> +  : Opcode(opc), Format(format), NumOps(num), SP(0) {
>> +  unsigned Idx = (unsigned)format;
>> +  assert(Idx < (array_lengthof(FuncPtrs) - 1) && "Unknown format");
>> +  Disasm = FuncPtrs[Idx];
>> +}
>> +
>> /// CreateMCBuilder - Return an ARMBasicMCBuilder that can build up the MC
>> /// infrastructure of an MCInst given the Opcode and Format of the instr.
>> /// Return NULL if it fails to create/return a proper builder.  API clients
>> @@ -3263,10 +3247,6 @@
>> /// performed by the API clients to improve performance.
>> ARMBasicMCBuilder *llvm::CreateMCBuilder(unsigned Opcode, ARMFormat Format) {
>> 
>> -  ARMAlgorithm *Algo = ARMAlgorithm::GetInstance(Format);
>> -  if (!Algo)
>> -    return NULL;
>> -
>>  return new ARMBasicMCBuilder(Opcode, Format,
>> -                               ARMInsts[Opcode].getNumOperands(), *Algo);
>> +                               ARMInsts[Opcode].getNumOperands());
>> }
>> 
>> Modified: llvm/trunk/lib/Target/ARM/Disassembler/ARMDisassemblerCore.h
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/Disassembler/ARMDisassemblerCore.h?rev=100265&r1=100264&r2=100265&view=diff
>> ==============================================================================
>> --- llvm/trunk/lib/Target/ARM/Disassembler/ARMDisassemblerCore.h (original)
>> +++ llvm/trunk/lib/Target/ARM/Disassembler/ARMDisassemblerCore.h Fri Apr  2 23:10:56 2010
>> @@ -13,8 +13,8 @@
>> // specifies the encoding used by the instruction, as well as a helper function
>> // to convert the enums to printable char strings.
>> //
>> -// It also contains code to represent the concepts of Builder, Builder Factory,
>> -// as well as the Algorithm to solve the problem of disassembling an ARM instr.
>> +// It also contains code to represent the concepts of Builder and DisassembleFP
>> +// to solve the problem of disassembling an ARM instr.
>> //
>> //===----------------------------------------------------------------------===//
>> 
>> @@ -171,60 +171,23 @@
>> typedef bool (*DisassembleFP)(MCInst &MI, unsigned Opcode, uint32_t insn,
>>    unsigned short NumOps, unsigned &NumOpsAdded, BO Builder);
>> 
>> -/// ARMAlgorithm - ARMAlgorithm implements the ARM/Thumb disassembly by solving
>> -/// the problem of building the MCOperands of an MCInst.  Construction of
>> -/// ARMAlgorithm requires passing in a function pointer with the DisassembleFP
>> -/// data type.
>> -class ARMAlgorithm {
>> -public:
>> -  /// GetInstance - GetInstance returns an instance of ARMAlgorithm given the
>> -  /// encoding Format.  API clients should not free up the returned instance.
>> -  static ARMAlgorithm *GetInstance(ARMFormat Format);
>> -
>> -  /// DoCleanup - DoCleanup is meant to be called upon exit as an exit handler.
>> -  static void DoCleanup();
>> -
>> -  /// Return true if this algorithm successfully disassembles the instruction.
>> -  /// NumOpsAdded is updated to reflect the number of operands added by the
>> -  /// algorithm.  NumOpsAdded may be less than NumOps, in which case, there are
>> -  /// operands unaccounted for which need to be dealt with by the API client.
>> -  bool Solve(MCInst &MI, unsigned Opcode, uint32_t insn, unsigned short NumOps,
>> -      unsigned &NumOpsAdded, BO Builder) const {
>> -    if (Disassemble == NULL)
>> -      return false;
>> -
>> -    return (*Disassemble)(MI, Opcode, insn, NumOps, NumOpsAdded, Builder);
>> -  }
>> -
>> -private:
>> -  ARMAlgorithm(DisassembleFP fp) : Disassemble(fp) {}
>> -  ARMAlgorithm(ARMAlgorithm &AA) : Disassemble(AA.Disassemble) {}
>> -
>> -  virtual ~ARMAlgorithm() {}
>> -
>> -  DisassembleFP Disassemble;
>> -};
>> -
>> /// ARMBasicMCBuilder - ARMBasicMCBuilder represents an ARM MCInst builder that
>> /// knows how to build up the MCOperand list.
>> class ARMBasicMCBuilder {
>>  unsigned Opcode;
>>  ARMFormat Format;
>>  unsigned short NumOps;
>> -  const ARMAlgorithm &Algo;
>> +  DisassembleFP Disasm;
>>  Session *SP;
>> 
>> public:
>>  ARMBasicMCBuilder(ARMBasicMCBuilder &B)
>> -    : Opcode(B.Opcode), Format(B.Format), NumOps(B.NumOps), Algo(B.Algo),
>> +    : Opcode(B.Opcode), Format(B.Format), NumOps(B.NumOps), Disasm(B.Disasm),
>>      SP(B.SP)
>>  {}
>> 
>> -  /// Opcode, Format, NumOperands, and Algo make an ARM Basic MCBuilder.
>> -  ARMBasicMCBuilder(unsigned opc, ARMFormat format, unsigned short num,
>> -                    const ARMAlgorithm &algo)
>> -    : Opcode(opc), Format(format), NumOps(num), Algo(algo), SP(0)
>> -  {}
>> +  /// Opcode, Format, and NumOperands make up an ARM Basic MCBuilder.
>> +  ARMBasicMCBuilder(unsigned opc, ARMFormat format, unsigned short num);
>> 
>>  virtual ~ARMBasicMCBuilder() {}
>> 
>> @@ -256,9 +219,9 @@
>>  /// BuildIt - BuildIt performs the build step for this ARM Basic MC Builder.
>>  /// The general idea is to set the Opcode for the MCInst, followed by adding
>>  /// the appropriate MCOperands to the MCInst.  ARM Basic MC Builder delegates
>> -  /// to the Algo (ARM Disassemble Algorithm) object to perform Format-specific
>> -  /// disassembly, followed by class method TryPredicateAndSBitModifier() to do
>> -  /// PredicateOperand and OptionalDefOperand which follow the Dst/Src Operands.
>> +  /// to the Format-specific disassemble function for disassembly, followed by
>> +  /// TryPredicateAndSBitModifier() for PredicateOperand and OptionalDefOperand
>> +  /// which follow the Dst/Src Operands.
>>  virtual bool BuildIt(MCInst &MI, uint32_t insn);
>> 
>>  /// RunBuildAfterHook - RunBuildAfterHook performs operations deemed necessary
>> 
>> 
>> _______________________________________________
>> llvm-commits mailing list
>> llvm-commits at cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
> 





More information about the llvm-commits mailing list