blob: 000f3d175b88476bc15ee45b45eff3edc59f446e [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 Lattnerf2868ce2002-02-03 07:54:50 +000029
Brian Gaeked0fde302003-11-11 22:41:34 +000030namespace llvm {
31
Chris Lattner51a8d852002-10-28 01:21:55 +000032AnnotationID MCFI_AID(
Chris Lattnerf2868ce2002-02-03 07:54:50 +000033 AnnotationManager::getID("CodeGen::MachineCodeForInstruction"));
34
35static Annotation *CreateMCFI(AnnotationID AID, const Annotable *, void *) {
36 assert(AID == MCFI_AID);
37 return new MachineCodeForInstruction(); // Invoke constructor!
38}
39
40// Register the annotation with the annotation factory
Vikram S. Adve45c38772002-07-08 23:04:31 +000041static struct MCFIInitializer {
42 MCFIInitializer() {
Chris Lattnerf2868ce2002-02-03 07:54:50 +000043 AnnotationManager::registerAnnotationFactory(MCFI_AID, &CreateMCFI);
44 }
Vikram S. Adve45c38772002-07-08 23:04:31 +000045} RegisterCreateMCFI;
Chris Lattnerf2868ce2002-02-03 07:54:50 +000046
Vikram S. Adveded1bf82002-03-24 03:40:11 +000047
Vikram S. Adveded1bf82002-03-24 03:40:11 +000048void
49MachineCodeForInstruction::dropAllReferences()
50{
51 for (unsigned i=0, N=tempVec.size(); i < N; i++)
52 cast<TmpInstruction>(tempVec[i])->dropAllReferences();
53}
Chris Lattnerf2868ce2002-02-03 07:54:50 +000054
Vikram S. Adveded1bf82002-03-24 03:40:11 +000055
Vikram S. Adveded1bf82002-03-24 03:40:11 +000056MachineCodeForInstruction::~MachineCodeForInstruction()
57{
58 // Let go of all uses in temp. instructions
59 dropAllReferences();
60
Chris Lattnerf2868ce2002-02-03 07:54:50 +000061 // Free the Value objects created to hold intermediate values
62 for (unsigned i=0, N=tempVec.size(); i < N; i++)
63 delete tempVec[i];
64
65 // Free the MachineInstr objects allocated, if any.
66 for (unsigned i=0, N = size(); i < N; i++)
67 delete (*this)[i];
Vikram S. Advee68a3432002-10-29 19:38:46 +000068
69 // Free the CallArgsDescriptor if it exists.
70 if (callArgsDesc)
71 delete callArgsDesc;
Chris Lattnerf2868ce2002-02-03 07:54:50 +000072}
Brian Gaeked0fde302003-11-11 22:41:34 +000073
74} // End llvm namespace