本文整理汇总了C++中SymbolRef::Declare方法的典型用法代码示例。如果您正苦于以下问题:C++ SymbolRef::Declare方法的具体用法?C++ SymbolRef::Declare怎么用?C++ SymbolRef::Declare使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类SymbolRef
的用法示例。
在下文中一共展示了SymbolRef::Declare方法的2个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的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: inbuf
//.........这里部分代码省略.........
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)
{
unsigned long sym_scnum = ReadU32(inbuf); // section number
unsigned long value = ReadU32(inbuf); // value
llvm::StringRef symname = read_string(ReadU32(inbuf));// name
unsigned long flags = ReadU32(inbuf); // flags
SymbolRef sym = m_object.getSymbol(symname);
if ((flags & XdfSymbol::XDF_GLOBAL) != 0)
sym->Declare(Symbol::GLOBAL);
else if ((flags & XdfSymbol::XDF_EXTERN) != 0)
sym->Declare(Symbol::EXTERN);
if ((flags & XdfSymbol::XDF_EQU) != 0)
sym->DefineEqu(Expr(value));
else if (sym_scnum < scnum)
{
Section& sect = m_object.getSection(sym_scnum);
Location loc = {§.bytecodes_front(), value};
sym->DefineLabel(loc);
}
// Save index in symrec data
sym->AddAssocData(std::auto_ptr<XdfSymbol>(new XdfSymbol(i)));
}
// Update section symbol info, and create section relocations
std::vector<unsigned long>::iterator nrelocsi = sects_nrelocs.begin();
for (Object::section_iterator sect=m_object.sections_begin(),
end=m_object.sections_end(); sect != end; ++sect, ++nrelocsi)
{
XdfSection* xsect = sect->getAssocData<XdfSection>();
assert(xsect != 0);
// Read relocations
inbuf.setPosition(xsect->relptr);
if (inbuf.getReadableSize() < (*nrelocsi) * RELOC_SIZE)
{
diags.Report(SourceLocation(), diag::err_section_relocs_unreadable)
<< sect->getName();
return false;
}
for (unsigned long i=0; i<(*nrelocsi); ++i)
{
unsigned long addr = ReadU32(inbuf);
unsigned long sym_index = ReadU32(inbuf);
unsigned long basesym_index = ReadU32(inbuf);
XdfReloc::Type type = static_cast<XdfReloc::Type>(ReadU8(inbuf));
XdfReloc::Size size = static_cast<XdfReloc::Size>(ReadU8(inbuf));
unsigned char shift = ReadU8(inbuf);
ReadU8(inbuf); // flags; ignored
SymbolRef sym = m_object.getSymbol(sym_index);
SymbolRef basesym(0);
if (type == XdfReloc::XDF_WRT)
basesym = m_object.getSymbol(basesym_index);
sect->AddReloc(std::auto_ptr<Reloc>(
new XdfReloc(addr, sym, basesym, type, size, shift)));
}
}
if (diags.hasErrorOccurred())
return false;
return true;
}