diff --git a/src/IceConverter.cpp b/src/IceConverter.cpp
index 72f5a5a..325fda8 100644
--- a/src/IceConverter.cpp
+++ b/src/IceConverter.cpp
@@ -851,7 +851,7 @@
           Converter.convertToIceType(FuncType->getParamType(I)));
     }
     FunctionDeclaration *IceFunc = FunctionDeclaration::create(
-        Ctx, Signature, Func.getCallingConv(), Func.getLinkage(), Func.empty());
+        Signature, Func.getCallingConv(), Func.getLinkage(), Func.empty());
     IceFunc->setName(Func.getName());
     GlobalDeclarationMap[&Func] = IceFunc;
   }
@@ -860,7 +860,7 @@
                                      E = Mod->global_end();
        I != E; ++I) {
     const GlobalVariable *GV = I;
-    VariableDeclaration *Var = VariableDeclaration::create(Ctx);
+    VariableDeclaration *Var = VariableDeclaration::create();
     Var->setName(GV->getName());
     Var->setAlignment(GV->getAlignment());
     Var->setIsConstant(GV->isConstant());
diff --git a/src/IceGlobalContext.cpp b/src/IceGlobalContext.cpp
index 2b143f7..74dfb9e 100644
--- a/src/IceGlobalContext.cpp
+++ b/src/IceGlobalContext.cpp
@@ -314,7 +314,6 @@
 }
 
 GlobalContext::~GlobalContext() {
-  llvm::DeleteContainerPointers(GlobalDeclarations);
   llvm::DeleteContainerPointers(AllThreadContexts);
 }
 
@@ -448,29 +447,6 @@
   llvm_unreachable("Unknown type");
 }
 
