003 File Manager
Current Path:
/usr/src/contrib/llvm-project/lld/COFF
usr
/
src
/
contrib
/
llvm-project
/
lld
/
COFF
/
📁
..
📄
Chunks.cpp
(31.9 KB)
📄
Chunks.h
(22.6 KB)
📄
Config.h
(6.76 KB)
📄
DLL.cpp
(23.61 KB)
📄
DLL.h
(2.25 KB)
📄
DebugTypes.cpp
(18.17 KB)
📄
DebugTypes.h
(2.44 KB)
📄
Driver.cpp
(68.73 KB)
📄
Driver.h
(7.09 KB)
📄
DriverUtils.cpp
(29.99 KB)
📄
ICF.cpp
(10.91 KB)
📄
ICF.h
(612 B)
📄
InputFiles.cpp
(37.9 KB)
📄
InputFiles.h
(12.92 KB)
📄
LLDMapFile.cpp
(4.11 KB)
📄
LLDMapFile.h
(599 B)
📄
LTO.cpp
(7.34 KB)
📄
LTO.h
(1.54 KB)
📄
MapFile.cpp
(10.44 KB)
📄
MapFile.h
(590 B)
📄
MarkLive.cpp
(2.28 KB)
📄
MarkLive.h
(648 B)
📄
MinGW.cpp
(4.89 KB)
📄
MinGW.h
(1.03 KB)
📄
Options.td
(12.29 KB)
📄
PDB.cpp
(58.35 KB)
📄
PDB.h
(1.01 KB)
📄
README.md
(20 B)
📄
SymbolTable.cpp
(26.37 KB)
📄
SymbolTable.h
(4.98 KB)
📄
Symbols.cpp
(4.38 KB)
📄
Symbols.h
(14.85 KB)
📄
TypeMerger.h
(2.24 KB)
📄
Writer.cpp
(70.38 KB)
📄
Writer.h
(2.57 KB)
Editing: MarkLive.cpp
//===- MarkLive.cpp -------------------------------------------------------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// #include "Chunks.h" #include "Symbols.h" #include "lld/Common/Timer.h" #include "llvm/ADT/STLExtras.h" #include <vector> namespace lld { namespace coff { static Timer gctimer("GC", Timer::root()); // Set live bit on for each reachable chunk. Unmarked (unreachable) // COMDAT chunks will be ignored by Writer, so they will be excluded // from the final output. void markLive(ArrayRef<Chunk *> chunks) { ScopedTimer t(gctimer); // We build up a worklist of sections which have been marked as live. We only // push into the worklist when we discover an unmarked section, and we mark // as we push, so sections never appear twice in the list. SmallVector<SectionChunk *, 256> worklist; // COMDAT section chunks are dead by default. Add non-COMDAT chunks. Do not // traverse DWARF sections. They are live, but they should not keep other // sections alive. for (Chunk *c : chunks) if (auto *sc = dyn_cast<SectionChunk>(c)) if (sc->live && !sc->isDWARF()) worklist.push_back(sc); auto enqueue = [&](SectionChunk *c) { if (c->live) return; c->live = true; worklist.push_back(c); }; auto addSym = [&](Symbol *b) { if (auto *sym = dyn_cast<DefinedRegular>(b)) enqueue(sym->getChunk()); else if (auto *sym = dyn_cast<DefinedImportData>(b)) sym->file->live = true; else if (auto *sym = dyn_cast<DefinedImportThunk>(b)) sym->wrappedSym->file->live = sym->wrappedSym->file->thunkLive = true; }; // Add GC root chunks. for (Symbol *b : config->gcroot) addSym(b); while (!worklist.empty()) { SectionChunk *sc = worklist.pop_back_val(); assert(sc->live && "We mark as live when pushing onto the worklist!"); // Mark all symbols listed in the relocation table for this section. for (Symbol *b : sc->symbols()) if (b) addSym(b); // Mark associative sections if any. for (SectionChunk &c : sc->children()) enqueue(&c); } } } }
Upload File
Create Folder