count-pallocs.patch

application/octet-stream

Filename: count-pallocs.patch
Type: application/octet-stream
Part: 0
Message: counting pallocs

Patch

Same data as JSON: GET /api/v1/attachments/:id/patch the parsed metadata as JSON — format, series position, per-file stats; never the diff bytes. API reference →
Format: unified
File+
src/backend/access/common/reloptions.c 2 1
src/backend/access/gist/gistbuildbuffers.c 4 2
src/backend/access/gist/gistbuild.c 6 3
src/backend/access/hash/hashscan.c 2 1
src/backend/access/nbtree/nbtpage.c 2 1
src/backend/access/spgist/spgutils.c 1 1
src/backend/access/transam/multixact.c 1 1
src/backend/access/transam/xact.c 8 4
src/backend/catalog/storage.c 4 2
src/backend/commands/tablespace.c 2 1
src/backend/commands/trigger.c 6 4
src/backend/executor/execGrouping.c 2 1
src/backend/executor/execTuples.c 4 2
src/backend/executor/execUtils.c 1 1
src/backend/executor/nodeHash.c 8 5
src/backend/executor/nodeWindowAgg.c 2 1
src/backend/executor/spi.c 2 1
src/backend/executor/tstoreReceiver.c 4 2
src/backend/libpq/be-fsstubs.c 2 1
src/backend/libpq/be-secure.c 2 1
src/backend/libpq/pqcomm.c 2 1
src/backend/nodes/bitmapset.c 11 9
src/backend/nodes/list.c 41 34
src/backend/nodes/makefuncs.c 14 10
src/backend/nodes/tidbitmap.c 4 2
src/backend/nodes/value.c 2 2
src/backend/optimizer/plan/createplan.c 3 4
src/backend/optimizer/util/plancat.c 3 5
src/backend/parser/parse_relation.c 2 1
src/backend/postmaster/pgstat.c 10 6
src/backend/postmaster/postmaster.c 2 1
src/backend/storage/buffer/localbuf.c 2 1
src/backend/storage/ipc/ipc.c 3 0
src/backend/storage/large_object/inv_api.c 2 1
src/backend/storage/lmgr/lock.c 4 2
src/backend/storage/smgr/md.c 2 1
src/backend/tcop/pquery.c 1 1
src/backend/tsearch/spell.c 2 2
src/backend/utils/adt/arrayfuncs.c 10 5
src/backend/utils/adt/array_typanalyze.c 2 1
src/backend/utils/adt/array_userfuncs.c 4 2
src/backend/utils/adt/domains.c 6 3
src/backend/utils/adt/pgstatfuncs.c 1 1
src/backend/utils/adt/rangetypes.c 2 1
src/backend/utils/adt/rowtypes.c 12 6
src/backend/utils/adt/tsvector_op.c 6 3
src/backend/utils/adt/txid.c 2 1
src/backend/utils/adt/varlena.c 4 2
src/backend/utils/cache/attoptcache.c 2 1
src/backend/utils/cache/inval.c 8 4
src/backend/utils/cache/relcache.c 43 23
src/backend/utils/cache/spccache.c 2 1
src/backend/utils/cache/ts_cache.c 5 3
src/backend/utils/fmgr/fmgr.c 5 3
src/backend/utils/fmgr/funcapi.c 1 1
src/backend/utils/hash/dynahash.c 1 1
src/backend/utils/mb/mbutils.c 2 1
src/backend/utils/misc/guc.c 2 1
src/backend/utils/mmgr/aset.c 91 9
src/backend/utils/mmgr/mcxt.c 14 13
src/backend/utils/mmgr/portalmem.c 2 1
src/backend/utils/resowner/resowner.c 20 10
src/backend/utils/sort/sortsupport.c 2 1
src/backend/utils/time/combocid.c 2 1
src/backend/utils/time/snapmgr.c 5 2
src/include/nodes/bitmapset.h 13 4
src/include/nodes/makefuncs.h 16 6
src/include/nodes/memnodes.h 2 2
src/include/nodes/nodes.h 6 5
src/include/nodes/pg_list.h 37 12
src/include/nodes/value.h 3 1
src/include/utils/memutils.h 13 4
src/include/utils/palloc.h 20 9
src/pl/plpgsql/src/pl_comp.c 4 2
src/pl/plpgsql/src/pl_exec.c 2 1
src/pl/plpython/plpy_util.c 1 1
diff --git a/src/backend/access/common/reloptions.c b/src/backend/access/common/reloptions.c
index 607a80d..ca357e3 100644
--- a/src/backend/access/common/reloptions.c
+++ b/src/backend/access/common/reloptions.c
@@ -288,7 +288,8 @@ initialize_reloptions(void)
 	if (relOpts)
 		pfree(relOpts);
 	relOpts = MemoryContextAlloc(TopMemoryContext,
-								 (j + 1) * sizeof(relopt_gen *));
+								 (j + 1) * sizeof(relopt_gen *),
+								 FileAndLineTag());
 
 	j = 0;
 	for (i = 0; boolRelOpts[i].gen.name; i++)
diff --git a/src/backend/access/gist/gistbuild.c b/src/backend/access/gist/gistbuild.c
index 988896d..494d980 100644
--- a/src/backend/access/gist/gistbuild.c
+++ b/src/backend/access/gist/gistbuild.c
@@ -595,7 +595,8 @@ gistProcessItup(GISTBuildState *buildstate, IndexTuple itup,
 		/* Create new path item representing current page */
 		parent = path;
 		path = (GISTBufferingInsertStack *) MemoryContextAlloc(gfbb->context,
-										   sizeof(GISTBufferingInsertStack));
+										   sizeof(GISTBufferingInsertStack),
+										   FileAndLineTag());
 		path->parent = parent;
 		path->level = parent->level - 1;
 		path->blkno = childblkno;
@@ -684,7 +685,8 @@ gistbufferinginserttuples(GISTBuildState *buildstate, Buffer buffer,
 		BlockNumber leftmostchild;
 
 		gfbb->rootitem = (GISTBufferingInsertStack *) MemoryContextAlloc(
-							gfbb->context, sizeof(GISTBufferingInsertStack));
+							gfbb->context, sizeof(GISTBufferingInsertStack),
+							FileAndLineTag());
 		gfbb->rootitem->parent = NULL;
 		gfbb->rootitem->blkno = GIST_ROOT_BLKNO;
 		gfbb->rootitem->downlinkoffnum = InvalidOffsetNumber;
@@ -828,7 +830,8 @@ gistBufferingFindCorrectParent(GISTBuildState *buildstate,
 		if (!copied)
 		{
 			parent = (GISTBufferingInsertStack *) MemoryContextAlloc(gfbb->context,
-										   sizeof(GISTBufferingInsertStack));
+										   sizeof(GISTBufferingInsertStack),
+										   FileAndLineTag());
 			memcpy(parent, child->parent, sizeof(GISTBufferingInsertStack));
 			if (parent->parent)
 				parent->parent->refCount++;
diff --git a/src/backend/access/gist/gistbuildbuffers.c b/src/backend/access/gist/gistbuildbuffers.c
index 34a12bc..fc0c52f 100644
--- a/src/backend/access/gist/gistbuildbuffers.c
+++ b/src/backend/access/gist/gistbuildbuffers.c
@@ -111,7 +111,8 @@ gistInitBuildBuffers(int pagesPerBuffer, int levelStep, int maxLevel)
 	 * Root path item of the tree. Updated on each root node split.
 	 */
 	gfbb->rootitem = (GISTBufferingInsertStack *) MemoryContextAlloc(
-							gfbb->context, sizeof(GISTBufferingInsertStack));
+							gfbb->context, sizeof(GISTBufferingInsertStack),
+							FileAndLineTag());
 	gfbb->rootitem->parent = NULL;
 	gfbb->rootitem->blkno = GIST_ROOT_BLKNO;
 	gfbb->rootitem->downlinkoffnum = InvalidOffsetNumber;
@@ -235,7 +236,8 @@ gistAllocateNewPageBuffer(GISTBuildBuffers *gfbb)
 	GISTNodeBufferPage *pageBuffer;
 
 	pageBuffer = (GISTNodeBufferPage *) MemoryContextAlloc(gfbb->context,
-														   BLCKSZ);
+														   BLCKSZ,
+														   FileAndLineTag());
 	pageBuffer->prev = InvalidBlockNumber;
 
 	/* Set page free space */
diff --git a/src/backend/access/hash/hashscan.c b/src/backend/access/hash/hashscan.c
index 0f34a3d..8ea6555 100644
--- a/src/backend/access/hash/hashscan.c
+++ b/src/backend/access/hash/hashscan.c
@@ -95,7 +95,8 @@ _hash_regscan(IndexScanDesc scan)
 	HashScanList new_el;
 
 	new_el = (HashScanList) MemoryContextAlloc(TopMemoryContext,
-											   sizeof(HashScanListData));
+											   sizeof(HashScanListData),
+											   FileAndLineTag());
 	new_el->hashsl_scan = scan;
 	new_el->hashsl_owner = CurrentResourceOwner;
 	new_el->hashsl_next = HashScans;
diff --git a/src/backend/access/nbtree/nbtpage.c b/src/backend/access/nbtree/nbtpage.c
index c5e147f..18af76a 100644
--- a/src/backend/access/nbtree/nbtpage.c
+++ b/src/backend/access/nbtree/nbtpage.c
@@ -275,7 +275,8 @@ _bt_getroot(Relation rel, int access)
 		 * Cache the metapage data for next time
 		 */
 		rel->rd_amcache = MemoryContextAlloc(rel->rd_indexcxt,
-											 sizeof(BTMetaPageData));
+											 sizeof(BTMetaPageData),
+											 FileAndLineTag());
 		memcpy(rel->rd_amcache, metad, sizeof(BTMetaPageData));
 
 		/*
diff --git a/src/backend/access/spgist/spgutils.c b/src/backend/access/spgist/spgutils.c
index 46a10f6..a39548d 100644
--- a/src/backend/access/spgist/spgutils.c
+++ b/src/backend/access/spgist/spgutils.c
@@ -52,7 +52,7 @@ spgGetCache(Relation index)
 		SpGistMetaPageData *metadata;
 
 		cache = MemoryContextAllocZero(index->rd_indexcxt,
-									   sizeof(SpGistCache));
+									   sizeof(SpGistCache), FileAndLineTag());
 
 		/* SPGiST doesn't support multi-column indexes */
 		Assert(index->rd_att->natts == 1);
diff --git a/src/backend/access/transam/multixact.c b/src/backend/access/transam/multixact.c
index 8bdf387..2507ce9 100644
--- a/src/backend/access/transam/multixact.c
+++ b/src/backend/access/transam/multixact.c
@@ -1207,7 +1207,7 @@ mXactCachePut(MultiXactId multi, int nxids, TransactionId *xids)
 	entry = (mXactCacheEnt *)
 		MemoryContextAlloc(MXactContext,
 						   offsetof(mXactCacheEnt, xids) +
-						   nxids * sizeof(TransactionId));
+						   nxids * sizeof(TransactionId), FileAndLineTag());
 
 	entry->multi = multi;
 	entry->nxids = nxids;
diff --git a/src/backend/access/transam/xact.c b/src/backend/access/transam/xact.c
index c71a10e..d35f5bc 100644
--- a/src/backend/access/transam/xact.c
+++ b/src/backend/access/transam/xact.c
@@ -1328,7 +1328,8 @@ AtSubCommit_childXids(void)
 		if (s->parent->childXids == NULL)
 			new_childXids =
 				MemoryContextAlloc(TopTransactionContext,
-								   new_maxChildXids * sizeof(TransactionId));
+								   new_maxChildXids * sizeof(TransactionId),
+								   FileAndLineTag());
 		else
 			new_childXids = repalloc(s->parent->childXids,
 								   new_maxChildXids * sizeof(TransactionId));
@@ -3034,7 +3035,8 @@ RegisterXactCallback(XactCallback callback, void *arg)
 	XactCallbackItem *item;
 
 	item = (XactCallbackItem *)
-		MemoryContextAlloc(TopMemoryContext, sizeof(XactCallbackItem));
+		MemoryContextAlloc(TopMemoryContext, sizeof(XactCallbackItem),
+						   FileAndLineTag());
 	item->callback = callback;
 	item->arg = arg;
 	item->next = Xact_callbacks;
@@ -3089,7 +3091,8 @@ RegisterSubXactCallback(SubXactCallback callback, void *arg)
 	SubXactCallbackItem *item;
 
 	item = (SubXactCallbackItem *)
-		MemoryContextAlloc(TopMemoryContext, sizeof(SubXactCallbackItem));
+		MemoryContextAlloc(TopMemoryContext, sizeof(SubXactCallbackItem),
+						   FileAndLineTag());
 	item->callback = callback;
 	item->arg = arg;
 	item->next = SubXact_callbacks;
@@ -4298,7 +4301,8 @@ PushTransaction(void)
 	 */
 	s = (TransactionState)
 		MemoryContextAllocZero(TopTransactionContext,
-							   sizeof(TransactionStateData));
+							   sizeof(TransactionStateData),
+							   FileAndLineTag());
 
 	/*
 	 * Assign a subtransaction ID, watching out for counter wraparound.
diff --git a/src/backend/catalog/storage.c b/src/backend/catalog/storage.c
index a017101..d17e66e 100644
--- a/src/backend/catalog/storage.c
+++ b/src/backend/catalog/storage.c
@@ -130,7 +130,8 @@ RelationCreateStorage(RelFileNode rnode, char relpersistence)
 
 	/* Add the relation to the list of stuff to delete at abort */
 	pending = (PendingRelDelete *)
-		MemoryContextAlloc(TopMemoryContext, sizeof(PendingRelDelete));
+		MemoryContextAlloc(TopMemoryContext, sizeof(PendingRelDelete),
+						   FileAndLineTag());
 	pending->relnode = rnode;
 	pending->backend = backend;
 	pending->atCommit = false;	/* delete if abort */
@@ -173,7 +174,8 @@ RelationDropStorage(Relation rel)
 
 	/* Add the relation to the list of stuff to delete at commit */
 	pending = (PendingRelDelete *)
-		MemoryContextAlloc(TopMemoryContext, sizeof(PendingRelDelete));
+		MemoryContextAlloc(TopMemoryContext, sizeof(PendingRelDelete),
+						   FileAndLineTag());
 	pending->relnode = rel->rd_node;
 	pending->backend = rel->rd_backend;
 	pending->atCommit = true;	/* delete if commit */
diff --git a/src/backend/commands/tablespace.c b/src/backend/commands/tablespace.c
index 708bebb..12afd94 100644
--- a/src/backend/commands/tablespace.c
+++ b/src/backend/commands/tablespace.c
@@ -1324,7 +1324,8 @@ PrepareTempTablespaces(void)
 
 	/* Store tablespace OIDs in an array in TopTransactionContext */
 	tblSpcs = (Oid *) MemoryContextAlloc(TopTransactionContext,
-										 list_length(namelist) * sizeof(Oid));
+										 list_length(namelist) * sizeof(Oid),
+										 FileAndLineTag());
 	numSpcs = 0;
 	foreach(l, namelist)
 	{
diff --git a/src/backend/commands/trigger.c b/src/backend/commands/trigger.c
index 1218d03..97482d0 100644
--- a/src/backend/commands/trigger.c
+++ b/src/backend/commands/trigger.c
@@ -3171,7 +3171,8 @@ afterTriggerAddEvent(AfterTriggerEventList *events,
 				chunksize /= 2; /* too many shared records */
 			chunksize = Min(chunksize, MAX_CHUNK_SIZE);
 		}
-		chunk = MemoryContextAlloc(afterTriggers->event_cxt, chunksize);
+		chunk = MemoryContextAlloc(afterTriggers->event_cxt, chunksize,
+								   FileAndLineTag());
 		chunk->next = NULL;
 		chunk->freeptr = CHUNK_DATA_START(chunk);
 		chunk->endptr = chunk->endfree = (char *) chunk + chunksize;
@@ -3635,7 +3636,7 @@ AfterTriggerBeginXact(void)
 	 */
 	afterTriggers = (AfterTriggers)
 		MemoryContextAlloc(TopTransactionContext,
-						   sizeof(AfterTriggersData));
+						   sizeof(AfterTriggersData), FileAndLineTag());
 
 	afterTriggers->firing_counter = (CommandId) 1;		/* mustn't be 0 */
 	afterTriggers->state = SetConstraintStateCreate(8);
