[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