本文整理汇总了C++中SymbolRef::AddAssocData方法的典型用法代码示例。如果您正苦于以下问题:C++ SymbolRef::AddAssocData方法的具体用法?C++ SymbolRef::AddAssocData怎么用?C++ SymbolRef::AddAssocData使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类SymbolRef
的用法示例。
在下文中一共展示了SymbolRef::AddAssocData方法的3个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: Section
Section*
BinObject::AppendSection(llvm::StringRef name,
SourceLocation source,
Diagnostic& diags)
{
bool bss = (name == ".bss");
bool code = (name == ".text");
Section* section = new Section(name, code, bss, source);
m_object.AppendSection(std::auto_ptr<Section>(section));
// Initialize section data and symbols.
std::auto_ptr<BinSection> bsd(new BinSection());
SymbolRef start = m_object.getSymbol(("section."+name+".start").str());
if (start->okToDeclare(Symbol::EXTERN))
{
start->Declare(Symbol::EXTERN);
start->setDeclSource(source);
}
start->AddAssocData(std::auto_ptr<BinSymbol>
(new BinSymbol(*section, *bsd, BinSymbol::START)));
SymbolRef vstart = m_object.getSymbol(("section."+name+".vstart").str());
if (vstart->okToDeclare(Symbol::EXTERN))
{
vstart->Declare(Symbol::EXTERN);
vstart->setDeclSource(source);
}
vstart->AddAssocData(std::auto_ptr<BinSymbol>
(new BinSymbol(*section, *bsd, BinSymbol::VSTART)));
SymbolRef length = m_object.getSymbol(("section."+name+".length").str());
if (length->okToDeclare(Symbol::EXTERN))
{
length->Declare(Symbol::EXTERN);
length->setDeclSource(source);
}
length->AddAssocData(std::auto_ptr<BinSymbol>
(new BinSymbol(*section, *bsd, BinSymbol::LENGTH)));
section->AddAssocData(std::auto_ptr<BinSection>(bsd.release()));
return section;
}
示例2: ElfSymbol
bool
ElfConfig::ReadSymbolTable(const MemoryBuffer& in,
const ElfSection& symtab_sect,
ElfSymtab& symtab,
Object& object,
const StringTable& strtab,
Section* sections[],
DiagnosticsEngine& diags) const
{
ElfSize symsize = symtab_sect.getEntSize();
if (symsize == 0)
{
diags.Report(SourceLocation(), diag::err_symbol_entity_size_zero);
return false;
}
unsigned long size = symtab_sect.getSize().getUInt();
// Symbol table always starts with null entry
symtab.push_back(SymbolRef(0));
ElfSymbolIndex index = 1;
for (unsigned long pos=symsize; pos<size; pos += symsize, ++index)
{
std::auto_ptr<ElfSymbol> elfsym(
new ElfSymbol(*this, in, symtab_sect, index, sections, diags));
if (diags.hasErrorOccurred())
return false;
SymbolRef sym = elfsym->CreateSymbol(object, strtab);
symtab.push_back(sym);
if (sym)
sym->AddAssocData(elfsym); // Associate symbol data with symbol
}
return true;
}
示例3: inbuf
bool
XdfObject::Read(SourceManager& sm, Diagnostic& diags)
{
const llvm::MemoryBuffer& in = *sm.getBuffer(sm.getMainFileID());
InputBuffer inbuf(in);
inbuf.setLittleEndian();
// Read object header
if (inbuf.getReadableSize() < FILEHEAD_SIZE)
{
diags.Report(SourceLocation(), diag::err_object_header_unreadable);
return false;
}
unsigned long magic = ReadU32(inbuf);
if (magic != XDF_MAGIC)
{
diags.Report(SourceLocation(), diag::err_not_file_type) << "XDF";
return false;
}
unsigned long scnum = ReadU32(inbuf);
unsigned long symnum = ReadU32(inbuf);
unsigned long headers_len = ReadU32(inbuf);
if (inbuf.getReadableSize() < headers_len)
{
diags.Report(SourceLocation(), diag::err_xdf_headers_unreadable);
return false;
}
unsigned long section_offset = FILEHEAD_SIZE;
unsigned long symtab_offset = section_offset + SECTHEAD_SIZE*scnum;
unsigned long strtab_offset = symtab_offset + SYMBOL_SIZE*symnum;
ReadString read_string(in, strtab_offset,
FILEHEAD_SIZE+headers_len-strtab_offset,
diags);
// Storage for nrelocs, indexed by section number
std::vector<unsigned long> sects_nrelocs;
sects_nrelocs.reserve(scnum);
// Create sections
for (unsigned long i=0; i<scnum; ++i)
{
// Start with symbol=0 as it's not created yet; updated later.
std::auto_ptr<XdfSection> xsect(new XdfSection(SymbolRef(0)));
unsigned long name_sym_index;
IntNum lma, vma;
unsigned long align;
bool bss;
unsigned long filepos;
unsigned long nrelocs;
xsect->Read(in, section_offset+SECTHEAD_SIZE*i, &name_sym_index, &lma,
&vma, &align, &bss, &filepos, &nrelocs);
xsect->scnum = i;
// get section name from section symbol entry
inbuf.setPosition(symtab_offset+name_sym_index*SYMBOL_SIZE+8);
llvm::StringRef sectname = read_string(ReadU32(inbuf));
std::auto_ptr<Section> section(
new Section(sectname, xsect->bits != 0, bss, SourceLocation()));
section->setFilePos(filepos);
section->setVMA(vma);
section->setLMA(lma);
if (bss)
{
Bytecode& gap =
section->AppendGap(xsect->size, SourceLocation());
Diagnostic nodiags(0);
gap.CalcLen(0, nodiags); // force length calculation of gap
}
else
{
// Read section data
inbuf.setPosition(filepos);
if (inbuf.getReadableSize() < xsect->size)
{
diags.Report(SourceLocation(),
diag::err_section_data_unreadable) << sectname;
return false;
}
section->bytecodes_front().getFixed().Write(inbuf.Read(xsect->size),
xsect->size);
}
// Associate section data with section
section->AddAssocData(xsect);
// Add section to object
m_object.AppendSection(section);
sects_nrelocs.push_back(nrelocs);
}
// Create symbols
inbuf.setPosition(symtab_offset);
for (unsigned long i=0; i<symnum; ++i)
{
//.........这里部分代码省略.........