@@ -3647,7 +3648,7 @@ AfterTriggerBeginXact(void)
 	/* We initialize the query stack to a reasonable size */
 	afterTriggers->query_stack = (AfterTriggerEventList *)
 		MemoryContextAlloc(TopTransactionContext,
-						   8 * sizeof(AfterTriggerEventList));
+						   8 * sizeof(AfterTriggerEventList), FileAndLineTag());
 	afterTriggers->maxquerydepth = 8;
 
 	/* Context for events is created only when needed */
@@ -4050,7 +4051,8 @@ SetConstraintStateCreate(int numalloc)
 	state = (SetConstraintState)
 		MemoryContextAllocZero(TopTransactionContext,
 							   sizeof(SetConstraintStateData) +
-						   (numalloc - 1) *sizeof(SetConstraintTriggerData));
+						   (numalloc - 1) *sizeof(SetConstraintTriggerData),
+							FileAndLineTag());
 
 	state->numalloc = numalloc;
 
diff --git a/src/backend/executor/execGrouping.c b/src/backend/executor/execGrouping.c
index bd7973e..096eb85 100644
--- a/src/backend/executor/execGrouping.c
+++ b/src/backend/executor/execGrouping.c
@@ -288,7 +288,8 @@ BuildTupleHashTable(int numCols, AttrNumber *keyColIdx,
 	nbuckets = Min(nbuckets, (long) ((work_mem * 1024L) / entrysize));
 
 	hashtable = (TupleHashTable) MemoryContextAlloc(tablecxt,
-												 sizeof(TupleHashTableData));
+												 sizeof(TupleHashTableData),
+												 FileAndLineTag());
 
 	hashtable->numCols = numCols;
 	hashtable->keyColIdx = keyColIdx;
diff --git a/src/backend/executor/execTuples.c b/src/backend/executor/execTuples.c
index e755e7c..81fc248 100644
--- a/src/backend/executor/execTuples.c
+++ b/src/backend/executor/execTuples.c
@@ -281,9 +281,11 @@ ExecSetSlotDescriptor(TupleTableSlot *slot,		/* slot to change */
 	 * the same lifetime as the slot, so allocate in the slot's own context.
 	 */
 	slot->tts_values = (Datum *)
-		MemoryContextAlloc(slot->tts_mcxt, tupdesc->natts * sizeof(Datum));
+		MemoryContextAlloc(slot->tts_mcxt, tupdesc->natts * sizeof(Datum),
+						   FileAndLineTag());
 	slot->tts_isnull = (bool *)
-		MemoryContextAlloc(slot->tts_mcxt, tupdesc->natts * sizeof(bool));
+		MemoryContextAlloc(slot->tts_mcxt, tupdesc->natts * sizeof(bool),
+						   FileAndLineTag());
 }
 
 /* --------------------------------
diff --git a/src/backend/executor/execUtils.c b/src/backend/executor/execUtils.c
index 40cd5ce..7eb41b4 100644
--- a/src/backend/executor/execUtils.c
+++ b/src/backend/executor/execUtils.c
@@ -1404,7 +1404,7 @@ RegisterExprContextCallback(ExprContext *econtext,
 	/* Save the info in appropriate memory context */
 	ecxt_callback = (ExprContext_CB *)
 		MemoryContextAlloc(econtext->ecxt_per_query_memory,
-						   sizeof(ExprContext_CB));
+						   sizeof(ExprContext_CB), FileAndLineTag());
 
 	ecxt_callback->function = function;
 	ecxt_callback->arg = arg;
diff --git a/src/backend/executor/nodeHash.c b/src/backend/executor/nodeHash.c
index cabe663..7455276 100644
--- a/src/backend/executor/nodeHash.c
+++ b/src/backend/executor/nodeHash.c
@@ -715,7 +715,8 @@ ExecHashTableInsert(HashJoinTable hashtable,
 		/* Create the HashJoinTuple */
 		hashTupleSize = HJTUPLE_OVERHEAD + tuple->t_len;
 		hashTuple = (HashJoinTuple) MemoryContextAlloc(hashtable->batchCxt,
-													   hashTupleSize);
+													   hashTupleSize,
+													   FileAndLineTag());
 		hashTuple->hashvalue = hashvalue;
 		memcpy(HJTUPLE_MINTUPLE(hashTuple), tuple, tuple->t_len);
 
@@ -1200,10 +1201,11 @@ ExecHashBuildSkewHash(HashJoinTable hashtable, Hash *node, int mcvsToUse)
 		 */
 		hashtable->skewBucket = (HashSkewBucket **)
 			MemoryContextAllocZero(hashtable->batchCxt,
-								   nbuckets * sizeof(HashSkewBucket *));
+								   nbuckets * sizeof(HashSkewBucket *),
+								   FileAndLineTag());
 		hashtable->skewBucketNums = (int *)
 			MemoryContextAllocZero(hashtable->batchCxt,
-								   mcvsToUse * sizeof(int));
+								   mcvsToUse * sizeof(int), FileAndLineTag());
 
 		hashtable->spaceUsed += nbuckets * sizeof(HashSkewBucket *)
 			+ mcvsToUse * sizeof(int);
@@ -1252,7 +1254,7 @@ ExecHashBuildSkewHash(HashJoinTable hashtable, Hash *node, int mcvsToUse)
 			/* Okay, create a new skew bucket for this hashvalue. */
 			hashtable->skewBucket[bucket] = (HashSkewBucket *)
 				MemoryContextAlloc(hashtable->batchCxt,
-								   sizeof(HashSkewBucket));
+								   sizeof(HashSkewBucket), FileAndLineTag());
 			hashtable->skewBucket[bucket]->hashvalue = hashvalue;
 			hashtable->skewBucket[bucket]->tuples = NULL;
 			hashtable->skewBucketNums[hashtable->nSkewBuckets] = bucket;
@@ -1336,7 +1338,8 @@ ExecHashSkewTableInsert(HashJoinTable hashtable,
 	/* Create the HashJoinTuple */
 	hashTupleSize = HJTUPLE_OVERHEAD + tuple->t_len;
 	hashTuple = (HashJoinTuple) MemoryContextAlloc(hashtable->batchCxt,
-												   hashTupleSize);
+												   hashTupleSize,
+												   FileAndLineTag());
 	hashTuple->hashvalue = hashvalue;
 	memcpy(HJTUPLE_MINTUPLE(hashTuple), tuple, tuple->t_len);
 	HeapTupleHeaderClearMatch(HJTUPLE_MINTUPLE(hashTuple));
diff --git a/src/backend/executor/nodeWindowAgg.c b/src/backend/executor/nodeWindowAgg.c
index ce89ff2..8073fd7 100644
--- a/src/backend/executor/nodeWindowAgg.c
+++ b/src/backend/executor/nodeWindowAgg.c
@@ -1980,7 +1980,8 @@ WinGetPartitionLocalMemory(WindowObject winobj, Size sz)
 	Assert(WindowObjectIsValid(winobj));
 	if (winobj->localmem == NULL)
 		winobj->localmem =
-			MemoryContextAllocZero(winobj->winstate->partcontext, sz);
+			MemoryContextAllocZero(winobj->winstate->partcontext, sz,
+								   FileAndLineTag());
 	return winobj->localmem;
 }
 
diff --git a/src/backend/executor/spi.c b/src/backend/executor/spi.c
index 5e4ae42..5f402d9 100644
--- a/src/backend/executor/spi.c
+++ b/src/backend/executor/spi.c
@@ -97,7 +97,8 @@ SPI_connect(void)
 		newdepth = 16;
 		_SPI_stack = (_SPI_connection *)
 			MemoryContextAlloc(TopTransactionContext,
-							   newdepth * sizeof(_SPI_connection));
+							   newdepth * sizeof(_SPI_connection),
+							   FileAndLineTag());
 		_SPI_stack_depth = newdepth;
 	}
 	else
diff --git a/src/backend/executor/tstoreReceiver.c b/src/backend/executor/tstoreReceiver.c
index c98ff2b..8acdd55 100644
--- a/src/backend/executor/tstoreReceiver.c
+++ b/src/backend/executor/tstoreReceiver.c
@@ -74,9 +74,11 @@ tstoreStartupReceiver(DestReceiver *self, int operation, TupleDesc typeinfo)
 		myState->pub.receiveSlot = tstoreReceiveSlot_detoast;
 		/* Create workspace */
 		myState->outvalues = (Datum *)
-			MemoryContextAlloc(myState->cxt, natts * sizeof(Datum));
+			MemoryContextAlloc(myState->cxt, natts * sizeof(Datum),
+			FileAndLineTag());
 		myState->tofree = (Datum *)
-			MemoryContextAlloc(myState->cxt, natts * sizeof(Datum));
+			MemoryContextAlloc(myState->cxt, natts * sizeof(Datum),
+			FileAndLineTag());
 	}
 	else
 	{
diff --git a/src/backend/libpq/be-fsstubs.c b/src/backend/libpq/be-fsstubs.c
index 6f7e474..de07a27 100644
--- a/src/backend/libpq/be-fsstubs.c
+++ b/src/backend/libpq/be-fsstubs.c
@@ -635,7 +635,8 @@ newLOfd(LargeObjectDesc *lobjCookie)
 		i = 0;
 		newsize = 64;
 		cookies = (LargeObjectDesc **)
-			MemoryContextAllocZero(fscxt, newsize * sizeof(LargeObjectDesc *));
+			MemoryContextAllocZero(fscxt, newsize * sizeof(LargeObjectDesc *),
+								   FileAndLineTag());
 		cookies_size = newsize;
 	}
 	else
