diff options
| -rw-r--r-- | lld/ELF/OutputSections.cpp | 4 | ||||
| -rw-r--r-- | lld/ELF/OutputSections.h | 16 | ||||
| -rw-r--r-- | lld/ELF/Writer.cpp | 27 | ||||
| -rw-r--r-- | lld/test/elf2/basic.s | 28 | ||||
| -rw-r--r-- | lld/test/elf2/basic32.s | 26 | ||||
| -rw-r--r-- | lld/test/elf2/basic32be.s | 26 | ||||
| -rw-r--r-- | lld/test/elf2/basic64be.s | 30 | ||||
| -rw-r--r-- | lld/test/elf2/bss.s | 2 | ||||
| -rw-r--r-- | lld/test/elf2/relocation-common.s | 4 | ||||
| -rw-r--r-- | lld/test/elf2/symbols.s | 26 |
10 files changed, 94 insertions, 95 deletions
diff --git a/lld/ELF/OutputSections.cpp b/lld/ELF/OutputSections.cpp index c152fe3d985..3e9f8150215 100644 --- a/lld/ELF/OutputSections.cpp +++ b/lld/ELF/OutputSections.cpp @@ -252,7 +252,7 @@ lld::elf2::getLocalSymVA(const typename ELFFile<ELFT>::Elf_Sym *Sym, template <class ELFT> void OutputSection<ELFT>::writeTo(uint8_t *Buf) { for (InputSection<ELFT> *C : Sections) - C->writeTo(Buf, *BssSec, PltSec, GotSec); + C->writeTo(Buf, BssSec, PltSec, GotSec); } template <bool Is64Bits> @@ -336,7 +336,7 @@ template <class ELFT> void SymbolTableSection<ELFT>::writeTo(uint8_t *Buf) { Section = &cast<DefinedRegular<ELFT>>(Body)->Section; break; case SymbolBody::DefinedCommonKind: - Out = BssSec; + Out = &BssSec; break; case SymbolBody::UndefinedKind: case SymbolBody::DefinedAbsoluteKind: diff --git a/lld/ELF/OutputSections.h b/lld/ELF/OutputSections.h index 6ece9adf4d2..8a53b223d00 100644 --- a/lld/ELF/OutputSections.h +++ b/lld/ELF/OutputSections.h @@ -154,13 +154,14 @@ public: typedef typename llvm::object::ELFFile<ELFT>::Elf_Sym_Range Elf_Sym_Range; typedef typename OutputSectionBase<ELFT::Is64Bits>::uintX_t uintX_t; SymbolTableSection(SymbolTable &Table, - StringTableSection<ELFT::Is64Bits> &StrTabSec) + StringTableSection<ELFT::Is64Bits> &StrTabSec, + const OutputSection<ELFT> &BssSec) : OutputSectionBase<ELFT::Is64Bits>( StrTabSec.isDynamic() ? ".dynsym" : ".symtab", StrTabSec.isDynamic() ? llvm::ELF::SHT_DYNSYM : llvm::ELF::SHT_SYMTAB, StrTabSec.isDynamic() ? (uintX_t)llvm::ELF::SHF_ALLOC : 0), - Table(Table), StrTabSec(StrTabSec) { + Table(Table), StrTabSec(StrTabSec), BssSec(BssSec) { typedef OutputSectionBase<ELFT::Is64Bits> Base; typename Base::HeaderT &Header = this->Header; @@ -187,14 +188,13 @@ public: StringTableSection<ELFT::Is64Bits> &getStrTabSec() const { return StrTabSec; } unsigned getNumSymbols() const { return NumVisible + 1; } - void setBssSec(const OutputSection<ELFT> *V) { BssSec = V; } private: SymbolTable &Table; StringTableSection<ELFT::Is64Bits> &StrTabSec; unsigned NumVisible = 0; unsigned NumLocals = 0; - const OutputSection<ELFT> *BssSec = nullptr; + const OutputSection<ELFT> &BssSec; }; template <class ELFT> @@ -236,19 +236,19 @@ public: typedef typename llvm::object::ELFFile<ELFT>::Elf_Rel Elf_Rel; typedef typename llvm::object::ELFFile<ELFT>::Elf_Rela Elf_Rela; OutputSection(const PltSection<ELFT> &PltSec, const GotSection<ELFT> &GotSec, - StringRef Name, uint32_t sh_type, uintX_t sh_flags) + const OutputSection<ELFT> &BssSec, StringRef Name, + uint32_t sh_type, uintX_t sh_flags) : OutputSectionBase<ELFT::Is64Bits>(Name, sh_type, sh_flags), - PltSec(PltSec), GotSec(GotSec) {} + PltSec(PltSec), GotSec(GotSec), BssSec(BssSec) {} void addSection(InputSection<ELFT> *C); void writeTo(uint8_t *Buf) override; - void setBssSec(const OutputSection<ELFT> *BS) { BssSec = BS; } private: std::vector<InputSection<ELFT> *> Sections; const PltSection<ELFT> &PltSec; const GotSection<ELFT> &GotSec; - const OutputSection<ELFT> *BssSec = nullptr; + const OutputSection<ELFT> &BssSec; }; template <bool Is64Bits> diff --git a/lld/ELF/Writer.cpp b/lld/ELF/Writer.cpp index 58ad5ac81ee..c8985aab791 100644 --- a/lld/ELF/Writer.cpp +++ b/lld/ELF/Writer.cpp @@ -97,9 +97,11 @@ public: typedef typename ELFFile<ELFT>::Elf_Sym_Range Elf_Sym_Range; typedef typename ELFFile<ELFT>::Elf_Rela Elf_Rela; Writer(SymbolTable *T) - : SymTabSec(*T, StrTabSec), DynSymSec(*T, DynStrSec), + : SymTabSec(*T, StrTabSec, BssSec), DynSymSec(*T, DynStrSec, BssSec), RelaDynSec(DynSymSec, GotSec, T->shouldUseRela()), PltSec(GotSec), - HashSec(DynSymSec), DynamicSec(*T, HashSec, RelaDynSec) {} + HashSec(DynSymSec), DynamicSec(*T, HashSec, RelaDynSec), + BssSec(PltSec, GotSec, BssSec, ".bss", SHT_NOBITS, + SHF_ALLOC | SHF_WRITE) {} void run(); private: @@ -154,7 +156,7 @@ private: InterpSection<ELFT::Is64Bits> InterpSec; - OutputSection<ELFT> *BSSSec = nullptr; + OutputSection<ELFT> BssSec; }; } // anonymous namespace @@ -312,13 +314,17 @@ static void undefError(const SymbolTable &S, const SymbolBody &Sym) { // Create output section objects and add them to OutputSections. template <class ELFT> void Writer<ELFT>::createSections() { SmallDenseMap<SectionKey<ELFT::Is64Bits>, OutputSection<ELFT> *> Map; + + OutputSections.push_back(&BssSec); + Map[{BssSec.getName(), BssSec.getType(), BssSec.getFlags()}] = &BssSec; + auto getSection = [&](StringRef Name, uint32_t sh_type, uintX_t sh_flags) -> OutputSection<ELFT> * { SectionKey<ELFT::Is64Bits> Key{Name, sh_type, sh_flags}; OutputSection<ELFT> *&Sec = Map[Key]; if (!Sec) { Sec = new (CAlloc.Allocate()) OutputSection<ELFT>( - PltSec, GotSec, Key.Name, Key.sh_type, Key.sh_flags); + PltSec, GotSec, BssSec, Key.Name, Key.sh_type, Key.sh_flags); OutputSections.push_back(Sec); } return Sec; @@ -364,18 +370,9 @@ template <class ELFT> void Writer<ELFT>::createSections() { HashSec.addSymbol(Body); } - BSSSec = getSection(".bss", SHT_NOBITS, SHF_ALLOC | SHF_WRITE); - - // The only type in OutputSections is currently OutputSection. - for (OutputSectionBase<ELFT::Is64Bits> *OSB : OutputSections) - static_cast<OutputSection<ELFT> *>(OSB)->setBssSec(BSSSec); - - SymTabSec.setBssSec(BSSSec); - DynSymSec.setBssSec(BSSSec); - // Sort the common symbols by alignment as an heuristic to pack them better. std::stable_sort(CommonSymbols.begin(), CommonSymbols.end(), cmpAlign<ELFT>); - uintX_t Off = BSSSec->getSize(); + uintX_t Off = BssSec.getSize(); for (DefinedCommon<ELFT> *C : CommonSymbols) { const Elf_Sym &Sym = C->Sym; uintX_t Align = C->MaxAlignment; @@ -384,7 +381,7 @@ template <class ELFT> void Writer<ELFT>::createSections() { Off += Sym.st_size; } - BSSSec->setSize(Off); + BssSec.setSize(Off); OutputSections.push_back(&SymTabSec); OutputSections.push_back(&StrTabSec); diff --git a/lld/test/elf2/basic.s b/lld/test/elf2/basic.s index 4c7f4e29aa3..15e7e2fcd26 100644 --- a/lld/test/elf2/basic.s +++ b/lld/test/elf2/basic.s @@ -53,15 +53,15 @@ _start: # CHECK-NEXT: } # CHECK-NEXT: Section { # CHECK-NEXT: Index: 1 -# CHECK-NEXT: Name: .text -# CHECK-NEXT: Type: SHT_PROGBITS (0x1) -# CHECK-NEXT: Flags [ (0x6) +# CHECK-NEXT: Name: .bss +# CHECK-NEXT: Type: SHT_NOBITS (0x8) +# CHECK-NEXT: Flags [ (0x3) # CHECK-NEXT: SHF_ALLOC (0x2) -# CHECK-NEXT: SHF_EXECINSTR (0x4) +# CHECK-NEXT: SHF_WRITE (0x1) # CHECK-NEXT: ] # CHECK-NEXT: Address: 0x11000 # CHECK-NEXT: Offset: 0x1000 -# CHECK-NEXT: Size: 16 +# CHECK-NEXT: Size: 0 # CHECK-NEXT: Link: 0 # CHECK-NEXT: Info: 0 # CHECK-NEXT: AddressAlignment: 4 @@ -69,15 +69,15 @@ _start: # CHECK-NEXT: } # CHECK-NEXT: Section { # CHECK-NEXT: Index: 2 -# CHECK-NEXT: Name: .data +# CHECK-NEXT: Name: .text # CHECK-NEXT: Type: SHT_PROGBITS (0x1) -# CHECK-NEXT: Flags [ (0x3) +# CHECK-NEXT: Flags [ (0x6) # CHECK-NEXT: SHF_ALLOC (0x2) -# CHECK-NEXT: SHF_WRITE (0x1) +# CHECK-NEXT: SHF_EXECINSTR (0x4) # CHECK-NEXT: ] -# CHECK-NEXT: Address: 0x11010 -# CHECK-NEXT: Offset: 0x1010 -# CHECK-NEXT: Size: 0 +# CHECK-NEXT: Address: 0x11000 +# CHECK-NEXT: Offset: 0x1000 +# CHECK-NEXT: Size: 16 # CHECK-NEXT: Link: 0 # CHECK-NEXT: Info: 0 # CHECK-NEXT: AddressAlignment: 4 @@ -85,8 +85,8 @@ _start: # CHECK-NEXT: } # CHECK-NEXT: Section { # CHECK-NEXT: Index: 3 -# CHECK-NEXT: Name: .bss -# CHECK-NEXT: Type: SHT_NOBITS (0x8) +# CHECK-NEXT: Name: .data +# CHECK-NEXT: Type: SHT_PROGBITS (0x1) # CHECK-NEXT: Flags [ (0x3) # CHECK-NEXT: SHF_ALLOC (0x2) # CHECK-NEXT: SHF_WRITE (0x1) @@ -145,7 +145,7 @@ _start: # CHECK-NEXT: Binding: Global (0x1) # CHECK-NEXT: Type: None (0x0) # CHECK-NEXT: Other: 0 -# CHECK-NEXT: Section: .text (0x1) +# CHECK-NEXT: Section: .text # CHECK-NEXT: } # CHECK-NEXT: ] # CHECK-NEXT: ProgramHeaders [ diff --git a/lld/test/elf2/basic32.s b/lld/test/elf2/basic32.s index bad5750ed1c..edafbe41d1a 100644 --- a/lld/test/elf2/basic32.s +++ b/lld/test/elf2/basic32.s @@ -52,15 +52,15 @@ _start: # CHECK-NEXT: } # CHECK-NEXT: Section { # CHECK-NEXT: Index: 1 -# CHECK-NEXT: Name: .text -# CHECK-NEXT: Type: SHT_PROGBITS (0x1) -# CHECK-NEXT: Flags [ (0x6) +# CHECK-NEXT: Name: .bss +# CHECK-NEXT: Type: SHT_NOBITS (0x8) +# CHECK-NEXT: Flags [ (0x3) # CHECK-NEXT: SHF_ALLOC (0x2) -# CHECK-NEXT: SHF_EXECINSTR (0x4) +# CHECK-NEXT: SHF_WRITE (0x1) # CHECK-NEXT: ] # CHECK-NEXT: Address: 0x11000 # CHECK-NEXT: Offset: 0x1000 -# CHECK-NEXT: Size: 12 +# CHECK-NEXT: Size: 0 # CHECK-NEXT: Link: 0 # CHECK-NEXT: Info: 0 # CHECK-NEXT: AddressAlignment: 4 @@ -68,15 +68,15 @@ _start: # CHECK-NEXT: } # CHECK-NEXT: Section { # CHECK-NEXT: Index: 2 -# CHECK-NEXT: Name: .data +# CHECK-NEXT: Name: .text # CHECK-NEXT: Type: SHT_PROGBITS (0x1) -# CHECK-NEXT: Flags [ (0x3) +# CHECK-NEXT: Flags [ (0x6) # CHECK-NEXT: SHF_ALLOC (0x2) -# CHECK-NEXT: SHF_WRITE (0x1) +# CHECK-NEXT: SHF_EXECINSTR (0x4) # CHECK-NEXT: ] -# CHECK-NEXT: Address: 0x1100C -# CHECK-NEXT: Offset: 0x100C -# CHECK-NEXT: Size: 0 +# CHECK-NEXT: Address: 0x11000 +# CHECK-NEXT: Offset: 0x1000 +# CHECK-NEXT: Size: 12 # CHECK-NEXT: Link: 0 # CHECK-NEXT: Info: 0 # CHECK-NEXT: AddressAlignment: 4 @@ -84,8 +84,8 @@ _start: # CHECK-NEXT: } # CHECK-NEXT: Section { # CHECK-NEXT: Index: 3 -# CHECK-NEXT: Name: .bss -# CHECK-NEXT: Type: SHT_NOBITS (0x8) +# CHECK-NEXT: Name: .data +# CHECK-NEXT: Type: SHT_PROGBITS (0x1) # CHECK-NEXT: Flags [ (0x3) # CHECK-NEXT: SHF_ALLOC (0x2) # CHECK-NEXT: SHF_WRITE (0x1) diff --git a/lld/test/elf2/basic32be.s b/lld/test/elf2/basic32be.s index 5d1cfee9e43..1f5e46a586d 100644 --- a/lld/test/elf2/basic32be.s +++ b/lld/test/elf2/basic32be.s @@ -52,15 +52,15 @@ _start: # CHECK-NEXT: } # CHECK-NEXT: Section { # CHECK-NEXT: Index: 1 -# CHECK-NEXT: Name: .text -# CHECK-NEXT: Type: SHT_PROGBITS (0x1) -# CHECK-NEXT: Flags [ (0x6) +# CHECK-NEXT: Name: .bss +# CHECK-NEXT: Type: SHT_NOBITS (0x8) +# CHECK-NEXT: Flags [ (0x3) # CHECK-NEXT: SHF_ALLOC (0x2) -# CHECK-NEXT: SHF_EXECINSTR (0x4) +# CHECK-NEXT: SHF_WRITE (0x1) # CHECK-NEXT: ] # CHECK-NEXT: Address: 0x11000 # CHECK-NEXT: Offset: 0x1000 -# CHECK-NEXT: Size: 12 +# CHECK-NEXT: Size: 0 # CHECK-NEXT: Link: 0 # CHECK-NEXT: Info: 0 # CHECK-NEXT: AddressAlignment: 4 @@ -68,15 +68,15 @@ _start: # CHECK-NEXT: } # CHECK-NEXT: Section { # CHECK-NEXT: Index: 2 -# CHECK-NEXT: Name: .data +# CHECK-NEXT: Name: .text # CHECK-NEXT: Type: SHT_PROGBITS (0x1) -# CHECK-NEXT: Flags [ (0x3) +# CHECK-NEXT: Flags [ (0x6) # CHECK-NEXT: SHF_ALLOC (0x2) -# CHECK-NEXT: SHF_WRITE (0x1) +# CHECK-NEXT: SHF_EXECINSTR (0x4) # CHECK-NEXT: ] -# CHECK-NEXT: Address: 0x1100C -# CHECK-NEXT: Offset: 0x100C -# CHECK-NEXT: Size: 0 +# CHECK-NEXT: Address: 0x11000 +# CHECK-NEXT: Offset: 0x1000 +# CHECK-NEXT: Size: 12 # CHECK-NEXT: Link: 0 # CHECK-NEXT: Info: 0 # CHECK-NEXT: AddressAlignment: 4 @@ -84,8 +84,8 @@ _start: # CHECK-NEXT: } # CHECK-NEXT: Section { # CHECK-NEXT: Index: 3 -# CHECK-NEXT: Name: .bss -# CHECK-NEXT: Type: SHT_NOBITS (0x8) +# CHECK-NEXT: Name: .data +# CHECK-NEXT: Type: SHT_PROGBITS (0x1) # CHECK-NEXT: Flags [ (0x3) # CHECK-NEXT: SHF_ALLOC (0x2) # CHECK-NEXT: SHF_WRITE (0x1) diff --git a/lld/test/elf2/basic64be.s b/lld/test/elf2/basic64be.s index 944a726495d..842312a0726 100644 --- a/lld/test/elf2/basic64be.s +++ b/lld/test/elf2/basic64be.s @@ -59,33 +59,31 @@ _start: # CHECK-NEXT: } # CHECK-NEXT: Section { # CHECK-NEXT: Index: 1 -# CHECK-NEXT: Name: .text -# CHECK-NEXT: Type: SHT_PROGBITS (0x1) -# CHECK-NEXT: Flags [ (0x6) +# CHECK-NEXT: Name: .bss +# CHECK-NEXT: Type: SHT_NOBITS (0x8) +# CHECK-NEXT: Flags [ (0x3) # CHECK-NEXT: SHF_ALLOC (0x2) -# CHECK-NEXT: SHF_EXECINSTR (0x4) +# CHECK-NEXT: SHF_WRITE (0x1) # CHECK-NEXT: ] # CHECK-NEXT: Address: 0x11000 # CHECK-NEXT: Offset: 0x1000 -# CHECK-NEXT: Size: 12 +# CHECK-NEXT: Size: 0 # CHECK-NEXT: Link: 0 # CHECK-NEXT: Info: 0 # CHECK-NEXT: AddressAlignment: 4 # CHECK-NEXT: EntrySize: 0 -# CHECK-NEXT: SectionData ( -# CHECK: ) # CHECK-NEXT: } # CHECK-NEXT: Section { # CHECK-NEXT: Index: 2 -# CHECK-NEXT: Name: .data +# CHECK-NEXT: Name: .text # CHECK-NEXT: Type: SHT_PROGBITS (0x1) -# CHECK-NEXT: Flags [ (0x3) +# CHECK-NEXT: Flags [ (0x6) # CHECK-NEXT: SHF_ALLOC (0x2) -# CHECK-NEXT: SHF_WRITE (0x1) +# CHECK-NEXT: SHF_EXECINSTR (0x4) # CHECK-NEXT: ] -# CHECK-NEXT: Address: 0x1100C -# CHECK-NEXT: Offset: 0x100C -# CHECK-NEXT: Size: 0 +# CHECK-NEXT: Address: 0x11000 +# CHECK-NEXT: Offset: 0x1000 +# CHECK-NEXT: Size: 12 # CHECK-NEXT: Link: 0 # CHECK-NEXT: Info: 0 # CHECK-NEXT: AddressAlignment: 4 @@ -95,8 +93,8 @@ _start: # CHECK-NEXT: } # CHECK-NEXT: Section { # CHECK-NEXT: Index: 3 -# CHECK-NEXT: Name: .bss -# CHECK-NEXT: Type: SHT_NOBITS (0x8) +# CHECK-NEXT: Name: .data +# CHECK-NEXT: Type: SHT_PROGBITS (0x1) # CHECK-NEXT: Flags [ (0x3) # CHECK-NEXT: SHF_ALLOC (0x2) # CHECK-NEXT: SHF_WRITE (0x1) @@ -108,6 +106,8 @@ _start: # CHECK-NEXT: Info: 0 # CHECK-NEXT: AddressAlignment: 4 # CHECK-NEXT: EntrySize: 0 +# CHECK-NEXT: SectionData ( +# CHECK: ) # CHECK-NEXT: } # CHECK-NEXT: Section { # CHECK-NEXT: Index: 4 diff --git a/lld/test/elf2/bss.s b/lld/test/elf2/bss.s index 58c364ce4d4..e8ca6be4b34 100644 --- a/lld/test/elf2/bss.s +++ b/lld/test/elf2/bss.s @@ -24,6 +24,8 @@ // CHECK-NEXT: Name: // CHECK-NEXT: Type: // CHECK-NEXT: Flags [ +// CHECK-NEXT: SHF_ALLOC +// CHECK-NEXT: SHF_EXECINSTR // CHECK-NEXT: ] // CHECK-NEXT: Address: // CHECK-NEXT: Offset: 0x1000 diff --git a/lld/test/elf2/relocation-common.s b/lld/test/elf2/relocation-common.s index 8822ea7b721..68eca0195c1 100644 --- a/lld/test/elf2/relocation-common.s +++ b/lld/test/elf2/relocation-common.s @@ -10,5 +10,5 @@ _start: .global sym1 .comm sym1,4,4 -// CHECK: 11000: {{.*}} movl $1, 4086(%rip) -// CHECK: 0000000000012000 g .bss 00000004 sym1 +// CHECK: 12000: {{.*}} movl $1, -4106(%rip) +// CHECK: 0000000000011000 g .bss 00000004 sym1 diff --git a/lld/test/elf2/symbols.s b/lld/test/elf2/symbols.s index d1572ac4888..607048d0407 100644 --- a/lld/test/elf2/symbols.s +++ b/lld/test/elf2/symbols.s @@ -45,23 +45,23 @@ hidden: .internal internal internal: -// CHECK: Name: .text -// CHECK-NEXT: Type: SHT_PROGBITS +// CHECK: Name: .bss +// CHECK-NEXT: Type: SHT_NOBITS // CHECK-NEXT: Flags [ // CHECK-NEXT: SHF_ALLOC -// CHECK-NEXT: SHF_EXECINSTR +// CHECK-NEXT: SHF_WRITE // CHECK-NEXT: ] // CHECK-NEXT: Address: 0x11000 +// CHECK-NEXT: Offset: 0x1000 +// CHECK-NEXT: Size: 4 -// CHECK: Name: .bss (14) -// CHECK-NEXT: Type: SHT_NOBITS (0x8) -// CHECK-NEXT: Flags [ (0x3) -// CHECK-NEXT: SHF_ALLOC (0x2) -// CHECK-NEXT: SHF_WRITE (0x1) +// CHECK: Name: .text +// CHECK-NEXT: Type: SHT_PROGBITS +// CHECK-NEXT: Flags [ +// CHECK-NEXT: SHF_ALLOC +// CHECK-NEXT: SHF_EXECINSTR // CHECK-NEXT: ] // CHECK-NEXT: Address: 0x12000 -// CHECK-NEXT: Offset: 0x2000 -// CHECK-NEXT: Size: 4 // CHECK: Name: foobar // CHECK-NEXT: Type: SHT_NOBITS @@ -82,7 +82,7 @@ internal: // CHECK-NEXT: } // CHECK-NEXT: Symbol { // CHECK-NEXT: Name: _start -// CHECK-NEXT: Value: 0x11000 +// CHECK-NEXT: Value: 0x12000 // CHECK-NEXT: Size: 0 // CHECK-NEXT: Binding: Global (0x1) // CHECK-NEXT: Type: Function @@ -109,7 +109,7 @@ internal: // CHECK-NEXT: } // CHECK-NEXT: Symbol { // CHECK-NEXT: Name: common -// CHECK-NEXT: Value: 0x12000 +// CHECK-NEXT: Value: 0x11000 // CHECK-NEXT: Size: 4 // CHECK-NEXT: Binding: Global // CHECK-NEXT: Type: Object @@ -118,7 +118,7 @@ internal: // CHECK-NEXT: } // CHECK-NEXT: Symbol { // CHECK-NEXT: Name: foo -// CHECK-NEXT: Value: 0x11000 +// CHECK-NEXT: Value: 0x12000 // CHECK-NEXT: Size: 0 // CHECK-NEXT: Binding: Weak (0x2) // CHECK-NEXT: Type: Object |

