From 1635f8de72bf0f3d30b8ebce679ca2bf2538daf4 Mon Sep 17 00:00:00 2001 From: Shankar Easwaran Date: Mon, 20 Oct 2014 04:00:26 +0000 Subject: [PATCH] [ELF] Check for target architecture. The canParse function for all the ELF subtargets check if the input files match the subtarget. There were few mismatches in the input files that didnt match the subtarget for which the link was being invoked, which also acts as a test for this change. llvm-svn: 220182 --- .../ReaderWriter/ELF/AArch64/AArch64ELFReader.h | 24 +++++++++ .../ELF/AArch64/AArch64TargetHandler.h | 1 - .../ReaderWriter/ELF/Hexagon/HexagonELFReader.h | 24 +++++++++ .../ELF/Hexagon/HexagonTargetHandler.h | 1 - lld/lib/ReaderWriter/ELF/Mips/MipsELFReader.h | 13 +++++ lld/lib/ReaderWriter/ELF/PPC/PPCELFFile.h | 2 +- lld/lib/ReaderWriter/ELF/PPC/PPCELFReader.h | 59 ++++++++++++++------- lld/lib/ReaderWriter/ELF/PPC/PPCTargetHandler.h | 10 +++- lld/lib/ReaderWriter/ELF/X86/X86ELFReader.h | 22 ++++++++ lld/lib/ReaderWriter/ELF/X86/X86TargetHandler.h | 1 - lld/lib/ReaderWriter/ELF/X86_64/X86_64ELFReader.h | 24 +++++++++ .../ReaderWriter/ELF/X86_64/X86_64TargetHandler.h | 1 - lld/test/elf/X86_64/Inputs/constint.o | Bin 734 -> 1062 bytes lld/test/elf/X86_64/Inputs/no-interp-section.o | Bin 679 -> 975 bytes lld/test/elf/X86_64/Inputs/note_ro_rw.o | Bin 629 -> 905 bytes lld/test/elf/X86_64/Inputs/rwint.o | Bin 667 -> 963 bytes lld/test/elf/abs.test | 2 +- 17 files changed, 158 insertions(+), 26 deletions(-) diff --git a/lld/lib/ReaderWriter/ELF/AArch64/AArch64ELFReader.h b/lld/lib/ReaderWriter/ELF/AArch64/AArch64ELFReader.h index 4f0a3b7..b42603a 100644 --- a/lld/lib/ReaderWriter/ELF/AArch64/AArch64ELFReader.h +++ b/lld/lib/ReaderWriter/ELF/AArch64/AArch64ELFReader.h @@ -16,6 +16,8 @@ namespace lld { namespace elf { +typedef llvm::object::ELFType AArch64ELFType; + struct AArch64DynamicFileCreateELFTraits { typedef llvm::ErrorOr> result_type; @@ -43,6 +45,17 @@ public: AArch64ELFObjectReader(bool atomizeStrings) : ELFObjectReader(atomizeStrings) {} + bool canParse(file_magic magic, StringRef ext, + const MemoryBuffer &buf) const override { + const uint8_t *data = + reinterpret_cast(buf.getBuffer().data()); + const llvm::object::Elf_Ehdr_Impl *elfHeader = + reinterpret_cast *>( + data); + return ELFObjectReader::canParse(magic, ext, buf) && + elfHeader->e_machine == llvm::ELF::EM_AARCH64; + } + std::error_code parseFile(std::unique_ptr &mb, const class Registry &, std::vector> &result) const override { @@ -62,6 +75,17 @@ class AArch64ELFDSOReader : public ELFDSOReader { public: AArch64ELFDSOReader(bool useUndefines) : ELFDSOReader(useUndefines) {} + bool canParse(file_magic magic, StringRef ext, + const MemoryBuffer &buf) const override { + const uint8_t *data = + reinterpret_cast(buf.getBuffer().data()); + const llvm::object::Elf_Ehdr_Impl *elfHeader = + reinterpret_cast *>( + data); + return ELFDSOReader::canParse(magic, ext, buf) && + elfHeader->e_machine == llvm::ELF::EM_AARCH64; + } + std::error_code parseFile(std::unique_ptr &mb, const class Registry &, std::vector> &result) const override { diff --git a/lld/lib/ReaderWriter/ELF/AArch64/AArch64TargetHandler.h b/lld/lib/ReaderWriter/ELF/AArch64/AArch64TargetHandler.h index 980486f..85afefb 100644 --- a/lld/lib/ReaderWriter/ELF/AArch64/AArch64TargetHandler.h +++ b/lld/lib/ReaderWriter/ELF/AArch64/AArch64TargetHandler.h @@ -19,7 +19,6 @@ namespace lld { namespace elf { -typedef llvm::object::ELFType AArch64ELFType; class AArch64LinkingContext; template class AArch64TargetLayout : public TargetLayout { diff --git a/lld/lib/ReaderWriter/ELF/Hexagon/HexagonELFReader.h b/lld/lib/ReaderWriter/ELF/Hexagon/HexagonELFReader.h index 1a69eb3..32eeceb 100644 --- a/lld/lib/ReaderWriter/ELF/Hexagon/HexagonELFReader.h +++ b/lld/lib/ReaderWriter/ELF/Hexagon/HexagonELFReader.h @@ -16,6 +16,8 @@ namespace lld { namespace elf { +typedef llvm::object::ELFType HexagonELFType; + struct HexagonDynamicFileCreateELFTraits { typedef llvm::ErrorOr> result_type; @@ -43,6 +45,17 @@ public: HexagonELFObjectReader(bool atomizeStrings) : ELFObjectReader(atomizeStrings) {} + bool canParse(file_magic magic, StringRef ext, + const MemoryBuffer &buf) const override { + const uint8_t *data = + reinterpret_cast(buf.getBuffer().data()); + const llvm::object::Elf_Ehdr_Impl *elfHeader = + reinterpret_cast *>( + data); + return ELFObjectReader::canParse(magic, ext, buf) && + elfHeader->e_machine == llvm::ELF::EM_HEXAGON; + } + std::error_code parseFile(std::unique_ptr &mb, const class Registry &, std::vector> &result) const override { @@ -62,6 +75,17 @@ class HexagonELFDSOReader : public ELFDSOReader { public: HexagonELFDSOReader(bool useUndefines) : ELFDSOReader(useUndefines) {} + bool canParse(file_magic magic, StringRef ext, + const MemoryBuffer &buf) const override { + const uint8_t *data = + reinterpret_cast(buf.getBuffer().data()); + const llvm::object::Elf_Ehdr_Impl *elfHeader = + reinterpret_cast *>( + data); + return ELFDSOReader::canParse(magic, ext, buf) && + elfHeader->e_machine == llvm::ELF::EM_HEXAGON; + } + std::error_code parseFile(std::unique_ptr &mb, const class Registry &, std::vector> &result) const override { diff --git a/lld/lib/ReaderWriter/ELF/Hexagon/HexagonTargetHandler.h b/lld/lib/ReaderWriter/ELF/Hexagon/HexagonTargetHandler.h index 16d856d..eb3b463 100644 --- a/lld/lib/ReaderWriter/ELF/Hexagon/HexagonTargetHandler.h +++ b/lld/lib/ReaderWriter/ELF/Hexagon/HexagonTargetHandler.h @@ -19,7 +19,6 @@ namespace lld { namespace elf { -typedef llvm::object::ELFType HexagonELFType; class HexagonLinkingContext; /// \brief TargetLayout for Hexagon diff --git a/lld/lib/ReaderWriter/ELF/Mips/MipsELFReader.h b/lld/lib/ReaderWriter/ELF/Mips/MipsELFReader.h index d40d362..cf22e3f 100644 --- a/lld/lib/ReaderWriter/ELF/Mips/MipsELFReader.h +++ b/lld/lib/ReaderWriter/ELF/Mips/MipsELFReader.h @@ -15,6 +15,8 @@ namespace lld { namespace elf { +typedef llvm::object::ELFType Mips32ElELFType; + struct MipsELFFileCreateTraits { typedef llvm::ErrorOr> result_type; @@ -29,6 +31,17 @@ class MipsELFObjectReader : public ELFObjectReader { public: MipsELFObjectReader(bool atomizeStrings) : ELFObjectReader(atomizeStrings) {} + bool canParse(file_magic magic, StringRef ext, + const MemoryBuffer &buf) const override { + const uint8_t *data = + reinterpret_cast(buf.getBuffer().data()); + const llvm::object::Elf_Ehdr_Impl *elfHeader = + reinterpret_cast *>( + data); + return ELFObjectReader::canParse(magic, ext, buf) && + elfHeader->e_machine == llvm::ELF::EM_MIPS; + } + std::error_code parseFile(std::unique_ptr &mb, const class Registry &, std::vector> &result) const override { diff --git a/lld/lib/ReaderWriter/ELF/PPC/PPCELFFile.h b/lld/lib/ReaderWriter/ELF/PPC/PPCELFFile.h index 15ccb81..dd97b9a 100644 --- a/lld/lib/ReaderWriter/ELF/PPC/PPCELFFile.h +++ b/lld/lib/ReaderWriter/ELF/PPC/PPCELFFile.h @@ -22,7 +22,7 @@ public: PPCELFFile(StringRef name) : ELFFile(name) {} PPCELFFile(std::unique_ptr mb, bool atomizeStrings, - TargetHandlerBase *handler, error_code &ec) + TargetHandlerBase *handler, std::error_code &ec) : ELFFile(std::move(mb), atomizeStrings, handler, ec) {} }; diff --git a/lld/lib/ReaderWriter/ELF/PPC/PPCELFReader.h b/lld/lib/ReaderWriter/ELF/PPC/PPCELFReader.h index 159b6da..a9b19ea 100644 --- a/lld/lib/ReaderWriter/ELF/PPC/PPCELFReader.h +++ b/lld/lib/ReaderWriter/ELF/PPC/PPCELFReader.h @@ -1,4 +1,4 @@ -//===- lib/ReaderWriter/ELF/PPCELFReader.h ------------------------------===// +//===- lib/ReaderWriter/ELF/PPC/PPCELFReader.h ----------------------------===// // // The LLVM Linker // @@ -7,8 +7,8 @@ // //===----------------------------------------------------------------------===// -#ifndef LLD_READER_WRITER_PPC_ELF_READER_H -#define LLD_READER_WRITER_PPC_ELF_READER_H +#ifndef LLD_READER_WRITER_PPC_PPC_ELF_READER_H +#define LLD_READER_WRITER_PPC_PPC_ELF_READER_H #include "ELFReader.h" #include "PPCELFFile.h" @@ -16,6 +16,8 @@ namespace lld { namespace elf { +typedef llvm::object::ELFType PPCELFType; + struct PPCDynamicFileCreateELFTraits { typedef llvm::ErrorOr> result_type; @@ -40,19 +42,28 @@ class PPCELFObjectReader : public ELFObjectReader { public: PPCELFObjectReader(bool atomizeStrings) : ELFObjectReader(atomizeStrings) {} - virtual error_code + bool canParse(file_magic magic, StringRef ext, + const MemoryBuffer &buf) const override { + const uint8_t *data = + reinterpret_cast(buf.getBuffer().data()); + const llvm::object::Elf_Ehdr_Impl *elfHeader = + reinterpret_cast *>(data); + return ELFObjectReader::canParse(magic, ext, buf) && + elfHeader->e_machine == llvm::ELF::EM_PPC; + } + + std::error_code parseFile(std::unique_ptr &mb, const class Registry &, - std::vector> &result) const { - error_code ec; + std::vector> &result) const override { std::size_t maxAlignment = 1ULL << llvm::countTrailingZeros(uintptr_t(mb->getBufferStart())); auto f = createELF( - llvm::object::getElfArchType(&*mb), maxAlignment, std::move(mb), - _atomizeStrings); - if (!f) - return f; + llvm::object::getElfArchType(mb->getBuffer()), maxAlignment, + std::move(mb), _atomizeStrings); + if (std::error_code ec = f.getError()) + return ec; result.push_back(std::move(*f)); - return error_code(); + return std::error_code(); } }; @@ -60,22 +71,32 @@ class PPCELFDSOReader : public ELFDSOReader { public: PPCELFDSOReader(bool useUndefines) : ELFDSOReader(useUndefines) {} - virtual error_code + bool canParse(file_magic magic, StringRef ext, + const MemoryBuffer &buf) const override { + const uint8_t *data = + reinterpret_cast(buf.getBuffer().data()); + const llvm::object::Elf_Ehdr_Impl *elfHeader = + reinterpret_cast *>(data); + return ELFDSOReader::canParse(magic, ext, buf) && + elfHeader->e_machine == llvm::ELF::EM_PPC; + } + + std::error_code parseFile(std::unique_ptr &mb, const class Registry &, - std::vector> &result) const { + std::vector> &result) const override { std::size_t maxAlignment = 1ULL << llvm::countTrailingZeros(uintptr_t(mb->getBufferStart())); auto f = createELF( - llvm::object::getElfArchType(&*mb), maxAlignment, std::move(mb), - _useUndefines); - if (!f) - return f; + llvm::object::getElfArchType(mb->getBuffer()), maxAlignment, + std::move(mb), _useUndefines); + if (std::error_code ec = f.getError()) + return ec; result.push_back(std::move(*f)); - return error_code(); + return std::error_code(); } }; } // namespace elf } // namespace lld -#endif // LLD_READER_WRITER_ELF_READER_H +#endif // LLD_READER_WRITER_PPC_PPC_ELF_READER_H diff --git a/lld/lib/ReaderWriter/ELF/PPC/PPCTargetHandler.h b/lld/lib/ReaderWriter/ELF/PPC/PPCTargetHandler.h index 4c8b8c5..e211645 100644 --- a/lld/lib/ReaderWriter/ELF/PPC/PPCTargetHandler.h +++ b/lld/lib/ReaderWriter/ELF/PPC/PPCTargetHandler.h @@ -12,10 +12,10 @@ #include "DefaultTargetHandler.h" #include "TargetLayout.h" +#include "PPCELFReader.h" namespace lld { namespace elf { -typedef llvm::object::ELFType PPCELFType; class PPCLinkingContext; template class PPCTargetLayout : public TargetLayout { @@ -54,6 +54,14 @@ public: return *(_ppcRelocationHandler.get()); } + std::unique_ptr getObjReader(bool atomizeStrings) override { + return std::unique_ptr(new PPCELFObjectReader(atomizeStrings)); + } + + std::unique_ptr getDSOReader(bool useShlibUndefines) override { + return std::unique_ptr(new PPCELFDSOReader(useShlibUndefines)); + } + std::unique_ptr getWriter() override; private: diff --git a/lld/lib/ReaderWriter/ELF/X86/X86ELFReader.h b/lld/lib/ReaderWriter/ELF/X86/X86ELFReader.h index 74f1208..0648ff5 100644 --- a/lld/lib/ReaderWriter/ELF/X86/X86ELFReader.h +++ b/lld/lib/ReaderWriter/ELF/X86/X86ELFReader.h @@ -16,6 +16,8 @@ namespace lld { namespace elf { +typedef llvm::object::ELFType X86ELFType; + struct X86DynamicFileCreateELFTraits { typedef llvm::ErrorOr> result_type; @@ -40,6 +42,16 @@ class X86ELFObjectReader : public ELFObjectReader { public: X86ELFObjectReader(bool atomizeStrings) : ELFObjectReader(atomizeStrings) {} + bool canParse(file_magic magic, StringRef ext, + const MemoryBuffer &buf) const override { + const uint8_t *data = + reinterpret_cast(buf.getBuffer().data()); + const llvm::object::Elf_Ehdr_Impl *elfHeader = + reinterpret_cast *>(data); + return ELFObjectReader::canParse(magic, ext, buf) && + elfHeader->e_machine == llvm::ELF::EM_386; + } + std::error_code parseFile(std::unique_ptr &mb, const class Registry &, std::vector> &result) const override { @@ -59,6 +71,16 @@ class X86ELFDSOReader : public ELFDSOReader { public: X86ELFDSOReader(bool useUndefines) : ELFDSOReader(useUndefines) {} + bool canParse(file_magic magic, StringRef ext, + const MemoryBuffer &buf) const override { + const uint8_t *data = + reinterpret_cast(buf.getBuffer().data()); + const llvm::object::Elf_Ehdr_Impl *elfHeader = + reinterpret_cast *>(data); + return ELFDSOReader::canParse(magic, ext, buf) && + elfHeader->e_machine == llvm::ELF::EM_386; + } + std::error_code parseFile(std::unique_ptr &mb, const class Registry &, std::vector> &result) const override { diff --git a/lld/lib/ReaderWriter/ELF/X86/X86TargetHandler.h b/lld/lib/ReaderWriter/ELF/X86/X86TargetHandler.h index 0a00eca..e5866e1c 100644 --- a/lld/lib/ReaderWriter/ELF/X86/X86TargetHandler.h +++ b/lld/lib/ReaderWriter/ELF/X86/X86TargetHandler.h @@ -19,7 +19,6 @@ namespace lld { namespace elf { -typedef llvm::object::ELFType X86ELFType; class X86LinkingContext; template class X86TargetLayout : public TargetLayout { diff --git a/lld/lib/ReaderWriter/ELF/X86_64/X86_64ELFReader.h b/lld/lib/ReaderWriter/ELF/X86_64/X86_64ELFReader.h index 8757296..f6e2b64 100644 --- a/lld/lib/ReaderWriter/ELF/X86_64/X86_64ELFReader.h +++ b/lld/lib/ReaderWriter/ELF/X86_64/X86_64ELFReader.h @@ -16,6 +16,8 @@ namespace lld { namespace elf { +typedef llvm::object::ELFType X86_64ELFType; + struct X86_64DynamicFileCreateELFTraits { typedef llvm::ErrorOr> result_type; @@ -42,6 +44,17 @@ public: X86_64ELFObjectReader(bool atomizeStrings) : ELFObjectReader(atomizeStrings) {} + bool canParse(file_magic magic, StringRef ext, + const MemoryBuffer &buf) const override { + const uint8_t *data = + reinterpret_cast(buf.getBuffer().data()); + const llvm::object::Elf_Ehdr_Impl *elfHeader = + reinterpret_cast *>( + data); + return ELFObjectReader::canParse(magic, ext, buf) && + elfHeader->e_machine == llvm::ELF::EM_X86_64; + } + std::error_code parseFile(std::unique_ptr &mb, const class Registry &, std::vector> &result) const override { @@ -61,6 +74,17 @@ class X86_64ELFDSOReader : public ELFDSOReader { public: X86_64ELFDSOReader(bool useUndefines) : ELFDSOReader(useUndefines) {} + bool canParse(file_magic magic, StringRef ext, + const MemoryBuffer &buf) const override { + const uint8_t *data = + reinterpret_cast(buf.getBuffer().data()); + const llvm::object::Elf_Ehdr_Impl *elfHeader = + reinterpret_cast *>( + data); + return ELFDSOReader::canParse(magic, ext, buf) && + elfHeader->e_machine == llvm::ELF::EM_X86_64; + } + std::error_code parseFile(std::unique_ptr &mb, const class Registry &, std::vector> &result) const override { diff --git a/lld/lib/ReaderWriter/ELF/X86_64/X86_64TargetHandler.h b/lld/lib/ReaderWriter/ELF/X86_64/X86_64TargetHandler.h index eb66260..fdbf17d 100644 --- a/lld/lib/ReaderWriter/ELF/X86_64/X86_64TargetHandler.h +++ b/lld/lib/ReaderWriter/ELF/X86_64/X86_64TargetHandler.h @@ -19,7 +19,6 @@ namespace lld { namespace elf { -typedef llvm::object::ELFType X86_64ELFType; class X86_64LinkingContext; template class X86_64TargetLayout : public TargetLayout { diff --git a/lld/test/elf/X86_64/Inputs/constint.o b/lld/test/elf/X86_64/Inputs/constint.o index 9c709e07a465369a755a31a4a1f3826525b7bd78..8324b73014d08f0e35f18db286ee95af4f52599f 100644 GIT binary patch literal 1062 zcmbtS%}T>S5S}#k7ZC~`3SR0-1-m5Dg9yq()n3$FA0UYVMUqIf0lny}^)Y-6pFn4l zopw9sqyxL(d^7XS>~8XLeS6dKJYe(S5|)gk0Q02_y7o0}!v^e;KN*kD2S?Mm%1t#G zsWTN0Ppg`R?_r>VkqVESIDjhOG84s!X4c>%dnSD~pdKO{JwptU0cT>=W|>l)pgG6*Ip8 literal 734 zcma)4!AiqG5S^H6RYWX!>!qHoXjiKRMG%Cdy;N`gfMgpmXf}{+Ku`WcKgCb+SNsB< zm))`PAUZI4@6EhSW|O?$OmBlAAc=rNS}LM9-x$@{r%h_pF8E|TzU=j9ab;|EJWWkh ziVa?nHJ>-=~S0&OyJi>$MaLO5=;kyIzAwHn&hSoKU1>*)M&WHVWyl&2WXWus0 zC1jpx!DhWhAD>bO{`|9`o0~v4p9n2)%S{QtzozI_+H$mZc5v0XDQ#-3(iGDd^5QeS diff --git a/lld/test/elf/X86_64/Inputs/no-interp-section.o b/lld/test/elf/X86_64/Inputs/no-interp-section.o index ea38394e4e7820e88ed670914edc62eb35e8f24e..063eb3244f2251ae9346a49a5394236c8ddfc8ae 100644 GIT binary patch literal 975 zcmbtS!AiqG5S=u&Rc}3rf|q(y!7PbX5DyY)YcJxhACSa=MY1W)2K1u8)uX@U&7007 zJ8e4T=D_C7d-G;zcgg4U@uA~5z~R6>Y#FNn>um~Qm4|QuJvgL%HXh#%FXnNnO*tH? zTNQZMWyOMzz*qiA1(&rBpo;g*L@}aS)%e1hN#6{p=g35$;-UbRU3@ypiejrzC`95)gX#6gK8!32-MWAJ)B0o>R4 zR5NkX>HE3Q_C?D3Y;hk&5lKbVp^YN?@`K45N7SP(?Sapy)4SnlnKsrn=ZoCxsvJ(# zjk-+6JfjWMqH=Mg}_u1P><4z_0_sWN-kp9T+$n*ce!WYz`n!cU5NeOY}_zNeLK* zl)XQ@x)YxqgI;lEZb@PikS-~L&>1jRNoqw2gI-EvNg{(@QgJbZUS57ls$Nk(j8P7< zghC(<)DQ9}8=5%|XnYu#1;&8Via;8qpBYWu0gVsiqU%=&N`S(RT>Uygz3f2D1jNX| z0m_j<76h`9|P4#NWUN!y&$a>Q2lmL8b+a~DG(ps?I5*3pn?;i8bM(M ziX#vW0um4knD#K;4wCACdI+0+P^|;m literal 629 zcmb<-^>JflWMqH=Mh0dE1doAX4OGGeOlvT3GO#hQ0@)luobIa3=$Gi53X&2q3MqSk zc6BE{IR?Gr%G{E~Bp_W<1fervtdi7<5(d4L#F9h?y`Eq~WC@W# z8mJEB2R5jBh}#jGS)fcsAPrK-4CUierw)_{`InG79iSR^AZ7w$5CEAc17<-8n7yVz zE=V2ByZ|5@n>s-xH9#gq4iMXc7*GIvUoh!68M#5875>Hz>DfG2YR diff --git a/lld/test/elf/X86_64/Inputs/rwint.o b/lld/test/elf/X86_64/Inputs/rwint.o index cbf371d5d6f14de0e452bae0007dbc518417e01f..9fba51f07add2671055e4c3bf19c537e92104e9c 100644 GIT binary patch literal 963 zcmbtSJx{|x40W1PzNT(SEM)>DY9**hhyg_^r3+%~4@g2J5K4-gi+~0GR!9C48ynck zxxHH1uylET&(G((Q$8nmw;j&|2@kGe%|r!Qu2YEWJc3>5!5-(+@%UO97 ztMO#=T$^ljecEawRlVg-CycIa@llvdUmdB9cA8XDRisRj=c(nHEnKRW59@K|w0ZI= z{)Z#BAb;0e+uYl8v8Tt3@O8X~Pj(myKViPlExubUgA(64&v4(R-@$k0IRHEKjYo#2 zj1Z6Tpa$IXCNz8t5MSa0?#Pg_&*Fm-nfJJnug~4%4)6P9-yzSW5_5IF}pU%q74DMOlm0dB7@vj6}9 diff --git a/lld/test/elf/abs.test b/lld/test/elf/abs.test index a48d6db..bad74f1 100644 --- a/lld/test/elf/abs.test +++ b/lld/test/elf/abs.test @@ -9,7 +9,7 @@ # built using: "gcc -m32" # -RUN: lld -flavor gnu --output-filetype=yaml -r %p/Inputs/abs-test.i386 | FileCheck -check-prefix=YAML %s +RUN: lld -flavor gnu -target i386 --output-filetype=yaml -r %p/Inputs/abs-test.i386 | FileCheck -check-prefix=YAML %s YAML: absolute-atoms: YAML: - name: absLocalSymbol -- 2.7.4