diff --git a/src/backend/libpq/be-secure.c b/src/backend/libpq/be-secure.c
index dce0eaa..bc5fcbb 100644
--- a/src/backend/libpq/be-secure.c
+++ b/src/backend/libpq/be-secure.c
@@ -961,7 +961,8 @@ aloop:
 		{
 			char	   *peer_cn;
 
-			peer_cn = MemoryContextAlloc(TopMemoryContext, len + 1);
+			peer_cn = MemoryContextAlloc(TopMemoryContext, len + 1,
+										 FileAndLineTag());
 			r = X509_NAME_get_text_by_NID(X509_get_subject_name(port->peer),
 										  NID_commonName, peer_cn, len + 1);
 			peer_cn[len] = '\0';
diff --git a/src/backend/libpq/pqcomm.c b/src/backend/libpq/pqcomm.c
index 2082e3d..731391d 100644
--- a/src/backend/libpq/pqcomm.c
+++ b/src/backend/libpq/pqcomm.c
@@ -153,7 +153,8 @@ void
 pq_init(void)
 {
 	PqSendBufferSize = PQ_SEND_BUFFER_SIZE;
-	PqSendBuffer = MemoryContextAlloc(TopMemoryContext, PqSendBufferSize);
+	PqSendBuffer = MemoryContextAlloc(TopMemoryContext, PqSendBufferSize,
+									  FileAndLineTag());
 	PqSendPointer = PqSendStart = PqRecvPointer = PqRecvLength = 0;
 	PqCommBusy = false;
 	DoingCopyOut = false;
diff --git a/src/backend/nodes/bitmapset.c b/src/backend/nodes/bitmapset.c
index 4c904e0..68f65fc 100644
--- a/src/backend/nodes/bitmapset.c
+++ b/src/backend/nodes/bitmapset.c
@@ -107,7 +107,7 @@ static const uint8 number_of_ones[256] = {
  * bms_copy - make a palloc'd copy of a bitmapset
  */
 Bitmapset *
-bms_copy(const Bitmapset *a)
+bms_copy_really(const Bitmapset *a, const char *tag)
 {
 	Bitmapset  *result;
 	size_t		size;
@@ -115,7 +115,7 @@ bms_copy(const Bitmapset *a)
 	if (a == NULL)
 		return NULL;
 	size = BITMAPSET_SIZE(a->nwords);
-	result = (Bitmapset *) palloc(size);
+	result = (Bitmapset *) MemoryContextAlloc(CurrentMemoryContext, size, tag);
 	memcpy(result, a, size);
 	return result;
 }
@@ -175,7 +175,7 @@ bms_equal(const Bitmapset *a, const Bitmapset *b)
  * bms_make_singleton - build a bitmapset containing a single member
  */
 Bitmapset *
-bms_make_singleton(int x)
+bms_make_singleton_really(int x, const char *tag)
 {
 	Bitmapset  *result;
 	int			wordnum,
@@ -185,7 +185,9 @@ bms_make_singleton(int x)
 		elog(ERROR, "negative bitmapset member not allowed");
 	wordnum = WORDNUM(x);
 	bitnum = BITNUM(x);
-	result = (Bitmapset *) palloc0(BITMAPSET_SIZE(wordnum + 1));
+	result = (Bitmapset *) MemoryContextAllocZero(CurrentMemoryContext,
+												  BITMAPSET_SIZE(wordnum + 1),
+												  tag);
 	result->nwords = wordnum + 1;
 	result->words[wordnum] = ((bitmapword) 1 << bitnum);
 	return result;
@@ -621,7 +623,7 @@ bms_is_empty(const Bitmapset *a)
  * Input set is modified or recycled!
  */
 Bitmapset *
-bms_add_member(Bitmapset *a, int x)
+bms_add_member_really(Bitmapset *a, int x, const char *tag)
 {
 	int			wordnum,
 				bitnum;
@@ -629,7 +631,7 @@ bms_add_member(Bitmapset *a, int x)
 	if (x < 0)
 		elog(ERROR, "negative bitmapset member not allowed");
 	if (a == NULL)
-		return bms_make_singleton(x);
+		return bms_make_singleton_really(x, tag);
 	wordnum = WORDNUM(x);
 	bitnum = BITNUM(x);
 	if (wordnum >= a->nwords)
@@ -679,7 +681,7 @@ bms_del_member(Bitmapset *a, int x)
  * bms_add_members - like bms_union, but left input is recycled
  */
 Bitmapset *
-bms_add_members(Bitmapset *a, const Bitmapset *b)
+bms_add_members_really(Bitmapset *a, const Bitmapset *b, const char *tag)
 {
 	Bitmapset  *result;
 	const Bitmapset *other;
@@ -688,13 +690,13 @@ bms_add_members(Bitmapset *a, const Bitmapset *b)
 
 	/* Handle cases where either input is NULL */
 	if (a == NULL)
-		return bms_copy(b);
+		return bms_copy_really(b, tag);
 	if (b == NULL)
 		return a;
 	/* Identify shorter and longer input; copy the longer one if needed */
 	if (a->nwords < b->nwords)
 	{
-		result = bms_copy(b);
+		result = bms_copy_really(b, tag);
 		other = a;
 	}
 	else
diff --git a/src/backend/nodes/list.c b/src/backend/nodes/list.c
index 209b722..3c9f94d 100644
--- a/src/backend/nodes/list.c
+++ b/src/backend/nodes/list.c
@@ -60,16 +60,18 @@ check_list_invariants(const List *list)
  * the caller should be sure to fill in that cell's data.
  */
 static List *
-new_list(NodeTag type)
+new_list(NodeTag type, const char *tag)
 {
 	List	   *new_list;
 	ListCell   *new_head;
 
-	new_head = (ListCell *) palloc(sizeof(*new_head));
+	new_head = (ListCell *) MemoryContextAlloc(CurrentMemoryContext,
+											   sizeof(*new_head), tag);
 	new_head->next = NULL;
 	/* new_head->data is left undefined! */
 
-	new_list = (List *) palloc(sizeof(*new_list));
+	new_list = (List *) MemoryContextAlloc(CurrentMemoryContext,
+										   sizeof(*new_list), tag);
 	new_list->type = type;
 	new_list->length = 1;
 	new_list->head = new_head;
@@ -105,11 +107,12 @@ new_head_cell(List *list)
  * sure to fill it in
  */
 static void
-new_tail_cell(List *list)
+new_tail_cell(List *list, const char *tag)
 {
 	ListCell   *new_tail;
 
-	new_tail = (ListCell *) palloc(sizeof(*new_tail));
+	new_tail = (ListCell *) MemoryContextAlloc(CurrentMemoryContext,
+											   sizeof(*new_tail), tag);
 	new_tail->next = NULL;
 
 	list->tail->next = new_tail;
@@ -125,14 +128,14 @@ new_tail_cell(List *list)
  * first argument.
  */
 List *
-lappend(List *list, void *datum)
+lappend_really(List *list, void *datum, const char *tag)
 {
 	Assert(IsPointerList(list));
 
 	if (list == NIL)
-		list = new_list(T_List);
+		list = new_list(T_List, tag);
 	else
-		new_tail_cell(list);
+		new_tail_cell(list, tag);
 
 	lfirst(list->tail) = datum;
 	check_list_invariants(list);
@@ -143,14 +146,14 @@ lappend(List *list, void *datum)
  * Append an integer to the specified list. See lappend()
  */
 List *
-lappend_int(List *list, int datum)
+lappend_int_really(List *list, int datum, const char *tag)
 {
 	Assert(IsIntegerList(list));
 
 	if (list == NIL)
-		list = new_list(T_IntList);
+		list = new_list(T_IntList, tag);
 	else
-		new_tail_cell(list);
+		new_tail_cell(list, tag);
 
 	lfirst_int(list->tail) = datum;
 	check_list_invariants(list);
@@ -161,14 +164,14 @@ lappend_int(List *list, int datum)
  * Append an OID to the specified list. See lappend()
  */
 List *
-lappend_oid(List *list, Oid datum)
+lappend_oid_really(List *list, Oid datum, const char *tag)
 {
 	Assert(IsOidList(list));
 
 	if (list == NIL)
-		list = new_list(T_OidList);
+		list = new_list(T_OidList, tag);
 	else
-		new_tail_cell(list);
+		new_tail_cell(list, tag);
 
 	lfirst_oid(list->tail) = datum;
 	check_list_invariants(list);
@@ -256,12 +259,12 @@ lappend_cell_oid(List *list, ListCell *prev, Oid datum)
  * the case.
  */
 List *
-lcons(void *datum, List *list)
+lcons_really(void *datum, List *list, const char *tag)
 {
 	Assert(IsPointerList(list));
 
 	if (list == NIL)
-		list = new_list(T_List);
+		list = new_list(T_List, tag);
 	else
 		new_head_cell(list);
 
@@ -274,12 +277,12 @@ lcons(void *datum, List *list)
  * Prepend an integer to the list. See lcons()
  */
 List *
-lcons_int(int datum, List *list)
+lcons_int_really(int datum, List *list, const char *tag)
 {
 	Assert(IsIntegerList(list));
 
 	if (list == NIL)
-		list = new_list(T_IntList);
+		list = new_list(T_IntList, tag);
 	else
 		new_head_cell(list);
 
@@ -292,12 +295,12 @@ lcons_int(int datum, List *list)
  * Prepend an OID to the list. See lcons()
  */
 List *
-lcons_oid(Oid datum, List *list)
+lcons_oid_really(Oid datum, List *list, const char *tag)
 {
 	Assert(IsOidList(list));
 
 	if (list == NIL)
-		list = new_list(T_OidList);
+		list = new_list(T_OidList, tag);
 	else
 		new_head_cell(list);
 
@@ -933,12 +936,12 @@ list_difference_oid(const List *list1, const List *list2)
  * via equal().
  */
 List *
-list_append_unique(List *list, void *datum)
+list_append_unique_really(List *list, void *datum, const char *tag)
 {
 	if (list_member(list, datum))
 		return list;
 	else
-		return lappend(list, datum);
+		return lappend_really(list, datum, tag);
 }
 
 /*
@@ -946,36 +949,36 @@ list_append_unique(List *list, void *datum)
  * simple pointer equality.
  */
 List *
-list_append_unique_ptr(List *list, void *datum)
+list_append_unique_ptr_really(List *list, void *datum, const char *tag)
 {
 	if (list_member_ptr(list, datum))
 		return list;
 	else
-		return lappend(list, datum);
+		return lappend_really(list, datum, tag);
 }
 
 /*
  * This variant of list_append_unique() operates upon lists of integers.
  */
 List *
-list_append_unique_int(List *list, int datum)
+list_append_unique_int_really(List *list, int datum, const char *tag)
 {
 	if (list_member_int(list, datum))
 		return list;
 	else
-		return lappend_int(list, datum);
+		return lappend_int_really(list, datum, tag);
 }
 
 /*
  * This variant of list_append_unique() operates upon lists of OIDs.
  */
 List *
-list_append_unique_oid(List *list, Oid datum)
+list_append_unique_oid_really(List *list, Oid datum, const char *tag)
 {
 	if (list_member_oid(list, datum))
 		return list;
 	else
-		return lappend_oid(list, datum);
+		return lappend_oid_really(list, datum, tag);
 }
 
 /*
@@ -1131,7 +1134,7 @@ list_free_deep(List *list)
  * Return a shallow copy of the specified list.
  */
 List *
-list_copy(const List *oldlist)
+list_copy_really(const List *oldlist, const char *tag)
 {
 	List	   *newlist;
 	ListCell   *newlist_prev;
@@ -1140,7 +1143,7 @@ list_copy(const List *oldlist)
 	if (oldlist == NIL)
 		return NIL;
 
-	newlist = new_list(oldlist->type);
+	newlist = new_list(oldlist->type, tag);
 	newlist->length = oldlist->length;
 
 	/*
@@ -1155,7 +1158,9 @@ list_copy(const List *oldlist)
 	{
 		ListCell   *newlist_cur;
 
-		newlist_cur = (ListCell *) palloc(sizeof(*newlist_cur));
+		newlist_cur = (ListCell *) MemoryContextAlloc(CurrentMemoryContext,
+													  sizeof(*newlist_cur),
+													  tag);
 		newlist_cur->data = oldlist_cur->data;
 		newlist_prev->next = newlist_cur;
 
@@ -1174,7 +1179,7 @@ list_copy(const List *oldlist)
  * Return a shallow copy of the specified list, without the first N elements.
  */
 List *
-list_copy_tail(const List *oldlist, int nskip)
+list_copy_tail_really(const List *oldlist, int nskip, const char *tag)
 {
 	List	   *newlist;
 	ListCell   *newlist_prev;
@@ -1186,7 +1191,7 @@ list_copy_tail(const List *oldlist, int nskip)
 	if (oldlist == NIL || nskip >= oldlist->length)
 		return NIL;
 
-	newlist = new_list(oldlist->type);
+	newlist = new_list(oldlist->type, tag);
 	newlist->length = oldlist->length - nskip;
 
 	/*
@@ -1208,7 +1213,9 @@ list_copy_tail(const List *oldlist, int nskip)
 	{
 		ListCell   *newlist_cur;
 
-		newlist_cur = (ListCell *) palloc(sizeof(*newlist_cur));
+		newlist_cur = (ListCell *) MemoryContextAlloc(CurrentMemoryContext,
+													  sizeof(*newlist_cur),
+													  tag);
 		newlist_cur->data = oldlist_cur->data;
 		newlist_prev->next = newlist_cur;
 
diff --git a/src/backend/nodes/makefuncs.c b/src/backend/nodes/makefuncs.c
index bb5cdae..2da407c 100644
--- a/src/backend/nodes/makefuncs.c
+++ b/src/backend/nodes/makefuncs.c
@@ -63,14 +63,15 @@ makeSimpleA_Expr(A_Expr_Kind kind, char *name,
  *	  creates a Var node
  */
 Var *
-makeVar(Index varno,
+makeVar_really(Index varno,
 		AttrNumber varattno,
 		Oid vartype,
 		int32 vartypmod,
 		Oid varcollid,
-		Index varlevelsup)
+		Index varlevelsup,
+		const char *tag)
 {
-	Var		   *var = makeNode(Var);
+	Var		   *var = makeNodeWithTag(Var, tag);
 
 	var->varno = varno;
 	var->varattno = varattno;
@@ -100,15 +101,16 @@ makeVar(Index varno,
  *		TargetEntry
  */
 Var *
-makeVarFromTargetEntry(Index varno,
-					   TargetEntry *tle)
+makeVarFromTargetEntry_really(Index varno,
+					   TargetEntry *tle,
+					   const char *tag)
 {
-	return makeVar(varno,
+	return makeVar_really(varno,
 				   tle->resno,
 				   exprType((Node *) tle->expr),
 				   exprTypmod((Node *) tle->expr),
 				   exprCollation((Node *) tle->expr),
-				   0);
+				   0, tag);
 }
 
 /*
@@ -209,13 +211,15 @@ makeWholeRowVar(RangeTblEntry *rte,
  *	  creates a TargetEntry node
  */
 TargetEntry *
-makeTargetEntry(Expr *expr,
+makeTargetEntry_really(Expr *expr,
 				AttrNumber resno,
 				char *resname,
-				bool resjunk)
+				bool resjunk,
+				const char *tag)
 {
-	TargetEntry *tle = makeNode(TargetEntry);
+	TargetEntry *tle;
 
+	tle = makeNodeWithTag(TargetEntry, tag);
 	tle->expr = expr;
 	tle->resno = resno;
 	tle->resname = resname;
diff --git a/src/backend/nodes/tidbitmap.c b/src/backend/nodes/tidbitmap.c
index 17dae0d..79d2e25 100644
--- a/src/backend/nodes/tidbitmap.c
+++ b/src/backend/nodes/tidbitmap.c
@@ -598,11 +598,13 @@ tbm_begin_iterate(TIDBitmap *tbm)
 		if (!tbm->spages && tbm->npages > 0)
 			tbm->spages = (PagetableEntry **)
 				MemoryContextAlloc(tbm->mcxt,
-								   tbm->npages * sizeof(PagetableEntry *));
+								   tbm->npages * sizeof(PagetableEntry *),
+								   FileAndLineTag());
 		if (!tbm->schunks && tbm->nchunks > 0)
 			tbm->schunks = (PagetableEntry **)
 				MemoryContextAlloc(tbm->mcxt,
-								   tbm->nchunks * sizeof(PagetableEntry *));
+								   tbm->nchunks * sizeof(PagetableEntry *),
+								   FileAndLineTag());
 
 		hash_seq_init(&status, tbm->pagetable);
 		npages = nchunks = 0;
diff --git a/src/backend/nodes/value.c b/src/backend/nodes/value.c
index 2788e0e..59bce3f 100644
--- a/src/backend/nodes/value.c
+++ b/src/backend/nodes/value.c
@@ -50,9 +50,9 @@ makeFloat(char *numericStr)
  * Caller is responsible for passing a palloc'd string.
  */
 Value *
-makeString(char *str)
+makeString_really(char *str, const char *tag)
 {
-	Value	   *v = makeNode(Value);
+	Value	   *v = makeNodeWithTag(Value, tag);
 
 	v->type = T_String;
 	v->val.str = str;
diff --git a/src/backend/optimizer/plan/createplan.c b/src/backend/optimizer/plan/createplan.c
index c34b9b8..c513cf3 100644
--- a/src/backend/optimizer/plan/createplan.c
+++ b/src/backend/optimizer/plan/createplan.c
@@ -428,11 +428,10 @@ build_relation_tlist(RelOptInfo *rel)
 	{
 		/* Do we really need to copy here?	Not sure */
 		Node	   *node = (Node *) copyObject(lfirst(v));
+		TargetEntry *tle;
 
-		tlist = lappend(tlist, makeTargetEntry((Expr *) node,
-											   resno,
-											   NULL,
-											   false));
+		tle = makeTargetEntry((Expr *) node, resno, NULL, false);
+		tlist = lappend(tlist, tle);
 		resno++;
 	}
 	return tlist;
diff --git a/src/backend/optimizer/util/plancat.c b/src/backend/optimizer/util/plancat.c
index aaf288a..bfab467 100644
--- a/src/backend/optimizer/util/plancat.c
+++ b/src/backend/optimizer/util/plancat.c
@@ -850,6 +850,7 @@ build_physical_tlist(PlannerInfo *root, RelOptInfo *rel)
 			for (attrno = 1; attrno <= numattrs; attrno++)
 			{
 				Form_pg_attribute att_tup = relation->rd_att->attrs[attrno - 1];
+				TargetEntry *tle;
 
 				if (att_tup->attisdropped)
 				{
@@ -865,11 +866,8 @@ build_physical_tlist(PlannerInfo *root, RelOptInfo *rel)
 							  att_tup->attcollation,
 							  0);
 
-				tlist = lappend(tlist,
-								makeTargetEntry((Expr *) var,
-												attrno,
-												NULL,
-												false));
+				tle = makeTargetEntry((Expr *) var, attrno, NULL, false);
+				tlist = lappend(tlist, tle);
 			}
 
 			heap_close(relation, NoLock);
diff --git a/src/backend/parser/parse_relation.c b/src/backend/parser/parse_relation.c
index 2a26b0a..475cc1c 100644
--- a/src/backend/parser/parse_relation.c
+++ b/src/backend/parser/parse_relation.c
@@ -746,7 +746,8 @@ buildRelationAliases(TupleDesc tupdesc, Alias *alias, Alias *eref)
 		}
 		else
 		{
-			attrname = makeString(pstrdup(NameStr(attr->attname)));
+			char *x = pstrdup(NameStr(attr->attname));
+			attrname = makeString(x);
 			/* we're done with the alias if any */
 		}
 
diff --git a/src/backend/postmaster/pgstat.c b/src/backend/postmaster/pgstat.c
index 424cfca..cd4b3b2 100644
--- a/src/backend/postmaster/pgstat.c
+++ b/src/backend/postmaster/pgstat.c
@@ -1629,7 +1629,8 @@ get_tabstat_entry(Oid rel_id, bool isshared)
 	 * We ran out of tabstat slots, so allocate more.  Be sure they're zeroed.
 	 */
 	tsa = (TabStatusArray *) MemoryContextAllocZero(TopMemoryContext,
-													sizeof(TabStatusArray));
+													sizeof(TabStatusArray),
+													FileAndLineTag());
 	if (prev_tsa)
 		prev_tsa->tsa_next = tsa;
 	else
@@ -1683,7 +1684,7 @@ get_tabstat_stack_level(int nest_level)
 	{
 		xact_state = (PgStat_SubXactStatus *)
 			MemoryContextAlloc(TopTransactionContext,
-							   sizeof(PgStat_SubXactStatus));
+							   sizeof(PgStat_SubXactStatus), FileAndLineTag());
 		xact_state->nest_level = nest_level;
 		xact_state->prev = pgStatXactStack;
 		xact_state->first = NULL;
@@ -1710,7 +1711,8 @@ add_tabstat_xact_level(PgStat_TableStatus *pgstat_info, int nest_level)
 	/* Now make a per-table stack entry */
 	trans = (PgStat_TableXactStatus *)
 		MemoryContextAllocZero(TopTransactionContext,
-							   sizeof(PgStat_TableXactStatus));
+							   sizeof(PgStat_TableXactStatus),
+							   FileAndLineTag());
 	trans->nest_level = nest_level;
 	trans->upper = pgstat_info->trans;
 	trans->parent = pgstat_info;
@@ -2696,13 +2698,15 @@ pgstat_read_current_status(void)
 
 	localtable = (PgBackendStatus *)
 		MemoryContextAlloc(pgStatLocalContext,
-						   sizeof(PgBackendStatus) * MaxBackends);
+						   sizeof(PgBackendStatus) * MaxBackends,
+						   FileAndLineTag());
 	localappname = (char *)
 		MemoryContextAlloc(pgStatLocalContext,
-						   NAMEDATALEN * MaxBackends);
+						   NAMEDATALEN * MaxBackends, FileAndLineTag());
 	localactivity = (char *)
 		MemoryContextAlloc(pgStatLocalContext,
-						   pgstat_track_activity_query_size * MaxBackends);
+						   pgstat_track_activity_query_size * MaxBackends,
+						   FileAndLineTag());
 	localNumBackends = 0;
 
 	beentry = BackendStatusArray;
diff --git a/src/backend/postmaster/postmaster.c b/src/backend/postmaster/postmaster.c
index dd7dd55..ffd60d7 100644
--- a/src/backend/postmaster/postmaster.c
+++ b/src/backend/postmaster/postmaster.c
@@ -3564,7 +3564,8 @@ BackendRun(Port *port)
 	maxac += (strlen(ExtraOptions) + 1) / 2;
 
 	av = (char **) MemoryContextAlloc(TopMemoryContext,
-									  maxac * sizeof(char *));
+									  maxac * sizeof(char *),
+									  FileAndLineTag());
 	ac = 0;
 
 	av[ac++] = "postgres";
diff --git a/src/backend/storage/buffer/localbuf.c b/src/backend/storage/buffer/localbuf.c
index 63c14f7..939e39a 100644
--- a/src/backend/storage/buffer/localbuf.c
+++ b/src/backend/storage/buffer/localbuf.c
@@ -434,7 +434,8 @@ GetLocalBufferStorage(void)
 		num_bufs = Min(num_bufs, MaxAllocSize / BLCKSZ);
 
 		cur_block = (char *) MemoryContextAlloc(LocalBufferContext,
-												num_bufs * BLCKSZ);
+												num_bufs * BLCKSZ,
+												FileAndLineTag());
 		next_buf_in_block = 0;
 		num_bufs_in_block = num_bufs;
 	}
diff --git a/src/backend/storage/ipc/ipc.c b/src/backend/storage/ipc/ipc.c
index 067b24a..0a7159c 100644
--- a/src/backend/storage/ipc/ipc.c
+++ b/src/backend/storage/ipc/ipc.c
@@ -29,6 +29,7 @@
 #endif
 #include "storage/ipc.h"
 #include "tcop/tcopprot.h"
+#include "utils/memutils.h"
 
 
 /*
@@ -134,6 +135,8 @@ proc_exit(int code)
 
 	elog(DEBUG3, "exit(%d)", code);
 
+	dump_allocations();
+
 	exit(code);
 }
 
diff --git a/src/backend/storage/large_object/inv_api.c b/src/backend/storage/large_object/inv_api.c
index 3adfb15..95487be 100644
--- a/src/backend/storage/large_object/inv_api.c
+++ b/src/backend/storage/large_object/inv_api.c
@@ -241,7 +241,8 @@ inv_open(Oid lobjId, int flags, MemoryContext mcxt)
 	LargeObjectDesc *retval;
 
 	retval = (LargeObjectDesc *) MemoryContextAlloc(mcxt,
-													sizeof(LargeObjectDesc));
+													sizeof(LargeObjectDesc),
+													FileAndLineTag());
 
 	retval->id = lobjId;
 	retval->subid = GetCurrentSubTransactionId();
diff --git a/src/backend/storage/lmgr/lock.c b/src/backend/storage/lmgr/lock.c
index 50b95ac..ab33268 100644
--- a/src/backend/storage/lmgr/lock.c
+++ b/src/backend/storage/lmgr/lock.c
@@ -652,7 +652,8 @@ LockAcquireExtended(const LOCKTAG *locktag,
 		locallock->lockOwners = NULL;
 		locallock->lockOwners = (LOCALLOCKOWNER *)
 			MemoryContextAlloc(TopMemoryContext,
-						  locallock->maxLockOwners * sizeof(LOCALLOCKOWNER));
+						  locallock->maxLockOwners * sizeof(LOCALLOCKOWNER),
+						  FileAndLineTag());
 	}
 	else
 	{
@@ -2468,7 +2469,8 @@ GetLockConflicts(const LOCKTAG *locktag, LOCKMODE lockmode)
 		if (vxids == NULL)
 			vxids = (VirtualTransactionId *)
 				MemoryContextAlloc(TopMemoryContext,
-						   sizeof(VirtualTransactionId) * (MaxBackends + 1));
+						   sizeof(VirtualTransactionId) * (MaxBackends + 1),
+						   FileAndLineTag());
 	}
 	else
 		vxids = (VirtualTransactionId *)
diff --git a/src/backend/storage/smgr/md.c b/src/backend/storage/smgr/md.c
index eeb20fd..52e58ca 100644
--- a/src/backend/storage/smgr/md.c
+++ b/src/backend/storage/smgr/md.c
@@ -1510,7 +1510,8 @@ ForgetDatabaseFsyncRequests(Oid dbid)
 static MdfdVec *
 _fdvec_alloc(void)
 {
-	return (MdfdVec *) MemoryContextAlloc(MdCxt, sizeof(MdfdVec));
+	return (MdfdVec *) MemoryContextAlloc(MdCxt, sizeof(MdfdVec),
+										  FileAndLineTag());
 }
 
 /*
diff --git a/src/backend/tcop/pquery.c b/src/backend/tcop/pquery.c
index d0db7ad..1e9169e 100644
--- a/src/backend/tcop/pquery.c
+++ b/src/backend/tcop/pquery.c
@@ -652,7 +652,7 @@ PortalSetResultFormat(Portal portal, int nFormats, int16 *formats)
 	natts = portal->tupDesc->natts;
 	portal->formats = (int16 *)
 		MemoryContextAlloc(PortalGetHeapMemory(portal),
-						   natts * sizeof(int16));
+						   natts * sizeof(int16), FileAndLineTag());
 	if (nFormats > 1)
 	{
 		/* format specified for each column */
diff --git a/src/backend/tsearch/spell.c b/src/backend/tsearch/spell.c
index 2fe40ed..ac9ce52 100644
--- a/src/backend/tsearch/spell.c
+++ b/src/backend/tsearch/spell.c
@@ -27,8 +27,8 @@
  * with the dictionary cache entry.  We keep the short-lived stuff
  * in the Conf->buildCxt context.
  */
-#define tmpalloc(sz)  MemoryContextAlloc(Conf->buildCxt, (sz))
-#define tmpalloc0(sz)  MemoryContextAllocZero(Conf->buildCxt, (sz))
+#define tmpalloc(sz)  MemoryContextAlloc(Conf->buildCxt, (sz), FileAndLineTag())
+#define tmpalloc0(sz)  MemoryContextAllocZero(Conf->buildCxt, (sz), FileAndLineTag())
 
 /*
  * Prepare for constructing an ISpell dictionary.
diff --git a/src/backend/utils/adt/array_typanalyze.c b/src/backend/utils/adt/array_typanalyze.c
index fa79d9f..5988dcf 100644
--- a/src/backend/utils/adt/array_typanalyze.c
+++ b/src/backend/utils/adt/array_typanalyze.c
@@ -608,7 +608,8 @@ compute_array_stats(VacAttrStats *stats, AnalyzeAttrFetchFunc fetchfunc,
 			 */
 			hist = (float4 *)
 				MemoryContextAlloc(stats->anl_context,
-								   sizeof(float4) * (num_hist + 1));
+								   sizeof(float4) * (num_hist + 1),
+								   FileAndLineTag());
 			hist[num_hist] = (double) element_no / (double) nonnull_cnt;
 
 			/*----------
diff --git a/src/backend/utils/adt/array_userfuncs.c b/src/backend/utils/adt/array_userfuncs.c
index a6ba0cf..b76a031 100644
--- a/src/backend/utils/adt/array_userfuncs.c
+++ b/src/backend/utils/adt/array_userfuncs.c
@@ -128,7 +128,8 @@ array_push(PG_FUNCTION_ARGS)
 	if (my_extra == NULL)
 	{
 		fcinfo->flinfo->fn_extra = MemoryContextAlloc(fcinfo->flinfo->fn_mcxt,
-													  sizeof(ArrayMetaState));
+													  sizeof(ArrayMetaState),
+													  FileAndLineTag());
 		my_extra = (ArrayMetaState *) fcinfo->flinfo->fn_extra;
 		my_extra->element_type = ~element_type;
 	}
@@ -447,7 +448,8 @@ create_singleton_array(FunctionCallInfo fcinfo,
 	if (my_extra == NULL)
 	{
 		fcinfo->flinfo->fn_extra = MemoryContextAlloc(fcinfo->flinfo->fn_mcxt,
-													  sizeof(ArrayMetaState));
+													  sizeof(ArrayMetaState),
+													  FileAndLineTag());
 		my_extra = (ArrayMetaState *) fcinfo->flinfo->fn_extra;
 		my_extra->element_type = ~element_type;
 	}
diff --git a/src/backend/utils/adt/arrayfuncs.c b/src/backend/utils/adt/arrayfuncs.c
index 5582a06..764ea34 100644
--- a/src/backend/utils/adt/arrayfuncs.c
+++ b/src/backend/utils/adt/arrayfuncs.c
@@ -170,7 +170,8 @@ array_in(PG_FUNCTION_ARGS)
 	if (my_extra == NULL)
 	{
 		fcinfo->flinfo->fn_extra = MemoryContextAlloc(fcinfo->flinfo->fn_mcxt,
-													  sizeof(ArrayMetaState));
+													  sizeof(ArrayMetaState),
+													  FileAndLineTag());
 		my_extra = (ArrayMetaState *) fcinfo->flinfo->fn_extra;
 		my_extra->element_type = ~element_type;
 	}
@@ -990,7 +991,8 @@ array_out(PG_FUNCTION_ARGS)
 	if (my_extra == NULL)
 	{
 		fcinfo->flinfo->fn_extra = MemoryContextAlloc(fcinfo->flinfo->fn_mcxt,
-													  sizeof(ArrayMetaState));
+													  sizeof(ArrayMetaState),
+													  FileAndLineTag());
 		my_extra = (ArrayMetaState *) fcinfo->flinfo->fn_extra;
 		my_extra->element_type = ~element_type;
 	}
@@ -1288,7 +1290,8 @@ array_recv(PG_FUNCTION_ARGS)
 	if (my_extra == NULL)
 	{
 		fcinfo->flinfo->fn_extra = MemoryContextAlloc(fcinfo->flinfo->fn_mcxt,
-													  sizeof(ArrayMetaState));
+													  sizeof(ArrayMetaState),
+													  FileAndLineTag());
 		my_extra = (ArrayMetaState *) fcinfo->flinfo->fn_extra;
 		my_extra->element_type = ~element_type;
 	}
@@ -1510,7 +1513,8 @@ array_send(PG_FUNCTION_ARGS)
 	if (my_extra == NULL)
 	{
 		fcinfo->flinfo->fn_extra = MemoryContextAlloc(fcinfo->flinfo->fn_mcxt,
-													  sizeof(ArrayMetaState));
+													  sizeof(ArrayMetaState),
+													  FileAndLineTag());
 		my_extra = (ArrayMetaState *) fcinfo->flinfo->fn_extra;
 		my_extra->element_type = ~element_type;
 	}
@@ -4990,7 +4994,8 @@ array_fill_internal(ArrayType *dims, ArrayType *lbs,
 	if (my_extra == NULL)
 	{
 		fcinfo->flinfo->fn_extra = MemoryContextAlloc(fcinfo->flinfo->fn_mcxt,
-													  sizeof(ArrayMetaState));
+													  sizeof(ArrayMetaState),
+													  FileAndLineTag());
 		my_extra = (ArrayMetaState *) fcinfo->flinfo->fn_extra;
 		my_extra->element_type = InvalidOid;
 	}
diff --git a/src/backend/utils/adt/domains.c b/src/backend/utils/adt/domains.c
index 591d992..fd8a44e 100644
--- a/src/backend/utils/adt/domains.c
+++ b/src/backend/utils/adt/domains.c
@@ -214,7 +214,8 @@ domain_in(PG_FUNCTION_ARGS)
 	if (my_extra == NULL)
 	{
 		my_extra = (DomainIOData *) MemoryContextAlloc(fcinfo->flinfo->fn_mcxt,
-													   sizeof(DomainIOData));
+													   sizeof(DomainIOData),
+													   FileAndLineTag());
 		domain_state_setup(my_extra, domainType, false,
 						   fcinfo->flinfo->fn_mcxt);
 		fcinfo->flinfo->fn_extra = (void *) my_extra;
@@ -274,7 +275,8 @@ domain_recv(PG_FUNCTION_ARGS)
 	if (my_extra == NULL)
 	{
 		my_extra = (DomainIOData *) MemoryContextAlloc(fcinfo->flinfo->fn_mcxt,
-													   sizeof(DomainIOData));
+													   sizeof(DomainIOData),
+													   FileAndLineTag());
 		domain_state_setup(my_extra, domainType, true,
 						   fcinfo->flinfo->fn_mcxt);
 		fcinfo->flinfo->fn_extra = (void *) my_extra;
@@ -325,7 +327,8 @@ domain_check(Datum value, bool isnull, Oid domainType, void **extra, MemoryConte
 	if (my_extra == NULL)
 	{
 		my_extra = (DomainIOData *) MemoryContextAlloc(mcxt,
-													   sizeof(DomainIOData));
+													   sizeof(DomainIOData),
+													   FileAndLineTag());
 		domain_state_setup(my_extra, domainType, true, mcxt);
 		if (extra)
 			*extra = (void *) my_extra;
diff --git a/src/backend/utils/adt/pgstatfuncs.c b/src/backend/utils/adt/pgstatfuncs.c
index 83d0c22..4000a85 100644
--- a/src/backend/utils/adt/pgstatfuncs.c
+++ b/src/backend/utils/adt/pgstatfuncs.c
@@ -476,7 +476,7 @@ pg_stat_get_backend_idset(PG_FUNCTION_ARGS)
 		funcctx = SRF_FIRSTCALL_INIT();
 
 		fctx = MemoryContextAlloc(funcctx->multi_call_memory_ctx,
-								  2 * sizeof(int));
+								  2 * sizeof(int), FileAndLineTag());
 		funcctx->user_fctx = fctx;
 
 		fctx[0] = 0;
diff --git a/src/backend/utils/adt/rangetypes.c b/src/backend/utils/adt/rangetypes.c
index 0994fa7..def2bad 100644
--- a/src/backend/utils/adt/rangetypes.c
+++ b/src/backend/utils/adt/rangetypes.c
@@ -305,7 +305,8 @@ get_range_io_data(FunctionCallInfo fcinfo, Oid rngtypid, IOFuncSelector func)
 		char	typdelim;
 
 		cache = (RangeIOData *) MemoryContextAlloc(fcinfo->flinfo->fn_mcxt,
-												   sizeof(RangeIOData));
+												   sizeof(RangeIOData),
+												   FileAndLineTag());
 		cache->typcache = lookup_type_cache(rngtypid, TYPECACHE_RANGE_INFO);
 		if (cache->typcache->rngelemtype == NULL)
 			elog(ERROR, "type %u is not a range type", rngtypid);
diff --git a/src/backend/utils/adt/rowtypes.c b/src/backend/utils/adt/rowtypes.c
index ba7fde4..54e514c 100644
--- a/src/backend/utils/adt/rowtypes.c
+++ b/src/backend/utils/adt/rowtypes.c
@@ -117,7 +117,8 @@ record_in(PG_FUNCTION_ARGS)
 		fcinfo->flinfo->fn_extra =
 			MemoryContextAlloc(fcinfo->flinfo->fn_mcxt,
 							   sizeof(RecordIOData) - sizeof(ColumnIOData)
-							   + ncolumns * sizeof(ColumnIOData));
+							   + ncolumns * sizeof(ColumnIOData),
+							  FileAndLineTag());
 		my_extra = (RecordIOData *) fcinfo->flinfo->fn_extra;
 		my_extra->record_type = InvalidOid;
 		my_extra->record_typmod = 0;
@@ -331,7 +332,8 @@ record_out(PG_FUNCTION_ARGS)
 		fcinfo->flinfo->fn_extra =
 			MemoryContextAlloc(fcinfo->flinfo->fn_mcxt,
 							   sizeof(RecordIOData) - sizeof(ColumnIOData)
-							   + ncolumns * sizeof(ColumnIOData));
+							   + ncolumns * sizeof(ColumnIOData),
+							  FileAndLineTag());
 		my_extra = (RecordIOData *) fcinfo->flinfo->fn_extra;
 		my_extra->record_type = InvalidOid;
 		my_extra->record_typmod = 0;
@@ -486,7 +488,8 @@ record_recv(PG_FUNCTION_ARGS)
 		fcinfo->flinfo->fn_extra =
 			MemoryContextAlloc(fcinfo->flinfo->fn_mcxt,
 							   sizeof(RecordIOData) - sizeof(ColumnIOData)
-							   + ncolumns * sizeof(ColumnIOData));
+							   + ncolumns * sizeof(ColumnIOData),
+							  FileAndLineTag());
 		my_extra = (RecordIOData *) fcinfo->flinfo->fn_extra;
 		my_extra->record_type = InvalidOid;
 		my_extra->record_typmod = 0;
@@ -674,7 +677,8 @@ record_send(PG_FUNCTION_ARGS)
 		fcinfo->flinfo->fn_extra =
 			MemoryContextAlloc(fcinfo->flinfo->fn_mcxt,
 							   sizeof(RecordIOData) - sizeof(ColumnIOData)
-							   + ncolumns * sizeof(ColumnIOData));
+							   + ncolumns * sizeof(ColumnIOData),
+							   FileAndLineTag());
 		my_extra = (RecordIOData *) fcinfo->flinfo->fn_extra;
 		my_extra->record_type = InvalidOid;
 		my_extra->record_typmod = 0;
@@ -829,7 +833,8 @@ record_cmp(FunctionCallInfo fcinfo)
 		fcinfo->flinfo->fn_extra =
 			MemoryContextAlloc(fcinfo->flinfo->fn_mcxt,
 						sizeof(RecordCompareData) - sizeof(ColumnCompareData)
-							   + ncols * sizeof(ColumnCompareData));
+							   + ncols * sizeof(ColumnCompareData),
+						FileAndLineTag());
 		my_extra = (RecordCompareData *) fcinfo->flinfo->fn_extra;
 		my_extra->ncolumns = ncols;
 		my_extra->record1_type = InvalidOid;
@@ -1064,7 +1069,8 @@ record_eq(PG_FUNCTION_ARGS)
 		fcinfo->flinfo->fn_extra =
 			MemoryContextAlloc(fcinfo->flinfo->fn_mcxt,
 						sizeof(RecordCompareData) - sizeof(ColumnCompareData)
-							   + ncols * sizeof(ColumnCompareData));
+							   + ncols * sizeof(ColumnCompareData),
+						FileAndLineTag());
 		my_extra = (RecordCompareData *) fcinfo->flinfo->fn_extra;
 		my_extra->ncolumns = ncols;
 		my_extra->record1_type = InvalidOid;
diff --git a/src/backend/utils/adt/tsvector_op.c b/src/backend/utils/adt/tsvector_op.c
index bab6534..c63284b 100644
--- a/src/backend/utils/adt/tsvector_op.c
+++ b/src/backend/utils/adt/tsvector_op.c
@@ -918,7 +918,8 @@ insertStatEntry(MemoryContext persistentContext, TSVectorStat *stat, TSVector tx
 
 	if (node == NULL)
 	{
-		node = MemoryContextAlloc(persistentContext, STATENTRYHDRSZ + we->len);
+		node = MemoryContextAlloc(persistentContext, STATENTRYHDRSZ + we->len,
+								  FileAndLineTag());
 		node->left = node->right = NULL;
 		node->ndoc = 1;
 		node->nentry = n;
@@ -987,7 +988,8 @@ ts_accum(MemoryContext persistentContext, TSVectorStat *stat, Datum data)
 
 	if (stat == NULL)
 	{							/* Init in first */
-		stat = MemoryContextAllocZero(persistentContext, sizeof(TSVectorStat));
+		stat = MemoryContextAllocZero(persistentContext, sizeof(TSVectorStat),
+									  FileAndLineTag());
 		stat->maxdepth = 1;
 	}
 
@@ -1172,7 +1174,8 @@ ts_stat_sql(MemoryContext persistentContext, text *txt, text *ws)
 				(errcode(ERRCODE_INVALID_PARAMETER_VALUE),
 				 errmsg("ts_stat query must return one tsvector column")));
 
-	stat = MemoryContextAllocZero(persistentContext, sizeof(TSVectorStat));
+	stat = MemoryContextAllocZero(persistentContext, sizeof(TSVectorStat),
+								  FileAndLineTag());
 	stat->maxdepth = 1;
 
 	if (ws)
diff --git a/src/backend/utils/adt/txid.c b/src/backend/utils/adt/txid.c
index 08a8c89..699ed3d 100644
--- a/src/backend/utils/adt/txid.c
+++ b/src/backend/utils/adt/txid.c
@@ -571,7 +571,8 @@ txid_snapshot_xip(PG_FUNCTION_ARGS)
 		fctx = SRF_FIRSTCALL_INIT();
 
 		/* make a copy of user snapshot */
-		snap = MemoryContextAlloc(fctx->multi_call_memory_ctx, VARSIZE(arg));
+		snap = MemoryContextAlloc(fctx->multi_call_memory_ctx, VARSIZE(arg),
+								  FileAndLineTag());
 		memcpy(snap, arg, VARSIZE(arg));
 
 		fctx->user_fctx = snap;
diff --git a/src/backend/utils/adt/varlena.c b/src/backend/utils/adt/varlena.c
index a5592d5..77fd250 100644
--- a/src/backend/utils/adt/varlena.c
+++ b/src/backend/utils/adt/varlena.c
@@ -3381,7 +3381,8 @@ array_to_text_internal(FunctionCallInfo fcinfo, ArrayType *v,
 	if (my_extra == NULL)
 	{
 		fcinfo->flinfo->fn_extra = MemoryContextAlloc(fcinfo->flinfo->fn_mcxt,
-													  sizeof(ArrayMetaState));
+													  sizeof(ArrayMetaState),
+													  FileAndLineTag());
 		my_extra = (ArrayMetaState *) fcinfo->flinfo->fn_extra;
 		my_extra->element_type = ~element_type;
 	}
@@ -3578,7 +3579,8 @@ pg_column_size(PG_FUNCTION_ARGS)
 			elog(ERROR, "cache lookup failed for type %u", argtypeid);
 
 		fcinfo->flinfo->fn_extra = MemoryContextAlloc(fcinfo->flinfo->fn_mcxt,
-													  sizeof(int));
+													  sizeof(int),
+													  FileAndLineTag());
 		*((int *) fcinfo->flinfo->fn_extra) = typlen;
 	}
 	else
diff --git a/src/backend/utils/cache/attoptcache.c b/src/backend/utils/cache/attoptcache.c
index e01ae21..0cdaf1f 100644
--- a/src/backend/utils/cache/attoptcache.c
+++ b/src/backend/utils/cache/attoptcache.c
@@ -153,7 +153,8 @@ get_attribute_options(Oid attrelid, int attnum)
 				bytea	   *bytea_opts = attribute_reloptions(datum, false);
 
 				opts = MemoryContextAlloc(CacheMemoryContext,
-										  VARSIZE(bytea_opts));
+										  VARSIZE(bytea_opts),
+										  FileAndLineTag());
 				memcpy(opts, bytea_opts, VARSIZE(bytea_opts));
 			}
 			ReleaseSysCache(tp);
diff --git a/src/backend/utils/cache/inval.c b/src/backend/utils/cache/inval.c
index d5fe85a..fd616d0 100644
--- a/src/backend/utils/cache/inval.c
+++ b/src/backend/utils/cache/inval.c
@@ -222,7 +222,8 @@ AddInvalidationMessage(InvalidationChunk **listHdr,
 		chunk = (InvalidationChunk *)
 			MemoryContextAlloc(CurTransactionContext,
 							   sizeof(InvalidationChunk) +
-					(FIRSTCHUNKSIZE - 1) *sizeof(SharedInvalidationMessage));
+					(FIRSTCHUNKSIZE - 1) *sizeof(SharedInvalidationMessage),
+					FileAndLineTag());
 		chunk->nitems = 0;
 		chunk->maxitems = FIRSTCHUNKSIZE;
 		chunk->next = *listHdr;
@@ -236,7 +237,8 @@ AddInvalidationMessage(InvalidationChunk **listHdr,
 		chunk = (InvalidationChunk *)
 			MemoryContextAlloc(CurTransactionContext,
 							   sizeof(InvalidationChunk) +
-						 (chunksize - 1) *sizeof(SharedInvalidationMessage));
+						 (chunksize - 1) *sizeof(SharedInvalidationMessage),
+						 FileAndLineTag());
 		chunk->nitems = 0;
 		chunk->maxitems = chunksize;
 		chunk->next = *listHdr;
@@ -629,7 +631,8 @@ AtStart_Inval(void)
 	Assert(transInvalInfo == NULL);
 	transInvalInfo = (TransInvalidationInfo *)
 		MemoryContextAllocZero(TopTransactionContext,
-							   sizeof(TransInvalidationInfo));
+							   sizeof(TransInvalidationInfo),
+							   FileAndLineTag());
 	transInvalInfo->my_level = GetCurrentTransactionNestLevel();
 	SharedInvalidMessagesArray = NULL;
 	numSharedInvalidMessagesArray = 0;
@@ -665,7 +668,8 @@ AtSubStart_Inval(void)
 	Assert(transInvalInfo != NULL);
 	myInfo = (TransInvalidationInfo *)
 		MemoryContextAllocZero(TopTransactionContext,
-							   sizeof(TransInvalidationInfo));
+							   sizeof(TransInvalidationInfo),
+							   FileAndLineTag());
 	myInfo->parent = transInvalInfo;
 	myInfo->my_level = GetCurrentTransactionNestLevel();
 	transInvalInfo = myInfo;
