forked from OSchip/llvm-project
parent
8d6298b272
commit
38988d7ee0
|
@ -141,7 +141,7 @@ void CodeGenModule::setGlobalVisibility(llvm::GlobalValue *GV,
|
|||
}
|
||||
|
||||
const char *CodeGenModule::getMangledName(const GlobalDecl &GD) {
|
||||
const NamedDecl *ND = GD.getDecl();
|
||||
const NamedDecl *ND = cast<NamedDecl>(GD.getDecl());
|
||||
|
||||
if (const CXXConstructorDecl *D = dyn_cast<CXXConstructorDecl>(ND))
|
||||
return getMangledCXXCtorName(D, GD.getCtorType());
|
||||
|
@ -545,7 +545,7 @@ bool CodeGenModule::MayDeferGeneration(const ValueDecl *Global) {
|
|||
}
|
||||
|
||||
void CodeGenModule::EmitGlobal(GlobalDecl GD) {
|
||||
const ValueDecl *Global = GD.getDecl();
|
||||
const ValueDecl *Global = cast<ValueDecl>(GD.getDecl());
|
||||
|
||||
// If this is an alias definition (which otherwise looks like a declaration)
|
||||
// emit it now.
|
||||
|
@ -594,7 +594,7 @@ void CodeGenModule::EmitGlobal(GlobalDecl GD) {
|
|||
}
|
||||
|
||||
void CodeGenModule::EmitGlobalDefinition(GlobalDecl GD) {
|
||||
const ValueDecl *D = GD.getDecl();
|
||||
const ValueDecl *D = cast<ValueDecl>(GD.getDecl());
|
||||
|
||||
if (const CXXConstructorDecl *CD = dyn_cast<CXXConstructorDecl>(D))
|
||||
EmitCXXConstructor(CD, GD.getCtorType());
|
||||
|
@ -810,7 +810,7 @@ llvm::Constant *CodeGenModule::GetAddrOfFunction(GlobalDecl GD,
|
|||
const llvm::Type *Ty) {
|
||||
// If there was no specific requested type, just convert it now.
|
||||
if (!Ty)
|
||||
Ty = getTypes().ConvertType(GD.getDecl()->getType());
|
||||
Ty = getTypes().ConvertType(cast<ValueDecl>(GD.getDecl())->getType());
|
||||
return GetOrCreateLLVMFunction(getMangledName(GD), Ty, GD);
|
||||
}
|
||||
|
||||
|
@ -1643,7 +1643,7 @@ void CodeGenModule::EmitTopLevelDecl(Decl *D) {
|
|||
// Fall through
|
||||
|
||||
case Decl::Var:
|
||||
EmitGlobal(GlobalDecl(cast<ValueDecl>(D)));
|
||||
EmitGlobal(GlobalDecl(cast<VarDecl>(D)));
|
||||
break;
|
||||
|
||||
// C++ Decls
|
||||
|
|
|
@ -70,23 +70,31 @@ namespace CodeGen {
|
|||
/// GlobalDecl - represents a global declaration. This can either be a
|
||||
/// CXXConstructorDecl and the constructor type (Base, Complete).
|
||||
/// a CXXDestructorDecl and the destructor type (Base, Complete) or
|
||||
// a regular VarDecl or a FunctionDecl.
|
||||
/// a VarDecl, a FunctionDecl or a BlockDecl.
|
||||
class GlobalDecl {
|
||||
llvm::PointerIntPair<const ValueDecl*, 2> Value;
|
||||
llvm::PointerIntPair<const Decl*, 2> Value;
|
||||
|
||||
void init(const Decl *D) {
|
||||
assert(!isa<CXXConstructorDecl>(D) && "Use other ctor with ctor decls!");
|
||||
assert(!isa<CXXDestructorDecl>(D) && "Use other ctor with dtor decls!");
|
||||
assert(isa<VarDecl>(D) || isa<FunctionDecl>(D)
|
||||
&& "Invalid decl type passed to GlobalDecl ctor!");
|
||||
|
||||
Value.setPointer(D);
|
||||
}
|
||||
|
||||
public:
|
||||
GlobalDecl() {}
|
||||
|
||||
explicit GlobalDecl(const ValueDecl *VD) : Value(VD, 0) {
|
||||
assert(!isa<CXXConstructorDecl>(VD) && "Use other ctor with ctor decls!");
|
||||
assert(!isa<CXXDestructorDecl>(VD) && "Use other ctor with dtor decls!");
|
||||
}
|
||||
GlobalDecl(const VarDecl *D) { init(D);}
|
||||
GlobalDecl(const FunctionDecl *D) { init(D); }
|
||||
|
||||
GlobalDecl(const CXXConstructorDecl *D, CXXCtorType Type)
|
||||
: Value(D, Type) {}
|
||||
GlobalDecl(const CXXDestructorDecl *D, CXXDtorType Type)
|
||||
: Value(D, Type) {}
|
||||
|
||||
const ValueDecl *getDecl() const { return Value.getPointer(); }
|
||||
const Decl *getDecl() const { return Value.getPointer(); }
|
||||
|
||||
CXXCtorType getCtorType() const {
|
||||
assert(isa<CXXConstructorDecl>(getDecl()) && "Decl is not a ctor!");
|
||||
|
|
Loading…
Reference in New Issue