mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-24 03:33:20 +01:00
PIC16 emits auto variables as globals. When optimizer removes a function entierly by estimating its side effects on globals, those globals(autos) without a function were not being printed by the Asm printer.
llvm-svn: 73135
This commit is contained in:
parent
3f7cc686d9
commit
2121a84223
@ -280,6 +280,7 @@ void PIC16AsmPrinter::EmitRomData (Module &M)
|
|||||||
|
|
||||||
bool PIC16AsmPrinter::doFinalization(Module &M) {
|
bool PIC16AsmPrinter::doFinalization(Module &M) {
|
||||||
printLibcallDecls();
|
printLibcallDecls();
|
||||||
|
EmitRemainingAutos();
|
||||||
DbgInfo.EmitVarDebugInfo(M);
|
DbgInfo.EmitVarDebugInfo(M);
|
||||||
DbgInfo.EmitEOF();
|
DbgInfo.EmitEOF();
|
||||||
O << "\n\t" << "END\n";
|
O << "\n\t" << "END\n";
|
||||||
@ -383,6 +384,8 @@ void PIC16AsmPrinter::EmitAutos (std::string FunctName)
|
|||||||
for (unsigned i = 0; i < AutosSections.size(); i++) {
|
for (unsigned i = 0; i < AutosSections.size(); i++) {
|
||||||
O << "\n";
|
O << "\n";
|
||||||
if (AutosSections[i]->S_->getName() == SectionName) {
|
if (AutosSections[i]->S_->getName() == SectionName) {
|
||||||
|
// Set the printing status to true
|
||||||
|
AutosSections[i]->setPrintedStatus(true);
|
||||||
SwitchToSection(AutosSections[i]->S_);
|
SwitchToSection(AutosSections[i]->S_);
|
||||||
std::vector<const GlobalVariable*> Items = AutosSections[i]->Items;
|
std::vector<const GlobalVariable*> Items = AutosSections[i]->Items;
|
||||||
for (unsigned j = 0; j < Items.size(); j++) {
|
for (unsigned j = 0; j < Items.size(); j++) {
|
||||||
@ -398,3 +401,34 @@ void PIC16AsmPrinter::EmitAutos (std::string FunctName)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Print autos that were not printed during the code printing of functions.
|
||||||
|
// As the functions might themselves would have got deleted by the optimizer.
|
||||||
|
void PIC16AsmPrinter::EmitRemainingAutos()
|
||||||
|
{
|
||||||
|
const TargetData *TD = TM.getTargetData();
|
||||||
|
|
||||||
|
// Now print Autos section for this function.
|
||||||
|
std::vector <PIC16Section *>AutosSections = PTAI->AutosSections;
|
||||||
|
for (unsigned i = 0; i < AutosSections.size(); i++) {
|
||||||
|
|
||||||
|
// if the section is already printed then don't print again
|
||||||
|
if (AutosSections[i]->isPrinted())
|
||||||
|
continue;
|
||||||
|
|
||||||
|
// Set status as printed
|
||||||
|
AutosSections[i]->setPrintedStatus(true);
|
||||||
|
|
||||||
|
O << "\n";
|
||||||
|
SwitchToSection(AutosSections[i]->S_);
|
||||||
|
std::vector<const GlobalVariable*> Items = AutosSections[i]->Items;
|
||||||
|
for (unsigned j = 0; j < Items.size(); j++) {
|
||||||
|
std::string VarName = Mang->getValueName(Items[j]);
|
||||||
|
Constant *C = Items[j]->getInitializer();
|
||||||
|
const Type *Ty = C->getType();
|
||||||
|
unsigned Size = TD->getTypeAllocSize(Ty);
|
||||||
|
// Emit memory reserve directive.
|
||||||
|
O << VarName << " RES " << Size << "\n";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@ -52,6 +52,7 @@ namespace llvm {
|
|||||||
void EmitIData (Module &M);
|
void EmitIData (Module &M);
|
||||||
void EmitUData (Module &M);
|
void EmitUData (Module &M);
|
||||||
void EmitAutos (std::string FunctName);
|
void EmitAutos (std::string FunctName);
|
||||||
|
void EmitRemainingAutos ();
|
||||||
void EmitRomData (Module &M);
|
void EmitRomData (Module &M);
|
||||||
void EmitFunctionFrame(MachineFunction &MF);
|
void EmitFunctionFrame(MachineFunction &MF);
|
||||||
void printLibcallDecls(void);
|
void printLibcallDecls(void);
|
||||||
|
@ -33,9 +33,13 @@ namespace llvm {
|
|||||||
struct PIC16Section {
|
struct PIC16Section {
|
||||||
const Section *S_; // Connection to actual Section.
|
const Section *S_; // Connection to actual Section.
|
||||||
unsigned Size; // Total size of the objects contained.
|
unsigned Size; // Total size of the objects contained.
|
||||||
|
bool SectionPrinted;
|
||||||
std::vector<const GlobalVariable*> Items;
|
std::vector<const GlobalVariable*> Items;
|
||||||
|
|
||||||
PIC16Section (const Section *s) { S_ = s; Size = 0; }
|
PIC16Section (const Section *s) { S_ = s; Size = 0;
|
||||||
|
SectionPrinted = false;}
|
||||||
|
bool isPrinted() { return SectionPrinted ; }
|
||||||
|
void setPrintedStatus(bool status) { SectionPrinted = status ;}
|
||||||
};
|
};
|
||||||
|
|
||||||
struct PIC16TargetAsmInfo : public TargetAsmInfo {
|
struct PIC16TargetAsmInfo : public TargetAsmInfo {
|
||||||
|
Loading…
Reference in New Issue
Block a user