diff --git a/src/backend/utils/cache/relcache.c b/src/backend/utils/cache/relcache.c
index 7f0e20e..f33b07e 100644
--- a/src/backend/utils/cache/relcache.c
+++ b/src/backend/utils/cache/relcache.c
@@ -399,7 +399,8 @@ RelationParseRelOptions(Relation relation, HeapTuple tuple)
 	if (options)
 	{
 		relation->rd_options = MemoryContextAlloc(CacheMemoryContext,
-												  VARSIZE(options));
+												  VARSIZE(options),
+												  FileAndLineTag());
 		memcpy(relation->rd_options, options, VARSIZE(options));
 		pfree(options);
 	}
@@ -429,7 +430,8 @@ RelationBuildTupleDesc(Relation relation)
 	relation->rd_att->tdhasoid = relation->rd_rel->relhasoids;
 
 	constr = (TupleConstr *) MemoryContextAlloc(CacheMemoryContext,
-												sizeof(TupleConstr));
+												sizeof(TupleConstr),
+												FileAndLineTag());
 	constr->has_not_null = false;
 
 	/*
@@ -488,7 +490,8 @@ RelationBuildTupleDesc(Relation relation)
 				attrdef = (AttrDefault *)
 					MemoryContextAllocZero(CacheMemoryContext,
 										   relation->rd_rel->relnatts *
-										   sizeof(AttrDefault));
+										   sizeof(AttrDefault),
+										   FileAndLineTag());
 			attrdef[ndef].adnum = attp->attnum;
 			attrdef[ndef].adbin = NULL;
 			ndef++;
@@ -555,7 +558,8 @@ RelationBuildTupleDesc(Relation relation)
 			constr->num_check = relation->rd_rel->relchecks;
 			constr->check = (ConstrCheck *)
 				MemoryContextAllocZero(CacheMemoryContext,
-									constr->num_check * sizeof(ConstrCheck));
+									constr->num_check * sizeof(ConstrCheck),
+									FileAndLineTag());
 			CheckConstraintFetch(relation);
 		}
 		else
@@ -615,7 +619,8 @@ RelationBuildRuleLock(Relation relation)
 	 */
 	maxlocks = 4;
 	rules = (RewriteRule **)
