aboutsummaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/Target/PowerPC/PPC32AsmPrinter.cpp53
-rw-r--r--lib/Target/PowerPC/PPC32ISelSimple.cpp2
-rw-r--r--lib/Target/PowerPC/PPCAsmPrinter.cpp53
3 files changed, 55 insertions, 53 deletions
diff --git a/lib/Target/PowerPC/PPC32AsmPrinter.cpp b/lib/Target/PowerPC/PPC32AsmPrinter.cpp
index 5f3b5de..4ec7b7d 100644
--- a/lib/Target/PowerPC/PPC32AsmPrinter.cpp
+++ b/lib/Target/PowerPC/PPC32AsmPrinter.cpp
@@ -74,7 +74,7 @@ namespace {
}
void printMachineInstruction(const MachineInstr *MI);
- void printOp(const MachineOperand &MO, bool elideOffsetKeyword = false);
+ void printOp(const MachineOperand &MO, bool LoadAddrOp = false);
void printImmOp(const MachineOperand &MO, unsigned ArgType);
void printConstantPool(MachineConstantPool *MCP);
bool runOnMachineFunction(MachineFunction &F);
@@ -401,7 +401,7 @@ bool Printer::runOnMachineFunction(MachineFunction &MF) {
}
void Printer::printOp(const MachineOperand &MO,
- bool elideOffsetKeyword /* = false */) {
+ bool LoadAddrOp /* = false */) {
const MRegisterInfo &RI = *TM.getRegisterInfo();
int new_symbol;
@@ -444,31 +444,32 @@ void Printer::printOp(const MachineOperand &MO,
O << MO.getSymbolName();
return;
- case MachineOperand::MO_GlobalAddress:
- if (!elideOffsetKeyword) {
- GlobalValue *GV = MO.getGlobal();
- std::string Name = Mang->getValueName(GV);
-
- // Dynamically-resolved functions need a stub for the function
- Function *F = dyn_cast<Function>(GV);
- if (F && F->isExternal() &&
- TM.CalledFunctions.find(F) != TM.CalledFunctions.end()) {
- FnStubs.insert(Name);
- O << "L" << Name << "$stub";
- return;
- }
-
- // External global variables need a non-lazily-resolved stub
- if (!GV->hasInternalLinkage() &&
- TM.AddressTaken.find(GV) != TM.AddressTaken.end()) {
- GVStubs.insert(Name);
- O << "L" << Name << "$non_lazy_ptr";
- return;
- }
+ case MachineOperand::MO_GlobalAddress: {
+ GlobalValue *GV = MO.getGlobal();
+ std::string Name = Mang->getValueName(GV);
+
+ // Dynamically-resolved functions need a stub for the function. Be
+ // wary however not to output $stub for external functions whose addresses
+ // are taken. Those should be emitted as $non_lazy_ptr below.
+ Function *F = dyn_cast<Function>(GV);
+ if (F && F->isExternal() && !LoadAddrOp &&
+ TM.CalledFunctions.find(F) != TM.CalledFunctions.end()) {
+ FnStubs.insert(Name);
+ O << "L" << Name << "$stub";
+ return;
+ }
- O << Mang->getValueName(GV);
+ // External global variables need a non-lazily-resolved stub
+ if (!GV->hasInternalLinkage() &&
+ TM.AddressTaken.find(GV) != TM.AddressTaken.end()) {
+ GVStubs.insert(Name);
+ O << "L" << Name << "$non_lazy_ptr";
+ return;
}
+
+ O << Mang->getValueName(GV);
return;
+ }
default:
O << "<unknown operand type: " << MO.getType() << ">";
@@ -548,7 +549,7 @@ void Printer::printMachineInstruction(const MachineInstr *MI) {
if (Opcode == PPC::LOADLoDirect || Opcode == PPC::LOADLoIndirect) {
printOp(MI->getOperand(0));
O << ", lo16(";
- printOp(MI->getOperand(2));
+ printOp(MI->getOperand(2), true /* LoadAddrOp */);
O << "-\"L0000" << LabelNumber << "$pb\")";
O << "(";
if (MI->getOperand(1).getReg() == PPC::R0)
@@ -564,7 +565,7 @@ void Printer::printMachineInstruction(const MachineInstr *MI) {
else
printOp(MI->getOperand(1));
O << ", ha16(" ;
- printOp(MI->getOperand(2));
+ printOp(MI->getOperand(2), true /* LoadAddrOp */);
O << "-\"L0000" << LabelNumber << "$pb\")\n";
} else if (ArgCount == 3 && ArgType[1] == PPCII::Disimm16) {
printOp(MI->getOperand(0));
diff --git a/lib/Target/PowerPC/PPC32ISelSimple.cpp b/lib/Target/PowerPC/PPC32ISelSimple.cpp
index eabe9d8..e5bfb8c 100644
--- a/lib/Target/PowerPC/PPC32ISelSimple.cpp
+++ b/lib/Target/PowerPC/PPC32ISelSimple.cpp
@@ -68,7 +68,7 @@ static inline TypeClass getClass(const Type *Ty) {
// getClassB - Just like getClass, but treat boolean values as ints.
static inline TypeClass getClassB(const Type *Ty) {
- if (Ty == Type::BoolTy) return cInt;
+ if (Ty == Type::BoolTy) return cByte;
return getClass(Ty);
}
diff --git a/lib/Target/PowerPC/PPCAsmPrinter.cpp b/lib/Target/PowerPC/PPCAsmPrinter.cpp
index 5f3b5de..4ec7b7d 100644
--- a/lib/Target/PowerPC/PPCAsmPrinter.cpp
+++ b/lib/Target/PowerPC/PPCAsmPrinter.cpp
@@ -74,7 +74,7 @@ namespace {
}
void printMachineInstruction(const MachineInstr *MI);
- void printOp(const MachineOperand &MO, bool elideOffsetKeyword = false);
+ void printOp(const MachineOperand &MO, bool LoadAddrOp = false);
void printImmOp(const MachineOperand &MO, unsigned ArgType);
void printConstantPool(MachineConstantPool *MCP);
bool runOnMachineFunction(MachineFunction &F);
@@ -401,7 +401,7 @@ bool Printer::runOnMachineFunction(MachineFunction &MF) {
}
void Printer::printOp(const MachineOperand &MO,
- bool elideOffsetKeyword /* = false */) {
+ bool LoadAddrOp /* = false */) {
const MRegisterInfo &RI = *TM.getRegisterInfo();
int new_symbol;
@@ -444,31 +444,32 @@ void Printer::printOp(const MachineOperand &MO,
O << MO.getSymbolName();
return;
- case MachineOperand::MO_GlobalAddress:
- if (!elideOffsetKeyword) {
- GlobalValue *GV = MO.getGlobal();
- std::string Name = Mang->getValueName(GV);
-
- // Dynamically-resolved functions need a stub for the function
- Function *F = dyn_cast<Function>(GV);
- if (F && F->isExternal() &&
- TM.CalledFunctions.find(F) != TM.CalledFunctions.end()) {
- FnStubs.insert(Name);
- O << "L" << Name << "$stub";
- return;
- }
-
- // External global variables need a non-lazily-resolved stub
- if (!GV->hasInternalLinkage() &&
- TM.AddressTaken.find(GV) != TM.AddressTaken.end()) {
- GVStubs.insert(Name);
- O << "L" << Name << "$non_lazy_ptr";
- return;
- }
+ case MachineOperand::MO_GlobalAddress: {
+ GlobalValue *GV = MO.getGlobal();
+ std::string Name = Mang->getValueName(GV);
+
+ // Dynamically-resolved functions need a stub for the function. Be
+ // wary however not to output $stub for external functions whose addresses
+ // are taken. Those should be emitted as $non_lazy_ptr below.
+ Function *F = dyn_cast<Function>(GV);
+ if (F && F->isExternal() && !LoadAddrOp &&
+ TM.CalledFunctions.find(F) != TM.CalledFunctions.end()) {
+ FnStubs.insert(Name);
+ O << "L" << Name << "$stub";
+ return;
+ }
- O << Mang->getValueName(GV);
+ // External global variables need a non-lazily-resolved stub
+ if (!GV->hasInternalLinkage() &&
+ TM.AddressTaken.find(GV) != TM.AddressTaken.end()) {
+ GVStubs.insert(Name);
+ O << "L" << Name << "$non_lazy_ptr";
+ return;
}
+
+ O << Mang->getValueName(GV);
return;
+ }
default:
O << "<unknown operand type: " << MO.getType() << ">";
@@ -548,7 +549,7 @@ void Printer::printMachineInstruction(const MachineInstr *MI) {
if (Opcode == PPC::LOADLoDirect || Opcode == PPC::LOADLoIndirect) {
printOp(MI->getOperand(0));
O << ", lo16(";
- printOp(MI->getOperand(2));
+ printOp(MI->getOperand(2), true /* LoadAddrOp */);
O << "-\"L0000" << LabelNumber << "$pb\")";
O << "(";
if (MI->getOperand(1).getReg() == PPC::R0)
@@ -564,7 +565,7 @@ void Printer::printMachineInstruction(const MachineInstr *MI) {
else
printOp(MI->getOperand(1));
O << ", ha16(" ;
- printOp(MI->getOperand(2));
+ printOp(MI->getOperand(2), true /* LoadAddrOp */);
O << "-\"L0000" << LabelNumber << "$pb\")\n";
} else if (ArgCount == 3 && ArgType[1] == PPCII::Disimm16) {
printOp(MI->getOperand(0));