[llvm] Reland [AMDGPU] Add AMDGPU specific variadic operation MCExprs (PR #84562)
Matt Arsenault via llvm-commits
llvm-commits at lists.llvm.org
Mon Mar 11 20:45:52 PDT 2024
================
@@ -0,0 +1,103 @@
+//===- AMDGPUMCExpr.cpp - AMDGPU specific MC expression classes -----------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#include "AMDGPUMCExpr.h"
+#include "llvm/MC/MCContext.h"
+#include "llvm/MC/MCStreamer.h"
+#include "llvm/MC/MCSymbol.h"
+#include "llvm/MC/MCValue.h"
+#include "llvm/Support/Allocator.h"
+#include "llvm/Support/raw_ostream.h"
+#include <optional>
+
+using namespace llvm;
+
+const AMDGPUVariadicMCExpr *
+AMDGPUVariadicMCExpr::create(VariadicKind Kind, ArrayRef<const MCExpr *> Args,
+ MCContext &Ctx) {
+ // Storage for the argument's 'const MCExpr*' allocated through MCContext new
+ // placement which means that AMDGPUVariadicMCExpr objects and all of its
+ // contents will now be allocated through MCContext new placement.
+ //
+ // Will result in an asan failure if allocated on the heap (e.g., through
+ // SmallVector's grow).
+ const MCExpr **CtxArgs = static_cast<const MCExpr **>(
+ Ctx.allocate(sizeof(const MCExpr *) * Args.size()));
+ std::uninitialized_copy(Args.begin(), Args.end(), CtxArgs);
----------------
arsenm wrote:
This should be done in the AMDGPUVariadicMCExpr constructor. Also, I see MCContext does have operator new/delete wrappers around allocate.
Plus you're missing the deallocate which needs to go in the destructor
https://github.com/llvm/llvm-project/pull/84562
More information about the llvm-commits
mailing list