-		MemoryContextAlloc(rulescxt, sizeof(RewriteRule *) * maxlocks);
+		MemoryContextAlloc(rulescxt, sizeof(RewriteRule *) * maxlocks,
+						   FileAndLineTag());
 	numlocks = 0;
 
 	/*
@@ -650,7 +655,8 @@ RelationBuildRuleLock(Relation relation)
 		RewriteRule *rule;
 
 		rule = (RewriteRule *) MemoryContextAlloc(rulescxt,
-												  sizeof(RewriteRule));
+												  sizeof(RewriteRule),
+												  FileAndLineTag());
 
 		rule->ruleId = HeapTupleGetOid(rewrite_tuple);
 
@@ -732,7 +738,8 @@ RelationBuildRuleLock(Relation relation)
 	/*
 	 * form a RuleLock and insert into relation
 	 */
-	rulelock = (RuleLock *) MemoryContextAlloc(rulescxt, sizeof(RuleLock));
+	rulelock = (RuleLock *) MemoryContextAlloc(rulescxt, sizeof(RuleLock),
+											   FileAndLineTag());
 	rulelock->numLocks = numlocks;
 	rulelock->rules = rules;
 
@@ -1009,7 +1016,8 @@ RelationInitIndexAccessInfo(Relation relation)
 	if (!HeapTupleIsValid(tuple))
 		elog(ERROR, "cache lookup failed for access method %u",
 			 relation->rd_rel->relam);
-	aform = (Form_pg_am) MemoryContextAlloc(CacheMemoryContext, sizeof *aform);
+	aform = (Form_pg_am) MemoryContextAlloc(CacheMemoryContext, sizeof *aform,
+											FileAndLineTag());
 	memcpy(aform, GETSTRUCT(tuple), sizeof *aform);
 	ReleaseSysCache(tuple);
 	relation->rd_am = aform;
@@ -1039,21 +1047,24 @@ RelationInitIndexAccessInfo(Relation relation)
 	 * Allocate arrays to hold data
 	 */
 	relation->rd_aminfo = (RelationAmInfo *)
-		MemoryContextAllocZero(indexcxt, sizeof(RelationAmInfo));
+		MemoryContextAllocZero(indexcxt, sizeof(RelationAmInfo),
+							   FileAndLineTag());
 
 	relation->rd_opfamily = (Oid *)
-		MemoryContextAllocZero(indexcxt, natts * sizeof(Oid));
+		MemoryContextAllocZero(indexcxt, natts * sizeof(Oid), FileAndLineTag());
 	relation->rd_opcintype = (Oid *)
-		MemoryContextAllocZero(indexcxt, natts * sizeof(Oid));
+		MemoryContextAllocZero(indexcxt, natts * sizeof(Oid), FileAndLineTag());
 
 	if (amsupport > 0)
 	{
 		int			nsupport = natts * amsupport;
 
 		relation->rd_support = (RegProcedure *)
-			MemoryContextAllocZero(indexcxt, nsupport * sizeof(RegProcedure));
+			MemoryContextAllocZero(indexcxt, nsupport * sizeof(RegProcedure),
+								   FileAndLineTag());
 		relation->rd_supportinfo = (FmgrInfo *)
-			MemoryContextAllocZero(indexcxt, nsupport * sizeof(FmgrInfo));
+			MemoryContextAllocZero(indexcxt, nsupport * sizeof(FmgrInfo),
+								   FileAndLineTag());
 	}
 	else
 	{
@@ -1062,10 +1073,11 @@ RelationInitIndexAccessInfo(Relation relation)
 	}
 
 	relation->rd_indcollation = (Oid *)
-		MemoryContextAllocZero(indexcxt, natts * sizeof(Oid));
+		MemoryContextAllocZero(indexcxt, natts * sizeof(Oid), FileAndLineTag());
 
 	relation->rd_indoption = (int16 *)
-		MemoryContextAllocZero(indexcxt, natts * sizeof(int16));
+		MemoryContextAllocZero(indexcxt, natts * sizeof(int16),
+							   FileAndLineTag());
 
 	/*
 	 * indcollation cannot be referenced directly through the C struct,
@@ -1229,7 +1241,8 @@ LookupOpclassInfo(Oid operatorClassOid,
 		if (numSupport > 0)
 			opcentry->supportProcs = (RegProcedure *)
 				MemoryContextAllocZero(CacheMemoryContext,
-									   numSupport * sizeof(RegProcedure));
+									   numSupport * sizeof(RegProcedure),
+									   FileAndLineTag());
 		else
 			opcentry->supportProcs = NULL;
 	}
@@ -4091,7 +4104,8 @@ load_relcache_init_file(bool shared)
 			if (fread(&len, 1, sizeof(len), fp) != sizeof(len))
 				goto read_failed;
 
-			opfamily = (Oid *) MemoryContextAlloc(indexcxt, len);
+			opfamily = (Oid *) MemoryContextAlloc(indexcxt, len,
+												  FileAndLineTag());
 			if (fread(opfamily, 1, len, fp) != len)
 				goto read_failed;
 
@@ -4101,7 +4115,8 @@ load_relcache_init_file(bool shared)
 			if (fread(&len, 1, sizeof(len), fp) != sizeof(len))
 				goto read_failed;
 
-			opcintype = (Oid *) MemoryContextAlloc(indexcxt, len);
+			opcintype = (Oid *) MemoryContextAlloc(indexcxt, len,
+												   FileAndLineTag());
 			if (fread(opcintype, 1, len, fp) != len)
 				goto read_failed;
 
@@ -4110,7 +4125,8 @@ load_relcache_init_file(bool shared)
 			/* next, read the vector of support procedure OIDs */
 			if (fread(&len, 1, sizeof(len), fp) != sizeof(len))
 				goto read_failed;
