mirror of
https://github.com/intel/llvm.git
synced 2026-01-31 16:29:50 +08:00
CodeGen: Factor out some of the bitset entry creation code. NFC.
llvm-svn: 239927
This commit is contained in:
@@ -848,7 +848,8 @@ void CodeGenModule::EmitVTableBitSetEntries(llvm::GlobalVariable *VTable,
|
||||
!LangOpts.Sanitize.has(SanitizerKind::CFIUnrelatedCast))
|
||||
return;
|
||||
|
||||
llvm::Metadata *VTableMD = llvm::ConstantAsMetadata::get(VTable);
|
||||
CharUnits PointerWidth =
|
||||
Context.toCharUnitsFromBits(Context.getTargetInfo().getPointerWidth(0));
|
||||
|
||||
std::vector<llvm::MDTuple *> BitsetEntries;
|
||||
// Create a bit set entry for each address point.
|
||||
@@ -857,23 +858,8 @@ void CodeGenModule::EmitVTableBitSetEntries(llvm::GlobalVariable *VTable,
|
||||
if (AP.first.getBase()->isInStdNamespace())
|
||||
continue;
|
||||
|
||||
std::string OutName;
|
||||
llvm::raw_string_ostream Out(OutName);
|
||||
getCXXABI().getMangleContext().mangleCXXVTableBitSet(AP.first.getBase(),
|
||||
Out);
|
||||
|
||||
CharUnits PointerWidth =
|
||||
Context.toCharUnitsFromBits(Context.getTargetInfo().getPointerWidth(0));
|
||||
uint64_t AddrPointOffset = AP.second * PointerWidth.getQuantity();
|
||||
|
||||
llvm::Metadata *BitsetOps[] = {
|
||||
llvm::MDString::get(getLLVMContext(), Out.str()),
|
||||
VTableMD,
|
||||
llvm::ConstantAsMetadata::get(
|
||||
llvm::ConstantInt::get(Int64Ty, AddrPointOffset))};
|
||||
llvm::MDTuple *BitsetEntry =
|
||||
llvm::MDTuple::get(getLLVMContext(), BitsetOps);
|
||||
BitsetEntries.push_back(BitsetEntry);
|
||||
BitsetEntries.push_back(CreateVTableBitSetEntry(
|
||||
VTable, PointerWidth * AP.second, AP.first.getBase()));
|
||||
}
|
||||
|
||||
// Sort the bit set entries for determinism.
|
||||
|
||||
@@ -3659,3 +3659,17 @@ void CodeGenModule::EmitOMPThreadPrivateDecl(const OMPThreadPrivateDecl *D) {
|
||||
CXXGlobalInits.push_back(InitFunction);
|
||||
}
|
||||
}
|
||||
|
||||
llvm::MDTuple *CodeGenModule::CreateVTableBitSetEntry(
|
||||
llvm::GlobalVariable *VTable, CharUnits Offset, const CXXRecordDecl *RD) {
|
||||
std::string OutName;
|
||||
llvm::raw_string_ostream Out(OutName);
|
||||
getCXXABI().getMangleContext().mangleCXXVTableBitSet(RD, Out);
|
||||
|
||||
llvm::Metadata *BitsetOps[] = {
|
||||
llvm::MDString::get(getLLVMContext(), Out.str()),
|
||||
llvm::ConstantAsMetadata::get(VTable),
|
||||
llvm::ConstantAsMetadata::get(
|
||||
llvm::ConstantInt::get(Int64Ty, Offset.getQuantity()))};
|
||||
return llvm::MDTuple::get(getLLVMContext(), BitsetOps);
|
||||
}
|
||||
|
||||
@@ -1115,6 +1115,11 @@ public:
|
||||
void EmitVTableBitSetEntries(llvm::GlobalVariable *VTable,
|
||||
const VTableLayout &VTLayout);
|
||||
|
||||
/// Create a bitset entry for the given vtable.
|
||||
llvm::MDTuple *CreateVTableBitSetEntry(llvm::GlobalVariable *VTable,
|
||||
CharUnits Offset,
|
||||
const CXXRecordDecl *RD);
|
||||
|
||||
/// \breif Get the declaration of std::terminate for the platform.
|
||||
llvm::Constant *getTerminateFn();
|
||||
|
||||
|
||||
Reference in New Issue
Block a user