-// No locking because only the bitcode parser thread calls it.
-// TODO(stichnot,kschimpf): GlobalContext::GlobalDeclarations actually
-// seems to be unused.  If so, remove that field and this method.
-FunctionDeclaration *
-GlobalContext::newFunctionDeclaration(const FuncSigType *Signature,
-                                      unsigned CallingConv, unsigned Linkage,
-                                      bool IsProto) {
-  FunctionDeclaration *Func = new FunctionDeclaration(
-      *Signature, static_cast<llvm::CallingConv::ID>(CallingConv),
-      static_cast<llvm::GlobalValue::LinkageTypes>(Linkage), IsProto);
-  GlobalDeclarations.push_back(Func);
-  return Func;
-}
-
-// No locking because only the bitcode parser thread calls it.
-// TODO(stichnot,kschimpf): GlobalContext::GlobalDeclarations actually
-// seems to be unused.  If so, remove that field and this method.
-VariableDeclaration *GlobalContext::newVariableDeclaration() {
-  VariableDeclaration *Var = new VariableDeclaration();
-  GlobalDeclarations.push_back(Var);
-  return Var;
-}
-
 TimerStackIdT GlobalContext::newTimerStackID(const IceString &Name) {
   if (!ALLOW_DUMP)
     return 0;
diff --git a/src/IceGlobalContext.h b/src/IceGlobalContext.h
index ab9c814..751147e 100644
--- a/src/IceGlobalContext.h
+++ b/src/IceGlobalContext.h
@@ -158,17 +158,6 @@
   // getConstantPool() returns a copy of the constant pool for
   // constants of a given type.
   ConstantList getConstantPool(Type Ty);
-  // Returns a new function declaration, allocated in an internal
-  // memory pool.  Ownership of the function is maintained by this
-  // class instance.
-  FunctionDeclaration *newFunctionDeclaration(const FuncSigType *Signature,
-                                              unsigned CallingConv,
-                                              unsigned Linkage, bool IsProto);
-
-  // Returns a new global variable declaration, allocated in an
-  // internal memory pool.  Ownership of the function is maintained by
-  // this class instance.
-  VariableDeclaration *newVariableDeclaration();
 
   const ClFlags &getFlags() const { return Flags; }
 
@@ -268,7 +257,6 @@
   std::unique_ptr<ELFObjectWriter> ObjectWriter;
   CodeStats StatsCumulative;
   std::vector<TimerStack> Timers;
-  std::vector<GlobalDeclaration *> GlobalDeclarations;
 
   LockedPtr<ArenaAllocator<>> getAllocator() {
     return LockedPtr<ArenaAllocator<>>(&Allocator, &AllocLock);
diff --git a/src/IceGlobalInits.cpp b/src/IceGlobalInits.cpp
index 6cf78aa..4f209f8 100644
--- a/src/IceGlobalInits.cpp
+++ b/src/IceGlobalInits.cpp
@@ -60,12 +60,10 @@
 
 namespace Ice {
 
-FunctionDeclaration *
-FunctionDeclaration::create(GlobalContext *Ctx, const FuncSigType &Signature,
-                            llvm::CallingConv::ID CallingConv,
-                            llvm::GlobalValue::LinkageTypes Linkage,
-                            bool IsProto) {
-  return Ctx->newFunctionDeclaration(&Signature, CallingConv, Linkage, IsProto);
+FunctionDeclaration *FunctionDeclaration::create(
+    const FuncSigType &Signature, llvm::CallingConv::ID CallingConv,
+    llvm::GlobalValue::LinkageTypes Linkage, bool IsProto) {
+  return new FunctionDeclaration(Signature, CallingConv, Linkage, IsProto);
 }
 
 void FunctionDeclaration::dumpType(Ostream &Stream) const {
@@ -94,8 +92,8 @@
   Stream << ")";
 }
 
-VariableDeclaration *VariableDeclaration::create(GlobalContext *Ctx) {
-  return Ctx->newVariableDeclaration();
+VariableDeclaration *VariableDeclaration::create() {
+  return new VariableDeclaration();
 }
 
 VariableDeclaration::~VariableDeclaration() {
diff --git a/src/IceGlobalInits.h b/src/IceGlobalInits.h
index 082be3c..0d560a1 100644
--- a/src/IceGlobalInits.h
+++ b/src/IceGlobalInits.h
@@ -91,11 +91,9 @@
 class FunctionDeclaration : public GlobalDeclaration {
   FunctionDeclaration(const FunctionDeclaration &) = delete;
   FunctionDeclaration &operator=(const FunctionDeclaration &) = delete;
-  friend class GlobalContext;
 
 public:
-  static FunctionDeclaration *create(GlobalContext *Ctx,
-                                     const FuncSigType &Signature,
+  static FunctionDeclaration *create(const FuncSigType &Signature,
                                      llvm::CallingConv::ID CallingConv,
                                      llvm::GlobalValue::LinkageTypes Linkage,
                                      bool IsProto);
@@ -129,10 +127,6 @@
 class VariableDeclaration : public GlobalDeclaration {
   VariableDeclaration(const VariableDeclaration &) = delete;
   VariableDeclaration &operator=(const VariableDeclaration &) = delete;
-  friend class GlobalContext;
-  // TODO(kschimpf) Factor out allocation of initializers into the
-  // global context, so that memory allocation/collection can be
-  // optimized.
 public:
   /// Base class for a global variable initializer.
   class Initializer {
@@ -248,7 +242,7 @@
   /// Models the list of initializers.
   typedef std::vector<Initializer *> InitializerListType;
 
-  static VariableDeclaration *create(GlobalContext *Ctx);
+  static VariableDeclaration *create();
   ~VariableDeclaration() final;
 
   const InitializerListType &getInitializers() const { return Initializers; }
diff --git a/src/PNaClTranslator.cpp b/src/PNaClTranslator.cpp
index a405d8b..33dda4b 100644
--- a/src/PNaClTranslator.cpp
+++ b/src/PNaClTranslator.cpp
@@ -334,9 +334,8 @@
   /// Creates Count global variable declarations.
   void CreateGlobalVariables(size_t Count) {
     assert(VariableDeclarations.empty());
-    Ice::GlobalContext *Context = getTranslator().getContext();
     for (size_t i = 0; i < Count; ++i) {
-      VariableDeclarations.push_back(Ice::VariableDeclaration::create(Context));
+      VariableDeclarations.push_back(Ice::VariableDeclaration::create());
     }
   }
 
@@ -846,8 +845,7 @@
       : BlockParserBaseClass(BlockID, EnclosingParser),
         Timer(Ice::TimerStack::TT_parseGlobals, getTranslator().getContext()),
         InitializersNeeded(0), NextGlobalID(0),
-        DummyGlobalVar(
-            Ice::VariableDeclaration::create(getTranslator().getContext())),
+        DummyGlobalVar(Ice::VariableDeclaration::create()),
         CurGlobalVar(DummyGlobalVar) {}
 
   ~GlobalsParser() final {}
@@ -2929,8 +2927,7 @@
       return;
     }
     Ice::FunctionDeclaration *Func = Ice::FunctionDeclaration::create(
-        getTranslator().getContext(), Signature, CallingConv, Linkage,
-        Values[2] == 0);
+        Signature, CallingConv, Linkage, Values[2] == 0);
     if (Values[2] == 0)
       Context->setNextValueIDAsImplementedFunction();
     Context->setNextFunctionID(Func);