-			support = (RegProcedure *) MemoryContextAlloc(indexcxt, len);
+			support = (RegProcedure *) MemoryContextAlloc(indexcxt, len,
+														  FileAndLineTag());
 			if (fread(support, 1, len, fp) != len)
 				goto read_failed;
 
@@ -4120,7 +4136,8 @@ load_relcache_init_file(bool shared)
 			if (fread(&len, 1, sizeof(len), fp) != sizeof(len))
 				goto read_failed;
 
-			indcollation = (Oid *) MemoryContextAlloc(indexcxt, len);
+			indcollation = (Oid *) MemoryContextAlloc(indexcxt, len,
+													  FileAndLineTag());
 			if (fread(indcollation, 1, len, fp) != len)
 				goto read_failed;
 
@@ -4130,7 +4147,8 @@ load_relcache_init_file(bool shared)
 			if (fread(&len, 1, sizeof(len), fp) != sizeof(len))
 				goto read_failed;
 
-			indoption = (int16 *) MemoryContextAlloc(indexcxt, len);
+			indoption = (int16 *) MemoryContextAlloc(indexcxt, len,
+													 FileAndLineTag());
 			if (fread(indoption, 1, len, fp) != len)
 				goto read_failed;
 
@@ -4138,10 +4156,12 @@ load_relcache_init_file(bool shared)
 
 			/* set up zeroed fmgr-info vectors */
 			rel->rd_aminfo = (RelationAmInfo *)
-				MemoryContextAllocZero(indexcxt, sizeof(RelationAmInfo));
+				MemoryContextAllocZero(indexcxt, sizeof(RelationAmInfo),
+									   FileAndLineTag());
 			nsupport = relform->relnatts * am->amsupport;
 			rel->rd_supportinfo = (FmgrInfo *)
-				MemoryContextAllocZero(indexcxt, nsupport * sizeof(FmgrInfo));
+				MemoryContextAllocZero(indexcxt, nsupport * sizeof(FmgrInfo),
+									   FileAndLineTag());
 		}
 		else
 		{
diff --git a/src/backend/utils/cache/spccache.c b/src/backend/utils/cache/spccache.c
index cf18ee1..20285ce 100644
--- a/src/backend/utils/cache/spccache.c
+++ b/src/backend/utils/cache/spccache.c
@@ -150,7 +150,8 @@ get_tablespace(Oid spcid)
 		{
 			bytea	   *bytea_opts = tablespace_reloptions(datum, false);
 
-			opts = MemoryContextAlloc(CacheMemoryContext, VARSIZE(bytea_opts));
+			opts = MemoryContextAlloc(CacheMemoryContext, VARSIZE(bytea_opts),
+									  FileAndLineTag());
 			memcpy(opts, bytea_opts, VARSIZE(bytea_opts));
 		}
 		ReleaseSysCache(tp);
diff --git a/src/backend/utils/cache/ts_cache.c b/src/backend/utils/cache/ts_cache.c
index 4ad5e7f..ea15490 100644
--- a/src/backend/utils/cache/ts_cache.c
+++ b/src/backend/utils/cache/ts_cache.c
@@ -501,7 +501,8 @@ lookup_ts_config_cache(Oid cfgId)
 					maplists[maxtokentype].len = ndicts;
 					maplists[maxtokentype].dictIds = (Oid *)
 						MemoryContextAlloc(CacheMemoryContext,
-										   sizeof(Oid) * ndicts);
+										   sizeof(Oid) * ndicts,
+										   FileAndLineTag());
 					memcpy(maplists[maxtokentype].dictIds, mapdicts,
 						   sizeof(Oid) * ndicts);
 				}
@@ -528,14 +529,15 @@ lookup_ts_config_cache(Oid cfgId)
 			maplists[maxtokentype].len = ndicts;
 			maplists[maxtokentype].dictIds = (Oid *)
 				MemoryContextAlloc(CacheMemoryContext,
-								   sizeof(Oid) * ndicts);
+								   sizeof(Oid) * ndicts, FileAndLineTag());
 			memcpy(maplists[maxtokentype].dictIds, mapdicts,
 				   sizeof(Oid) * ndicts);
 			/* and save the overall map */
 			entry->lenmap = maxtokentype + 1;
 			entry->map = (ListDictionary *)
 				MemoryContextAlloc(CacheMemoryContext,
-								   sizeof(ListDictionary) * entry->lenmap);
+								   sizeof(ListDictionary) * entry->lenmap,
+								   FileAndLineTag());
 			memcpy(entry->map, maplists,
 				   sizeof(ListDictionary) * entry->lenmap);
 		}
diff --git a/src/backend/utils/fmgr/fmgr.c b/src/backend/utils/fmgr/fmgr.c
index 46d7eda..4c240f8 100644
--- a/src/backend/utils/fmgr/fmgr.c
+++ b/src/backend/utils/fmgr/fmgr.c
@@ -366,7 +366,8 @@ fmgr_info_C_lang(Oid functionId, FmgrInfo *finfo, HeapTuple procedureTuple)
 			finfo->fn_addr = fmgr_oldstyle;
 			fnextra = (Oldstyle_fnextra *)
 				MemoryContextAllocZero(finfo->fn_mcxt,
-									   sizeof(Oldstyle_fnextra));
+									   sizeof(Oldstyle_fnextra),
+									   FileAndLineTag());
 			finfo->fn_extra = (void *) fnextra;
 			fnextra->func = (func_ptr) user_fn;
 			for (i = 0; i < procedureStruct->pronargs; i++)
@@ -588,7 +589,8 @@ fmgr_info_copy(FmgrInfo *dstinfo, FmgrInfo *srcinfo,
 		Oldstyle_fnextra *fnextra;
 
 		fnextra = (Oldstyle_fnextra *)
-			MemoryContextAlloc(destcxt, sizeof(Oldstyle_fnextra));
+			MemoryContextAlloc(destcxt, sizeof(Oldstyle_fnextra),
+							   FileAndLineTag());
 		memcpy(fnextra, srcinfo->fn_extra, sizeof(Oldstyle_fnextra));
 		dstinfo->fn_extra = (void *) fnextra;
 	}
@@ -896,7 +898,7 @@ fmgr_security_definer(PG_FUNCTION_ARGS)
 		MemoryContext oldcxt;
 
 		fcache = MemoryContextAllocZero(fcinfo->flinfo->fn_mcxt,
-										sizeof(*fcache));
+										sizeof(*fcache), FileAndLineTag());
 
 		fmgr_info_cxt_security(fcinfo->flinfo->fn_oid, &fcache->flinfo,
 							   fcinfo->flinfo->fn_mcxt, true);
diff --git a/src/backend/utils/fmgr/funcapi.c b/src/backend/utils/fmgr/funcapi.c
index dd91478..62c53aa 100644
--- a/src/backend/utils/fmgr/funcapi.c
+++ b/src/backend/utils/fmgr/funcapi.c
@@ -81,7 +81,7 @@ init_MultiFuncCall(PG_FUNCTION_ARGS)
 		 */
 		retval = (FuncCallContext *)
 			MemoryContextAllocZero(multi_call_ctx,
-								   sizeof(FuncCallContext));
+								   sizeof(FuncCallContext), FileAndLineTag());
 
 		/*
 		 * initialize the elements
diff --git a/src/backend/utils/hash/dynahash.c b/src/backend/utils/hash/dynahash.c
index 6d0e0f5..2c3320b 100644
--- a/src/backend/utils/hash/dynahash.c
+++ b/src/backend/utils/hash/dynahash.c
@@ -214,7 +214,7 @@ static void *
 DynaHashAlloc(Size size)
 {
 	Assert(MemoryContextIsValid(CurrentDynaHashCxt));
-	return MemoryContextAlloc(CurrentDynaHashCxt, size);
+	return MemoryContextAlloc(CurrentDynaHashCxt, size, FileAndLineTag());
 }
 
 
diff --git a/src/backend/utils/mb/mbutils.c b/src/backend/utils/mb/mbutils.c
index 848c26f..6fe9794 100644
--- a/src/backend/utils/mb/mbutils.c
+++ b/src/backend/utils/mb/mbutils.c
@@ -133,7 +133,8 @@ PrepareClientEncoding(int encoding)
 		 * Load the fmgr info into TopMemoryContext (could still fail here)
 		 */
 		convinfo = (ConvProcInfo *) MemoryContextAlloc(TopMemoryContext,
-													   sizeof(ConvProcInfo));
+													   sizeof(ConvProcInfo),
+													   FileAndLineTag());
 		convinfo->s_encoding = current_server_encoding;
 		convinfo->c_encoding = encoding;
 		fmgr_info_cxt(to_server_proc, &convinfo->to_server_info,
diff --git a/src/backend/utils/misc/guc.c b/src/backend/utils/misc/guc.c
index d75ab43..b1a223f 100644
--- a/src/backend/utils/misc/guc.c
+++ b/src/backend/utils/misc/guc.c
@@ -4356,7 +4356,8 @@ push_old_value(struct config_generic * gconf, GucAction action)
 	 * We keep all the stack entries in TopTransactionContext for simplicity.
 	 */
 	stack = (GucStack *) MemoryContextAllocZero(TopTransactionContext,
-												sizeof(GucStack));
+												sizeof(GucStack),
+												FileAndLineTag());
 
 	stack->prev = gconf->stack;
 	stack->nest_level = GUCNestLevel;
diff --git a/src/backend/utils/mmgr/aset.c b/src/backend/utils/mmgr/aset.c
index c5a331c..24d6944 100644
--- a/src/backend/utils/mmgr/aset.c
+++ b/src/backend/utils/mmgr/aset.c
@@ -64,8 +64,87 @@
 
 #include "postgres.h"
 
+#include "access/hash.h"
 #include "utils/memutils.h"
 
+struct mem_alloc_tracker {
+	const char *tag;
+	unsigned allocations;
+	unsigned bytes;
+	struct mem_alloc_tracker *next;
+};
+
+#define MEM_ALLOC_TRACKER_BUCKETS 8192
+struct mem_alloc_tracker mem_alloc_hashtab[MEM_ALLOC_TRACKER_BUCKETS];
+
+static void
+count_allocation(const char *tag, unsigned bytes)
+{
+	int		s;
+	Datum	h;
+	unsigned b;
+	struct mem_alloc_tracker *mb;
+
+	Assert(tag != NULL);
+
+	s = strlen(tag);
+	h = hash_any((const unsigned char *) tag, s);
+	b = ((uint32) h) % MEM_ALLOC_TRACKER_BUCKETS;
+	mb = &mem_alloc_hashtab[b];
+
+	if (!mb->tag)
+	{
+		mb->tag = tag;
+		mb->allocations = 1;
+		mb->bytes = bytes;
+	}
+	else if (!strcmp(mb->tag, tag))
+	{
+		mb->allocations++;
+		mb->bytes += bytes;
+	}
+	else
+	{
+		struct mem_alloc_tracker *n;
+
+		for (mb = mb->next; mb != NULL; mb = mb->next)
+		{
+			if (!strcmp(mb->tag, tag))
+			{
+				mb->allocations++;
+				mb->bytes += bytes;
+				return;
+			}
+		}
+
+		n = malloc(sizeof(struct mem_alloc_tracker));
+		n->tag = tag;
+		n->allocations = 1;
+		n->bytes = bytes;
+		n->next = mem_alloc_hashtab[b].next;
+		mem_alloc_hashtab[b].next = n;
+	}
+}
+
+void
+dump_allocations(void)
+{
+	unsigned b;
+
+	for (b = 0; b < MEM_ALLOC_TRACKER_BUCKETS; ++b)
+	{
+		struct mem_alloc_tracker *mb = &mem_alloc_hashtab[b];
+		if (!mb->tag)
+			continue;
+		while (mb != NULL)
+		{
+			write_stderr("ALLOCATE %s %u %u\n",
+						 mb->tag, mb->allocations, mb->bytes);
+			mb = mb->next;
+		}
+	}
+}
+
 /* Define this to detail debug alloc information */
 /* #define HAVE_ALLOCINFO */
 
@@ -209,9 +288,9 @@ typedef struct AllocChunkData
 /*
  * These functions implement the MemoryContext API for AllocSet contexts.
  */
-static void *AllocSetAlloc(MemoryContext context, Size size);
+static void *AllocSetAlloc(MemoryContext context, Size size, const char *tag);
 static void AllocSetFree(MemoryContext context, void *pointer);
-static void *AllocSetRealloc(MemoryContext context, void *pointer, Size size);
+static void *AllocSetRealloc(MemoryContext context, void *pointer, Size size, const char *tag);
 static void AllocSetInit(MemoryContext context);
 static void AllocSetReset(MemoryContext context);
 static void AllocSetDelete(MemoryContext context);
@@ -350,20 +429,21 @@ randomize_mem(char *ptr, size_t size)
  * maxBlockSize: maximum allocation block size
  */
 MemoryContext
