[llvm-commits] PATCH: add new test tool: obj2yaml
Marshall Clow
mclow.lists at gmail.com
Mon Jun 18 15:51:49 PDT 2012
On Jun 12, 2012, at 1:40 PM, Michael Spencer wrote:
> On Tue, Jun 12, 2012 at 8:35 AM, Marshall Clow <mclow.lists at gmail.com> wrote:
>> On Jun 9, 2012, at 2:44 AM, Michael Spencer wrote:
>>
>>> On Fri, Jun 8, 2012 at 11:09 AM, Marshall Clow <mclow.lists at gmail.com> wrote:
>>>> [ resending to llvm-commits instead of -dev ]
>>>>
>>>> This patch adds a tool called 'obj2yaml', which takes an object file, and produces a YAML representation of the file.
>>>> This is a companion tool to Michael Spencer's proposed "yaml2obj" tool.
>>>>
>>>> This tool processes only COFF files; the plan is to enhance it to handle other object formats, as well as object archives.
>>>> The primary uses for this tool is expected to be:
>>>> 1) Debugging object files that are produced by llvm and lld.
>>>> 2) Automated testing suites.
>>>>
>>>> The goal is to have obj2yaml and yaml2obj be inverse operations, so that one can test either by using the other.
>>>> So, both obj -> yaml -> obj and yaml -> obj -> yaml are expected to be idempotent.
>>>>
>>>> -- Marshall
>>>>
>>>> Marshall Clow Idio Software <mailto:mclow.lists at gmail.com>
>>>>
>>>> A.D. 1517: Martin Luther nails his 95 Theses to the church door and is promptly moderated down to (-1, Flamebait).
>>>> -- Yu Suzuki
>>>
>>> The design looks good, however there are quite a few LLVM style issues.
>>
>> Extensively reworked. Now uses the facilities in llvm/Object/COFF.h for byte-sex awareness.
>> Still a few 80 column issues, and the relocation dumping is not done - but since yaml2obj doesn't build relocation entries yet, this may be moot. ;-)
>>
>> -- Marshall
>>
>> Marshall Clow Idio Software <mailto:mclow.lists at gmail.com>
>>
>> A.D. 1517: Martin Luther nails his 95 Theses to the church door and is promptly moderated down to (-1, Flamebait).
>> -- Yu Suzuki
>
> The overall structure looks good now, but there are still quite a few style
> issues other than 80-col.
[ Major snippage ]
>
> Index: utils/obj2yaml/obj2yaml.cpp
>
> +#include <iostream>
>
> iostream is only used in two places. Those should be replaced with llvm::errs()
> and this header removed.
Done.
> +// Some useful stuff that's not in Support/COFF.h
> +namespace llvm { namespace COFF {
>
> These should be on separate lines.
>
> +enum {
> + OptionalHeaderSize = 28
> +};
>
> This should be added to Support/COFF.h.
All removed.
> +void makeMaps () {
> + assert(!MapsMade);
> +// I'd rather that these were static_assert
> + assert(sizeof(header) == HeaderSize);
> + assert(sizeof(section) == SectionSize);
> +// Using clang on MacOS, these are not true
> +// assert(sizeof(symbol) == SymbolSize);
> +// assert(sizeof(relocation) == RelocationSize);
>
> These sizeof asserts can all be removed now, as they are unused.
>
> +
> + MachineTypeNames = buildMap(MachineTypePairs);
> + SectionCharacteristicNamesAlignment =
> buildMap(SectionCharacteristicsPairsAlignment);
> + SymbolBaseTypeNames = buildMap(SymbolBaseTypePairs);
> + SymbolComplexTypeNames = buildMap(SymbolComplexTypePairs);
> + SymbolStorageClassNames = buildMap(SymbolStorageClassPairs);
> + MapsMade = true;
> +}
> +
> +
> +}}
>
> This namespace is long enough that these should be separate and have
> // end namespace x
>
All gone.
> + for (llvm::ArrayRef<uint8_t>::const_iterator iter = arr.begin ();
> + iter != arr.end (); ++iter)
>
> arr.end should not be evaluated each time through the loop.
I disagree. Here's the implementation of ArrayRef.end ():
iterator end() const { return Data + Length; }
That will be inlined, and since the ArrayRef is const, the pointer arithmetic will be hoisted out of the loop.
> +llvm::raw_ostream &writeName(llvm::raw_ostream &Out,
> + const char *Name, std::size_t NameSize) {
>
> This isn't needed. You should just always use the StringRef version.
>
> + for (std::size_t i = 0; i < NameSize; ++i) {
> + if (!Name[i]) break;
> + Out << Name[i];
> + }
> + return Out;
The way that I read the spec, a COFF name is a series of characters, either null terminated, or "NameSize" bytes long.
This routine handles both cases.
>
> +}
> +
> +llvm::raw_ostream &writeName(llvm::raw_ostream &Out, llvm::StringRef name) {
> + for ( llvm::StringRef::const_iterator iter = name.begin ();
> + iter != name.end (); ++iter )
> + Out << *iter;
>
> This loop isn't needed. Out << name; works.
>
> + return Out;
> +}
Does llvm::raw_ostream know about StringRefs? Cool.
writeName has been removed.
>
> +/*
> + if (sect->NumberOfRelocations > 0) {
> + Out << " Relocations: " << endl;
> + for (std::size_t i = 0; i < sect->NumberOfRelocations; ++i) {
> + const coff_relocation *p ; // FIXME!
> + Out << " - !Relocation" << endl;
> + Out << " VirtualAddress: " ;
> + yaml::writeHexNumber(p->VirtualAddress) << endl;
> + Out << " SymbolTableIndex: " << p->SymbolTableIndex << endl;
> + Out << " Type: " << endl;
> + Out << endl;
> + }
> +*/
>
> Just remove the code instead of commenting it out. Leave a FIXME for adding
> relocation dumping.
I implemented it instead.
>
> +// TODO: If this is an archive, then burst it and dump each entry
> + if (error_code ec = MemoryBuffer::getFileOrSTDIN(InputFilename, buf))
> + std::cerr << "Error " << ec << " opening file '" << InputFilename
> << "' for reading" << endl;
>
> llvm::errs().
Done
> Index: utils/obj2yaml/CMakeLists.txt
> ===================================================================
> --- utils/obj2yaml/CMakeLists.txt (revision 0)
> +++ utils/obj2yaml/CMakeLists.txt (revision 0)
> @@ -0,0 +1,7 @@
> +set(LLVM_LINK_COMPONENTS archive object)
>
> You don't actually need to link to archive here. That's the "old"
> archive library.
OK.
> Index: utils/obj2yaml/Makefile
> ===================================================================
> --- utils/obj2yaml/Makefile (revision 0)
> +++ utils/obj2yaml/Makefile (revision 0)
> @@ -0,0 +1,20 @@
> +##===- utils/obj2yaml/Makefile ----------------------------*- Makefile -*-===##
> +#
> +# The LLVM Compiler Infrastructure
> +#
> +# This file is distributed under the University of Illinois Open Source
> +# License. See LICENSE.TXT for details.
> +#
> +##===----------------------------------------------------------------------===##
> +
> +LEVEL = ../..
> +TOOLNAME = obj2yaml
> +USEDLIBS = LLVMSupport.a
>
> This should be
>
> LINK_COMPONENTS := object
>
> Instead. As it is in llvm-nm.
OK.
> There are still lots of cases where you have extra spaces around ( and ).
I think I got all of them.
-- Marshall
Marshall Clow Idio Software <mailto:mclow.lists at gmail.com>
A.D. 1517: Martin Luther nails his 95 Theses to the church door and is promptly moderated down to (-1, Flamebait).
-- Yu Suzuki
-------------- next part --------------
A non-text attachment was scrubbed...
Name: obj2yaml-3.patch
Type: application/octet-stream
Size: 19489 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20120618/e8b12932/attachment.obj>
More information about the llvm-commits
mailing list