blob: a0982fe2748c9e1e8088b0b7aab8e203339978c0 [file] [log] [blame]
Chris Lattnerf2868ce2002-02-03 07:54:50 +00001//===-- MachineCodeForInstruction.cpp -------------------------------------===//
John Criswellb576c942003-10-20 19:43:21 +00002//
3// The LLVM Compiler Infrastructure
4//
5// This file was developed by the LLVM research group and is distributed under
6// the University of Illinois Open Source License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
Chris Lattnerf2868ce2002-02-03 07:54:50 +00009//
Chris Lattner51a8d852002-10-28 01:21:55 +000010// Representation of the sequence of machine instructions created for a single
11// VM instruction. Additionally records information about hidden and implicit
12// values used by the machine instructions: about hidden values used by the
13// machine instructions:
Chris Lattnerf2868ce2002-02-03 07:54:50 +000014//
Chris Lattner51a8d852002-10-28 01:21:55 +000015// "Temporary values" are intermediate values used in the machine instruction
16// sequence, but not in the VM instruction Note that such values should be
17// treated as pure SSA values with no interpretation of their operands (i.e., as
18// a TmpInstruction object which actually represents such a value).
Chris Lattnerf2868ce2002-02-03 07:54:50 +000019//
Chris Lattner51a8d852002-10-28 01:21:55 +000020// (2) "Implicit uses" are values used in the VM instruction but not in the
21// machine instruction sequence
Chris Lattnerf2868ce2002-02-03 07:54:50 +000022//
23//===----------------------------------------------------------------------===//
24
25#include "llvm/CodeGen/MachineCodeForInstruction.h"
26#include "llvm/CodeGen/MachineInstr.h"
Vikram S. Advee68a3432002-10-29 19:38:46 +000027#include "llvm/CodeGen/MachineInstrAnnot.h"
Vikram S. Adveded1bf82002-03-24 03:40:11 +000028#include "llvm/CodeGen/InstrSelection.h"
Chris Lattnerd5da1972004-01-09 06:30:18 +000029using namespace llvm;
Chris Lattnerf2868ce2002-02-03 07:54:50 +000030
Chris Lattnerd5da1972004-01-09 06:30:18 +000031AnnotationID llvm::MCFI_AID(
Chris Lattnerf2868ce2002-02-03 07:54:50 +000032 AnnotationManager::getID("CodeGen::MachineCodeForInstruction"));
33
34static Annotation *CreateMCFI(AnnotationID AID, const Annotable *, void *) {
35 assert(AID == MCFI_AID);
36 return new MachineCodeForInstruction(); // Invoke constructor!
37}
38
39// Register the annotation with the annotation factory
Vikram S. Adve45c38772002-07-08 23:04:31 +000040static struct MCFIInitializer {
41 MCFIInitializer() {
Chris Lattnerf2868ce2002-02-03 07:54:50 +000042 AnnotationManager::registerAnnotationFactory(MCFI_AID, &CreateMCFI);
43 }
Vikram S. Adve45c38772002-07-08 23:04:31 +000044} RegisterCreateMCFI;
Chris Lattnerf2868ce2002-02-03 07:54:50 +000045
Vikram S. Adveded1bf82002-03-24 03:40:11 +000046
Vikram S. Adveded1bf82002-03-24 03:40:11 +000047void
48MachineCodeForInstruction::dropAllReferences()
49{
50 for (unsigned i=0, N=tempVec.size(); i < N; i++)
51 cast<TmpInstruction>(tempVec[i])->dropAllReferences();
52}
Chris Lattnerf2868ce2002-02-03 07:54:50 +000053
Vikram S. Adveded1bf82002-03-24 03:40:11 +000054
Chris Lattnerd5da1972004-01-09 06:30:18 +000055MachineCodeForInstruction::~MachineCodeForInstruction() {
Vikram S. Adveded1bf82002-03-24 03:40:11 +000056 // Let go of all uses in temp. instructions
57 dropAllReferences();
58
Chris Lattnerf2868ce2002-02-03 07:54:50 +000059 // Free the Value objects created to hold intermediate values
60 for (unsigned i=0, N=tempVec.size(); i < N; i++)
61 delete tempVec[i];
62
63 // Free the MachineInstr objects allocated, if any.
64 for (unsigned i=0, N = size(); i < N; i++)
65 delete (*this)[i];
Vikram S. Advee68a3432002-10-29 19:38:46 +000066
67 // Free the CallArgsDescriptor if it exists.
Chris Lattnerd5da1972004-01-09 06:30:18 +000068 delete callArgsDesc;
Chris Lattnerf2868ce2002-02-03 07:54:50 +000069}