-AllocSetContextCreate(MemoryContext parent,
+AllocSetContextCreate_really(MemoryContext parent,
 					  const char *name,
 					  Size minContextSize,
 					  Size initBlockSize,
-					  Size maxBlockSize)
+					  Size maxBlockSize,
+					  const char *tag)
 {
 	AllocSet	context;
 
 	/* Do the type-independent part of context creation */
-	context = (AllocSet) MemoryContextCreate(T_AllocSetContext,
+	context = (AllocSet) MemoryContextCreate_really(T_AllocSetContext,
 											 sizeof(AllocSetContext),
 											 &AllocSetMethods,
 											 parent,
-											 name);
+											 name, tag);
 
 	/*
 	 * Make sure alloc parameters are reasonable, and save them.
@@ -559,7 +639,7 @@ AllocSetDelete(MemoryContext context)
  *		to the set.
  */
 static void *
-AllocSetAlloc(MemoryContext context, Size size)
+AllocSetAlloc(MemoryContext context, Size size, const char *tag)
 {
 	AllocSet	set = (AllocSet) context;
 	AllocBlock	block;
@@ -568,6 +648,8 @@ AllocSetAlloc(MemoryContext context, Size size)
 	Size		chunk_size;
 	Size		blksize;
 
+	count_allocation(tag, size);
+
 	AssertArg(AllocSetIsValid(set));
 
 	/*
@@ -892,7 +974,7 @@ AllocSetFree(MemoryContext context, void *pointer)
  *		into the new memory, and the old memory is freed.
  */
 static void *
-AllocSetRealloc(MemoryContext context, void *pointer, Size size)
+AllocSetRealloc(MemoryContext context, void *pointer, Size size, const char *tag)
 {
 	AllocSet	set = (AllocSet) context;
 	AllocChunk	chunk = AllocPointerGetChunk(pointer);
@@ -1008,7 +1090,7 @@ AllocSetRealloc(MemoryContext context, void *pointer, Size size)
 		AllocPointer newPointer;
 
 		/* allocate new chunk */
-		newPointer = AllocSetAlloc((MemoryContext) set, size);
+		newPointer = AllocSetAlloc((MemoryContext) set, size, tag);
 
 		/* transfer existing data (certain to fit) */
 		memcpy(newPointer, pointer, oldsize);
diff --git a/src/backend/utils/mmgr/mcxt.c b/src/backend/utils/mmgr/mcxt.c
index 466d53d..966b164 100644
--- a/src/backend/utils/mmgr/mcxt.c
+++ b/src/backend/utils/mmgr/mcxt.c
@@ -507,10 +507,10 @@ MemoryContextContains(MemoryContext context, void *pointer)
  *--------------------
  */
 MemoryContext
-MemoryContextCreate(NodeTag tag, Size size,
+MemoryContextCreate_really(NodeTag tag, Size size,
 					MemoryContextMethods *methods,
 					MemoryContext parent,
-					const char *name)
+					const char *name, const char *stag)
 {
 	MemoryContext node;
 	Size		needed = size + strlen(name) + 1;
@@ -520,7 +520,7 @@ MemoryContextCreate(NodeTag tag, Size size,
 	{
 		/* Normal case: allocate the node in TopMemoryContext */
 		node = (MemoryContext) MemoryContextAlloc(TopMemoryContext,
-												  needed);
+												  needed, stag);
 	}
 	else
 	{
@@ -564,7 +564,7 @@ MemoryContextCreate(NodeTag tag, Size size,
  * nodes/memnodes.h into postgres.h which seems a bad idea.
  */
 void *
-MemoryContextAlloc(MemoryContext context, Size size)
+MemoryContextAlloc(MemoryContext context, Size size, const char *tag)
 {
 	AssertArg(MemoryContextIsValid(context));
 
@@ -574,7 +574,7 @@ MemoryContextAlloc(MemoryContext context, Size size)
 
 	context->isReset = false;
 
-	return (*context->methods->alloc) (context, size);
+	return (*context->methods->alloc) (context, size, tag);
 }
 
 /*
@@ -585,7 +585,7 @@ MemoryContextAlloc(MemoryContext context, Size size)
  *	is a very common combination, so we provide the combined operation.
  */
 void *
-MemoryContextAllocZero(MemoryContext context, Size size)
+MemoryContextAllocZero(MemoryContext context, Size size, const char *tag)
 {
 	void	   *ret;
 
@@ -597,7 +597,7 @@ MemoryContextAllocZero(MemoryContext context, Size size)
 
 	context->isReset = false;
 
-	ret = (*context->methods->alloc) (context, size);
+	ret = (*context->methods->alloc) (context, size, tag);
 
 	MemSetAligned(ret, 0, size);
 
@@ -612,7 +612,8 @@ MemoryContextAllocZero(MemoryContext context, Size size)
  *	is so often called with compile-time-constant sizes.
  */
 void *
-MemoryContextAllocZeroAligned(MemoryContext context, Size size)
+MemoryContextAllocZeroAligned(MemoryContext context, Size size,
+							  const char *tag)
 {
 	void	   *ret;
 
@@ -624,7 +625,7 @@ MemoryContextAllocZeroAligned(MemoryContext context, Size size)
 
 	context->isReset = false;
 
-	ret = (*context->methods->alloc) (context, size);
+	ret = (*context->methods->alloc) (context, size, tag);
 
 	MemSetLoop(ret, 0, size);
 
@@ -664,7 +665,7 @@ pfree(void *pointer)
  *		Adjust the size of a previously allocated chunk.
  */
 void *
-repalloc(void *pointer, Size size)
+repalloc_really(void *pointer, Size size, const char *tag)
 {
 	StandardChunkHeader *header;
 
@@ -692,7 +693,7 @@ repalloc(void *pointer, Size size)
 	Assert(!header->context->isReset);
 
 	return (*header->context->methods->realloc) (header->context,
-												 pointer, size);
+												 pointer, size, tag);
 }
 
 /*
@@ -722,12 +723,12 @@ MemoryContextSwitchTo(MemoryContext context)
  *		Like strdup(), but allocate from the specified context
  */
 char *
-MemoryContextStrdup(MemoryContext context, const char *string)
+MemoryContextStrdup_really(MemoryContext context, const char *string, const char *tag)
 {
 	char	   *nstr;
 	Size		len = strlen(string) + 1;
 
-	nstr = (char *) MemoryContextAlloc(context, len);
+	nstr = (char *) MemoryContextAlloc(context, len, tag);
 
 	memcpy(nstr, string, len);
 
diff --git a/src/backend/utils/mmgr/portalmem.c b/src/backend/utils/mmgr/portalmem.c
index cfb73c1..416bf2f 100644
--- a/src/backend/utils/mmgr/portalmem.c
+++ b/src/backend/utils/mmgr/portalmem.c
@@ -215,7 +215,8 @@ CreatePortal(const char *name, bool allowDup, bool dupSilent)
 	}
 
 	/* make new portal structure */
-	portal = (Portal) MemoryContextAllocZero(PortalMemory, sizeof *portal);
+	portal = (Portal) MemoryContextAllocZero(PortalMemory, sizeof *portal,
+											 FileAndLineTag());
 
 	/* initialize portal heap context; typically it won't store much */
 	portal->heap = AllocSetContextCreate(PortalMemory,
diff --git a/src/backend/utils/resowner/resowner.c b/src/backend/utils/resowner/resowner.c
index 7c771eb..c9e36a9 100644
--- a/src/backend/utils/resowner/resowner.c
+++ b/src/backend/utils/resowner/resowner.c
@@ -130,7 +130,8 @@ ResourceOwnerCreate(ResourceOwner parent, const char *name)
 	ResourceOwner owner;
 
 	owner = (ResourceOwner) MemoryContextAllocZero(TopMemoryContext,
-												   sizeof(ResourceOwnerData));
+												   sizeof(ResourceOwnerData),
+												   FileAndLineTag());
 	owner->name = name;
 
 	if (parent)
@@ -467,7 +468,8 @@ RegisterResourceReleaseCallback(ResourceReleaseCallback callback, void *arg)
 
 	item = (ResourceReleaseCallbackItem *)
 		MemoryContextAlloc(TopMemoryContext,
-						   sizeof(ResourceReleaseCallbackItem));
+						   sizeof(ResourceReleaseCallbackItem),
+						   FileAndLineTag());
 	item->callback = callback;
 	item->arg = arg;
 	item->next = ResourceRelease_callbacks;
@@ -519,7 +521,8 @@ ResourceOwnerEnlargeBuffers(ResourceOwner owner)
 	{
 		newmax = 16;
 		owner->buffers = (Buffer *)
-			MemoryContextAlloc(TopMemoryContext, newmax * sizeof(Buffer));
+			MemoryContextAlloc(TopMemoryContext, newmax * sizeof(Buffer),
+							   FileAndLineTag());
 		owner->maxbuffers = newmax;
 	}
 	else
@@ -607,7 +610,8 @@ ResourceOwnerEnlargeCatCacheRefs(ResourceOwner owner)
 	{
 		newmax = 16;
 		owner->catrefs = (HeapTuple *)
-			MemoryContextAlloc(TopMemoryContext, newmax * sizeof(HeapTuple));
+			MemoryContextAlloc(TopMemoryContext, newmax * sizeof(HeapTuple),
+							   FileAndLineTag());
 		owner->maxcatrefs = newmax;
 	}
 	else
@@ -678,7 +682,8 @@ ResourceOwnerEnlargeCatCacheListRefs(ResourceOwner owner)
 	{
 		newmax = 16;
 		owner->catlistrefs = (CatCList **)
-			MemoryContextAlloc(TopMemoryContext, newmax * sizeof(CatCList *));
+			MemoryContextAlloc(TopMemoryContext, newmax * sizeof(CatCList *),
+							   FileAndLineTag());
 		owner->maxcatlistrefs = newmax;
 	}
 	else
@@ -749,7 +754,8 @@ ResourceOwnerEnlargeRelationRefs(ResourceOwner owner)
 	{
 		newmax = 16;
 		owner->relrefs = (Relation *)
-			MemoryContextAlloc(TopMemoryContext, newmax * sizeof(Relation));
+			MemoryContextAlloc(TopMemoryContext, newmax * sizeof(Relation),
+							   FileAndLineTag());
 		owner->maxrelrefs = newmax;
 	}
 	else
@@ -830,7 +836,8 @@ ResourceOwnerEnlargePlanCacheRefs(ResourceOwner owner)
 	{
 		newmax = 16;
 		owner->planrefs = (CachedPlan **)
-			MemoryContextAlloc(TopMemoryContext, newmax * sizeof(CachedPlan *));
+			MemoryContextAlloc(TopMemoryContext, newmax * sizeof(CachedPlan *),
+							   FileAndLineTag());
 		owner->maxplanrefs = newmax;
 	}
 	else
@@ -910,7 +917,8 @@ ResourceOwnerEnlargeTupleDescs(ResourceOwner owner)
 	{
 		newmax = 16;
 		owner->tupdescs = (TupleDesc *)
-			MemoryContextAlloc(TopMemoryContext, newmax * sizeof(TupleDesc));
+			MemoryContextAlloc(TopMemoryContext, newmax * sizeof(TupleDesc),
+							   FileAndLineTag());
 		owner->maxtupdescs = newmax;
 	}
 	else
@@ -992,7 +1000,8 @@ ResourceOwnerEnlargeSnapshots(ResourceOwner owner)
 	{
 		newmax = 16;
 		owner->snapshots = (Snapshot *)
-			MemoryContextAlloc(TopMemoryContext, newmax * sizeof(Snapshot));
+			MemoryContextAlloc(TopMemoryContext, newmax * sizeof(Snapshot),
+							   FileAndLineTag());
 		owner->maxsnapshots = newmax;
 	}
 	else
@@ -1075,7 +1084,8 @@ ResourceOwnerEnlargeFiles(ResourceOwner owner)
 	{
 		newmax = 16;
 		owner->files = (File *)
-			MemoryContextAlloc(TopMemoryContext, newmax * sizeof(File));
+			MemoryContextAlloc(TopMemoryContext, newmax * sizeof(File),
+							   FileAndLineTag());
 		owner->maxfiles = newmax;
 	}
 	else
diff --git a/src/backend/utils/sort/sortsupport.c b/src/backend/utils/sort/sortsupport.c
index 7f388fd..5bf6ede 100644
--- a/src/backend/utils/sort/sortsupport.c
+++ b/src/backend/utils/sort/sortsupport.c
@@ -111,7 +111,8 @@ PrepareSortSupportComparisonShim(Oid cmpFunc, SortSupport ssup)
 	SortShimExtra   *extra;
 
 	extra = (SortShimExtra *) MemoryContextAlloc(ssup->ssup_cxt,
-												 sizeof(SortShimExtra));
+												 sizeof(SortShimExtra),
+												 FileAndLineTag());
 
 	/* Lookup the comparison function */
 	fmgr_info_cxt(cmpFunc, &extra->flinfo, ssup->ssup_cxt);
diff --git a/src/backend/utils/time/combocid.c b/src/backend/utils/time/combocid.c
index 5429922..ad1bf3d 100644
--- a/src/backend/utils/time/combocid.c
+++ b/src/backend/utils/time/combocid.c
@@ -221,7 +221,8 @@ GetComboCommandId(CommandId cmin, CommandId cmax)
 
 		comboCids = (ComboCidKeyData *)
 			MemoryContextAlloc(TopTransactionContext,
-							   sizeof(ComboCidKeyData) * CCID_ARRAY_SIZE);
+							   sizeof(ComboCidKeyData) * CCID_ARRAY_SIZE,
+							   FileAndLineTag());
 		sizeComboCids = CCID_ARRAY_SIZE;
 		usedComboCids = 0;
 	}
diff --git a/src/backend/utils/time/snapmgr.c b/src/backend/utils/time/snapmgr.c
index 574099d..080f76c 100644
--- a/src/backend/utils/time/snapmgr.c
+++ b/src/backend/utils/time/snapmgr.c
@@ -325,7 +325,8 @@ CopySnapshot(Snapshot snapshot)
 	if (snapshot->subxcnt > 0)
 		size += snapshot->subxcnt * sizeof(TransactionId);
 
-	newsnap = (Snapshot) MemoryContextAlloc(TopTransactionContext, size);
+	newsnap = (Snapshot) MemoryContextAlloc(TopTransactionContext, size,
+										    FileAndLineTag());
 	memcpy(newsnap, snapshot, sizeof(SnapshotData));
 
 	newsnap->regd_count = 0;
@@ -390,7 +391,9 @@ PushActiveSnapshot(Snapshot snap)
 
 	Assert(snap != InvalidSnapshot);
 
-	newactive = MemoryContextAlloc(TopTransactionContext, sizeof(ActiveSnapshotElt));
+	newactive = MemoryContextAlloc(TopTransactionContext,
+								   sizeof(ActiveSnapshotElt),
+								   FileAndLineTag());
 
 	/*
 	 * Checking SecondarySnapshot is probably useless here, but it seems
diff --git a/src/include/nodes/bitmapset.h b/src/include/nodes/bitmapset.h
index bcca70d..bc1b9fe 100644
--- a/src/include/nodes/bitmapset.h
+++ b/src/include/nodes/bitmapset.h
@@ -58,9 +58,14 @@ typedef enum
  * function prototypes in nodes/bitmapset.c
  */
 
-extern Bitmapset *bms_copy(const Bitmapset *a);
+#define bms_make_singleton(x) \
+	bms_make_singleton_really(x, FileAndLineTag())
+#define bms_copy(x) \
+	bms_copy_really(x, FileAndLineTag())
+
+extern Bitmapset *bms_copy_really(const Bitmapset *a, const char *tag);
 extern bool bms_equal(const Bitmapset *a, const Bitmapset *b);
-extern Bitmapset *bms_make_singleton(int x);
+extern Bitmapset *bms_make_singleton_really(int x, const char *tag);
 extern void bms_free(Bitmapset *a);
 
 extern Bitmapset *bms_union(const Bitmapset *a, const Bitmapset *b);
@@ -80,9 +85,13 @@ extern bool bms_is_empty(const Bitmapset *a);
 
 /* these routines recycle (modify or free) their non-const inputs: */
 
-extern Bitmapset *bms_add_member(Bitmapset *a, int x);
+#define bms_add_member(a, x) bms_add_member_really(a, x, FileAndLineTag())
+#define bms_add_members(a, b) bms_add_members_really(a, b, FileAndLineTag())
+
+extern Bitmapset *bms_add_member_really(Bitmapset *a, int x, const char *tag);
 extern Bitmapset *bms_del_member(Bitmapset *a, int x);
-extern Bitmapset *bms_add_members(Bitmapset *a, const Bitmapset *b);
+extern Bitmapset *bms_add_members_really(Bitmapset *a, const Bitmapset *b,
+		const char *tag);
 extern Bitmapset *bms_int_members(Bitmapset *a, const Bitmapset *b);
 extern Bitmapset *bms_del_members(Bitmapset *a, const Bitmapset *b);
 extern Bitmapset *bms_join(Bitmapset *a, Bitmapset *b);
diff --git a/src/include/nodes/makefuncs.h b/src/include/nodes/makefuncs.h
index a6dffe6..c9f78da 100644
--- a/src/include/nodes/makefuncs.h
+++ b/src/include/nodes/makefuncs.h
@@ -23,25 +23,35 @@ extern A_Expr *makeA_Expr(A_Expr_Kind kind, List *name,
 extern A_Expr *makeSimpleA_Expr(A_Expr_Kind kind, char *name,
 				 Node *lexpr, Node *rexpr, int location);
 
-extern Var *makeVar(Index varno,
+#define makeVar(a, b, c, d, e, f) \
+	makeVar_really(a, b, c, d, e, f, FileAndLineTag())
+
+extern Var *makeVar_really(Index varno,
 		AttrNumber varattno,
 		Oid vartype,
 		int32 vartypmod,
 		Oid varcollid,
-		Index varlevelsup);
+		Index varlevelsup, const char *tag);
+
+#define makeVarFromTargetEntry(a, b) \
+	makeVarFromTargetEntry_really(a, b, FileAndLineTag())
 
-extern Var *makeVarFromTargetEntry(Index varno,
-					   TargetEntry *tle);
+extern Var *makeVarFromTargetEntry_really(Index varno,
+					   TargetEntry *tle, const char *tag);
 
 extern Var *makeWholeRowVar(RangeTblEntry *rte,
 				Index varno,
 				Index varlevelsup,
 				bool allowScalar);
 
-extern TargetEntry *makeTargetEntry(Expr *expr,
+#define makeTargetEntry(a, b, c, d) \
+	makeTargetEntry_really(a, b, c, d, FileAndLineTag())
+
+extern TargetEntry *makeTargetEntry_really(Expr *expr,
 				AttrNumber resno,
 				char *resname,
-				bool resjunk);
+				bool resjunk,
+				const char *tag);
 
 extern TargetEntry *flatCopyTargetEntry(TargetEntry *src_tle);
 
diff --git a/src/include/nodes/memnodes.h b/src/include/nodes/memnodes.h
index 503d59f..f1bb843 100644
--- a/src/include/nodes/memnodes.h
+++ b/src/include/nodes/memnodes.h
@@ -35,10 +35,10 @@
 
 typedef struct MemoryContextMethods
 {
-	void	   *(*alloc) (MemoryContext context, Size size);
+	void	   *(*alloc) (MemoryContext context, Size size, const char *tag);
 	/* call this free_p in case someone #define's free() */
 	void		(*free_p) (MemoryContext context, void *pointer);
-	void	   *(*realloc) (MemoryContext context, void *pointer, Size size);
+	void	   *(*realloc) (MemoryContext context, void *pointer, Size size, const char *tag);
 	void		(*init) (MemoryContext context);
 	void		(*reset) (MemoryContext context);
 	void		(*delete_context) (MemoryContext context);
diff --git a/src/include/nodes/nodes.h b/src/include/nodes/nodes.h
index 1e16088..516a123 100644
--- a/src/include/nodes/nodes.h
+++ b/src/include/nodes/nodes.h
@@ -447,10 +447,10 @@ typedef struct Node
 #ifdef __GNUC__
 
 /* With GCC, we can use a compound statement within an expression */
-#define newNode(size, tag) \
+#define newNode(size, tag, stag) \
 ({	Node   *_result; \
 	AssertMacro((size) >= sizeof(Node));		/* need the tag, at least */ \
-	_result = (Node *) palloc0fast(size); \
+	_result = (Node *) palloc0fastwithtag(size, stag); \
 	_result->type = (tag); \
 	_result; \
 })
@@ -464,17 +464,18 @@ typedef struct Node
  */
 extern PGDLLIMPORT Node *newNodeMacroHolder;
 
-#define newNode(size, tag) \
+#define newNode(size, tag, stag) \
 ( \
 	AssertMacro((size) >= sizeof(Node)),		/* need the tag, at least */ \
-	newNodeMacroHolder = (Node *) palloc0fast(size), \
+	newNodeMacroHolder = (Node *) palloc0fastwithtag(size, stag), \
 	newNodeMacroHolder->type = (tag), \
 	newNodeMacroHolder \
 )
 #endif   /* __GNUC__ */
 
 
-#define makeNode(_type_)		((_type_ *) newNode(sizeof(_type_),T_##_type_))
+#define makeNode(_type_)		((_type_ *) newNode(sizeof(_type_),T_##_type_,FileAndLineTag()))
+#define makeNodeWithTag(_type_,_tag_)	((_type_ *) newNode(sizeof(_type_),T_##_type_,_tag_))
 #define NodeSetTag(nodeptr,t)	(((Node*)(nodeptr))->type = (t))
 
 #define IsA(nodeptr,_type_)		(nodeTag(nodeptr) == T_##_type_)
diff --git a/src/include/nodes/pg_list.h b/src/include/nodes/pg_list.h
index 15b86dd..344c095 100644
--- a/src/include/nodes/pg_list.h
+++ b/src/include/nodes/pg_list.h
@@ -136,6 +136,10 @@ extern int	list_length(const List *l);
 #define llast_int(l)			lfirst_int(list_tail(l))
 #define llast_oid(l)			lfirst_oid(list_tail(l))
 
+#define lcons(d, l) lcons_really(d, l, FileAndLineTag())
+#define lcons_int(d, l) lcons_int_really(d, l, FileAndLineTag())
+#define lcons_oid(d, l) lcons_oid_really(d, l, FileAndLineTag())
+
 /*
  * Convenience macros for building fixed-length lists
  */
@@ -191,17 +195,21 @@ extern int	list_length(const List *l);
 		 (cell1) != NULL && (cell2) != NULL && (cell3) != NULL;		\
 		 (cell1) = lnext(cell1), (cell2) = lnext(cell2), (cell3) = lnext(cell3))
 
-extern List *lappend(List *list, void *datum);
-extern List *lappend_int(List *list, int datum);
-extern List *lappend_oid(List *list, Oid datum);
+extern List *lappend_really(List *list, void *datum, const char *tag);
+extern List *lappend_int_really(List *list, int datum, const char *tag);
+extern List *lappend_oid_really(List *list, Oid datum, const char *tag);
+
+#define lappend(l, d) lappend_really(l, d, FileAndLineTag())
+#define lappend_int(l, d) lappend_int_really(l, d, FileAndLineTag())
+#define lappend_oid(l, d) lappend_oid_really(l, d, FileAndLineTag())
 
 extern ListCell *lappend_cell(List *list, ListCell *prev, void *datum);
 extern ListCell *lappend_cell_int(List *list, ListCell *prev, int datum);
 extern ListCell *lappend_cell_oid(List *list, ListCell *prev, Oid datum);
 
-extern List *lcons(void *datum, List *list);
-extern List *lcons_int(int datum, List *list);
-extern List *lcons_oid(Oid datum, List *list);
+extern List *lcons_really(void *datum, List *list, const char *tag);
+extern List *lcons_int_really(int datum, List *list, const char *tag);
+extern List *lcons_oid_really(Oid datum, List *list, const char *tag);
 
 extern List *list_concat(List *list1, List *list2);
 extern List *list_truncate(List *list, int new_size);
@@ -236,10 +244,23 @@ extern List *list_difference_ptr(const List *list1, const List *list2);
 extern List *list_difference_int(const List *list1, const List *list2);
 extern List *list_difference_oid(const List *list1, const List *list2);
 
-extern List *list_append_unique(List *list, void *datum);
-extern List *list_append_unique_ptr(List *list, void *datum);
-extern List *list_append_unique_int(List *list, int datum);
-extern List *list_append_unique_oid(List *list, Oid datum);
+extern List *list_append_unique_really(List *list, void *datum,
+									   const char *tag);
+extern List *list_append_unique_ptr_really(List *list, void *datum,
+										   const char *tag);
+extern List *list_append_unique_int_really(List *list, int datum,
+										   const char *tag);
+extern List *list_append_unique_oid_really(List *list, Oid datum,
+										   const char *tag);
+
+#define list_append_unique(l, d) \
+	list_append_unique_really(l, d, FileAndLineTag())
+#define list_append_unique_ptr(l, d) \
+	list_append_unique_ptr_really(l, d, FileAndLineTag())
+#define list_append_unique_int(l, d) \
+	list_append_unique_int_really(l, d, FileAndLineTag())
+#define list_append_unique_oid(l, d) \
+	list_append_unique_oid_really(l, d, FileAndLineTag())
 
 extern List *list_concat_unique(List *list1, List *list2);
 extern List *list_concat_unique_ptr(List *list1, List *list2);
@@ -249,8 +270,12 @@ extern List *list_concat_unique_oid(List *list1, List *list2);
 extern void list_free(List *list);
 extern void list_free_deep(List *list);
 
-extern List *list_copy(const List *list);
-extern List *list_copy_tail(const List *list, int nskip);
+#define list_copy(l) list_copy_really(l, FileAndLineTag())
+#define list_copy_tail(l, n) list_copy_tail_really(l, n, FileAndLineTag())
+
+extern List *list_copy_really(const List *list, const char *tag);
+extern List *list_copy_tail_really(const List *list, int nskip,
+								   const char *tag);
 
 /*
  * To ease migration to the new list API, a set of compatibility
diff --git a/src/include/nodes/value.h b/src/include/nodes/value.h
index 523a906..d643a0a 100644
--- a/src/include/nodes/value.h
+++ b/src/include/nodes/value.h
@@ -53,9 +53,11 @@ typedef struct Value
 #define floatVal(v)		atof(((Value *)(v))->val.str)
 #define strVal(v)		(((Value *)(v))->val.str)
 
+#define makeString(x) makeString_really(x, FileAndLineTag())
+
 extern Value *makeInteger(long i);
 extern Value *makeFloat(char *numericStr);
-extern Value *makeString(char *str);
+extern Value *makeString_really(char *str, const char *tag);
 extern Value *makeBitString(char *str);
 
 #endif   /* VALUE_H */
diff --git a/src/include/utils/memutils.h b/src/include/utils/memutils.h
index a2bb3d9..4163873 100644
--- a/src/include/utils/memutils.h
+++ b/src/include/utils/memutils.h
@@ -108,10 +108,14 @@ extern bool MemoryContextContains(MemoryContext context, void *pointer);
  * context creation.  It's intended to be called from context-type-
  * specific creation routines, and noplace else.
  */
-extern MemoryContext MemoryContextCreate(NodeTag tag, Size size,
+
+#define MemoryContextCreate(a, b, c, d, e) \
+	MemoryContextCreate_really(a, b, c, d, e, FileAndLineTag())
+
+extern MemoryContext MemoryContextCreate_really(NodeTag tag, Size size,
 					MemoryContextMethods *methods,
 					MemoryContext parent,
-					const char *name);
+					const char *name, const char *stag);
 
 
 /*
@@ -119,11 +123,14 @@ extern MemoryContext MemoryContextCreate(NodeTag tag, Size size,
  */
 
 /* aset.c */
-extern MemoryContext AllocSetContextCreate(MemoryContext parent,
+#define AllocSetContextCreate(a, b, c, d, e) \
+	AllocSetContextCreate_really(a, b, c, d, e, FileAndLineTag())
+
+extern MemoryContext AllocSetContextCreate_really(MemoryContext parent,
 					  const char *name,
 					  Size minContextSize,
 					  Size initBlockSize,
-					  Size maxBlockSize);
+					  Size maxBlockSize, const char *tag);
 
 /*
  * Recommended default alloc parameters, suitable for "ordinary" contexts
@@ -141,4 +148,6 @@ extern MemoryContext AllocSetContextCreate(MemoryContext parent,
 #define ALLOCSET_SMALL_INITSIZE  (1 * 1024)
 #define ALLOCSET_SMALL_MAXSIZE	 (8 * 1024)
 
+extern void dump_allocations(void);
+
 #endif   /* MEMUTILS_H */
diff --git a/src/include/utils/palloc.h b/src/include/utils/palloc.h
index 973f306..277f5cc 100644
--- a/src/include/utils/palloc.h
+++ b/src/include/utils/palloc.h
@@ -45,13 +45,16 @@ extern PGDLLIMPORT MemoryContext CurrentMemoryContext;
 /*
  * Fundamental memory-allocation operations (more are in utils/memutils.h)
  */
-extern void *MemoryContextAlloc(MemoryContext context, Size size);
-extern void *MemoryContextAllocZero(MemoryContext context, Size size);
-extern void *MemoryContextAllocZeroAligned(MemoryContext context, Size size);
+extern void *MemoryContextAlloc(MemoryContext context, Size size, const char *tag);
+extern void *MemoryContextAllocZero(MemoryContext context, Size size, const char *tag);
+extern void *MemoryContextAllocZeroAligned(MemoryContext context, Size size, const char *tag);
 
-#define palloc(sz)	MemoryContextAlloc(CurrentMemoryContext, (sz))
+#define CppMacroAsString(x)			CppAsString(x)
+#define FileAndLineTag()			(__FILE__ ":" CppMacroAsString(__LINE__))
 
-#define palloc0(sz) MemoryContextAllocZero(CurrentMemoryContext, (sz))
+#define palloc(sz)	MemoryContextAlloc(CurrentMemoryContext, (sz), FileAndLineTag())
+
+#define palloc0(sz) MemoryContextAllocZero(CurrentMemoryContext, (sz), FileAndLineTag())
 
 /*
  * The result of palloc() is always word-aligned, so we can skip testing
@@ -63,12 +66,19 @@ extern void *MemoryContextAllocZeroAligned(MemoryContext context, Size size);
  */
 #define palloc0fast(sz) \
 	( MemSetTest(0, sz) ? \
-		MemoryContextAllocZeroAligned(CurrentMemoryContext, sz) : \
-		MemoryContextAllocZero(CurrentMemoryContext, sz) )
+		MemoryContextAllocZeroAligned(CurrentMemoryContext, sz, FileAndLineTag()) : \
+		MemoryContextAllocZero(CurrentMemoryContext, sz, FileAndLineTag()) )
+
+#define palloc0fastwithtag(sz, tag) \
+	( MemSetTest(0, sz) ? \
+		MemoryContextAllocZeroAligned(CurrentMemoryContext, sz, tag) : \
+		MemoryContextAllocZero(CurrentMemoryContext, sz, tag) )
 
 extern void pfree(void *pointer);
 
-extern void *repalloc(void *pointer, Size size);
+extern void *repalloc_really(void *pointer, Size size, const char *tag);
+
+#define repalloc(p, s) repalloc_really(p, s, FileAndLineTag())
 
 /*
  * MemoryContextSwitchTo can't be a macro in standard C compilers.
@@ -97,8 +107,9 @@ extern MemoryContext MemoryContextSwitchTo(MemoryContext context);
  * These are like standard strdup() except the copied string is
  * allocated in a context, not with malloc().
  */
-extern char *MemoryContextStrdup(MemoryContext context, const char *string);
+extern char *MemoryContextStrdup_really(MemoryContext context, const char *string, const char *tag);
 
+#define MemoryContextStrdup(a, b)  MemoryContextStrdup_really(a, b, FileAndLineTag())
 #define pstrdup(str)  MemoryContextStrdup(CurrentMemoryContext, (str))
 
 extern char *pnstrdup(const char *in, Size len);
diff --git a/src/pl/plpgsql/src/pl_comp.c b/src/pl/plpgsql/src/pl_comp.c
index d43b8e0..68adf0b 100644
--- a/src/pl/plpgsql/src/pl_comp.c
+++ b/src/pl/plpgsql/src/pl_comp.c
@@ -321,7 +321,8 @@ do_compile(FunctionCallInfo fcinfo,
 	if (function == NULL)
 	{
 		function = (PLpgSQL_function *)
-			MemoryContextAllocZero(TopMemoryContext, sizeof(PLpgSQL_function));
+			MemoryContextAllocZero(TopMemoryContext, sizeof(PLpgSQL_function),
+								   FileAndLineTag());
 	}
 	else
 	{
@@ -364,7 +365,8 @@ do_compile(FunctionCallInfo fcinfo,
 	plpgsql_nDatums = 0;
 	/* This is short-lived, so needn't allocate in function's cxt */
 	plpgsql_Datums = MemoryContextAlloc(compile_tmp_cxt,
-									 sizeof(PLpgSQL_datum *) * datums_alloc);
+									 sizeof(PLpgSQL_datum *) * datums_alloc,
+									 FileAndLineTag());
 	datums_last = 0;
 
 	switch (is_trigger)
diff --git a/src/pl/plpgsql/src/pl_exec.c b/src/pl/plpgsql/src/pl_exec.c
index 95e74b3..16dd5ef 100644
--- a/src/pl/plpgsql/src/pl_exec.c
+++ b/src/pl/plpgsql/src/pl_exec.c
@@ -5909,7 +5909,8 @@ plpgsql_create_econtext(PLpgSQL_execstate *estate)
 	 */
 	entry = (SimpleEcontextStackEntry *)
 		MemoryContextAlloc(TopTransactionContext,
-						   sizeof(SimpleEcontextStackEntry));
+						   sizeof(SimpleEcontextStackEntry),
+						   FileAndLineTag());
 
 	entry->stack_econtext = estate->eval_econtext;
 	entry->xact_subxid = GetCurrentSubTransactionId();
diff --git a/src/pl/plpython/plpy_util.c b/src/pl/plpython/plpy_util.c
index 414b9d5..f95bffb 100644
--- a/src/pl/plpython/plpy_util.c
+++ b/src/pl/plpython/plpy_util.c
@@ -21,7 +21,7 @@ void *
 PLy_malloc(size_t bytes)
 {
 	/* We need our allocations to be long-lived, so use TopMemoryContext */
-	return MemoryContextAlloc(TopMemoryContext, bytes);
+	return MemoryContextAlloc(TopMemoryContext, bytes, FileAndLineTag());
 }
 
 void *