mirror of
				https://github.com/c64scene-ar/llvm-6502.git
				synced 2025-10-30 16:17:05 +00:00 
			
		
		
		
	Try harder to evaluate expressions when printing assembly.
When printing assembly we don't have a Layout object, but we can still try to fold some constants. Testcase by Ulrich Weigand. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@203677 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
		| @@ -91,7 +91,7 @@ public: | ||||
|   /// @param Res - The relocatable value, if evaluation succeeds. | ||||
|   /// @param Layout - The assembler layout object to use for evaluating values. | ||||
|   /// @result - True on success. | ||||
|   bool EvaluateAsRelocatable(MCValue &Res, const MCAsmLayout &Layout) const; | ||||
|   bool EvaluateAsRelocatable(MCValue &Res, const MCAsmLayout *Layout) const; | ||||
|  | ||||
|   /// FindAssociatedSection - Find the "associated section" for this expression, | ||||
|   /// which is currently defined as the absolute section for constants, or | ||||
|   | ||||
| @@ -122,7 +122,7 @@ uint64_t MCAsmLayout::getSymbolOffset(const MCSymbolData *SD) const { | ||||
|   // If this is a variable, then recursively evaluate now. | ||||
|   if (S.isVariable()) { | ||||
|     MCValue Target; | ||||
|     if (!S.getVariableValue()->EvaluateAsRelocatable(Target, *this)) | ||||
|     if (!S.getVariableValue()->EvaluateAsRelocatable(Target, this)) | ||||
|       report_fatal_error("unable to evaluate offset for variable '" + | ||||
|                          S.getName() + "'"); | ||||
|  | ||||
| @@ -357,7 +357,7 @@ bool MCAssembler::evaluateFixup(const MCAsmLayout &Layout, | ||||
|                                 MCValue &Target, uint64_t &Value) const { | ||||
|   ++stats::evaluateFixup; | ||||
|  | ||||
|   if (!Fixup.getValue()->EvaluateAsRelocatable(Target, Layout)) | ||||
|   if (!Fixup.getValue()->EvaluateAsRelocatable(Target, &Layout)) | ||||
|     getContext().FatalError(Fixup.getLoc(), "expected relocatable expression"); | ||||
|  | ||||
|   bool IsPCRel = Backend.getFixupKindInfo( | ||||
|   | ||||
| @@ -607,9 +607,9 @@ static bool EvaluateSymbolicAdd(const MCAssembler *Asm, | ||||
| } | ||||
|  | ||||
| bool MCExpr::EvaluateAsRelocatable(MCValue &Res, | ||||
|                                    const MCAsmLayout &Layout) const { | ||||
|   return EvaluateAsRelocatableImpl(Res, &Layout.getAssembler(), &Layout, | ||||
|                                    0, false); | ||||
|                                    const MCAsmLayout *Layout) const { | ||||
|   MCAssembler *Assembler = Layout ? &Layout->getAssembler() : 0; | ||||
|   return EvaluateAsRelocatableImpl(Res, Assembler, Layout, 0, false); | ||||
| } | ||||
|  | ||||
| bool MCExpr::EvaluateAsRelocatableImpl(MCValue &Res, | ||||
|   | ||||
| @@ -82,7 +82,7 @@ uint64_t MachObjectWriter::getSymbolAddress(const MCSymbolData* SD, | ||||
|  | ||||
|  | ||||
|     MCValue Target; | ||||
|     if (!S.getVariableValue()->EvaluateAsRelocatable(Target, Layout)) | ||||
|     if (!S.getVariableValue()->EvaluateAsRelocatable(Target, &Layout)) | ||||
|       report_fatal_error("unable to evaluate offset for variable '" + | ||||
|                          S.getName() + "'"); | ||||
|  | ||||
| @@ -631,7 +631,7 @@ void MachObjectWriter::markAbsoluteVariableSymbols(MCAssembler &Asm, | ||||
|     // and neither symbol is external, mark the variable as absolute. | ||||
|     const MCExpr *Expr = SD.getSymbol().getVariableValue(); | ||||
|     MCValue Value; | ||||
|     if (Expr->EvaluateAsRelocatable(Value, Layout)) { | ||||
|     if (Expr->EvaluateAsRelocatable(Value, &Layout)) { | ||||
|       if (Value.getSymA() && Value.getSymB()) | ||||
|         const_cast<MCSymbol*>(&SD.getSymbol())->setAbsolute(); | ||||
|     } | ||||
|   | ||||
| @@ -79,7 +79,7 @@ void AArch64MCExpr::PrintImpl(raw_ostream &OS) const { | ||||
| bool | ||||
| AArch64MCExpr::EvaluateAsRelocatableImpl(MCValue &Res, | ||||
|                                          const MCAsmLayout *Layout) const { | ||||
|   return getSubExpr()->EvaluateAsRelocatable(Res, *Layout); | ||||
|   return getSubExpr()->EvaluateAsRelocatable(Res, Layout); | ||||
| } | ||||
|  | ||||
| static void fixELFSymbolsInTLSFixupsImpl(const MCExpr *Expr, MCAssembler &Asm) { | ||||
|   | ||||
| @@ -36,9 +36,7 @@ void MipsMCExpr::PrintImpl(raw_ostream &OS) const { | ||||
| bool | ||||
| MipsMCExpr::EvaluateAsRelocatableImpl(MCValue &Res, | ||||
|                                       const MCAsmLayout *Layout) const { | ||||
|   if (!Layout) | ||||
|     return false; | ||||
|   return getSubExpr()->EvaluateAsRelocatable(Res, *Layout); | ||||
|   return getSubExpr()->EvaluateAsRelocatable(Res, Layout); | ||||
| } | ||||
|  | ||||
| // FIXME: This basically copies MCObjectStreamer::AddValueSymbols. Perhaps | ||||
|   | ||||
| @@ -54,7 +54,7 @@ PPCMCExpr::EvaluateAsRelocatableImpl(MCValue &Res, | ||||
|                                      const MCAsmLayout *Layout) const { | ||||
|   MCValue Value; | ||||
|  | ||||
|   if (!Layout || !getSubExpr()->EvaluateAsRelocatable(Value, *Layout)) | ||||
|   if (!getSubExpr()->EvaluateAsRelocatable(Value, Layout)) | ||||
|     return false; | ||||
|  | ||||
|   if (Value.isAbsolute()) { | ||||
| @@ -86,6 +86,9 @@ PPCMCExpr::EvaluateAsRelocatableImpl(MCValue &Res, | ||||
|     } | ||||
|     Res = MCValue::get(Result); | ||||
|   } else { | ||||
|     if (!Layout) | ||||
|       return false; | ||||
|  | ||||
|     MCContext &Context = Layout->getAssembler().getContext(); | ||||
|     const MCSymbolRefExpr *Sym = Value.getSymA(); | ||||
|     MCSymbolRefExpr::VariantKind Modifier = Sym->getKind(); | ||||
|   | ||||
| @@ -160,9 +160,7 @@ Sparc::Fixups SparcMCExpr::getFixupKind(SparcMCExpr::VariantKind Kind) { | ||||
| bool | ||||
| SparcMCExpr::EvaluateAsRelocatableImpl(MCValue &Res, | ||||
|                                        const MCAsmLayout *Layout) const { | ||||
|   if (!Layout) | ||||
|     return false; | ||||
|   return getSubExpr()->EvaluateAsRelocatable(Res, *Layout); | ||||
|   return getSubExpr()->EvaluateAsRelocatable(Res, Layout); | ||||
| } | ||||
|  | ||||
| static void fixELFSymbolsInTLSFixupsImpl(const MCExpr *Expr, MCAssembler &Asm) { | ||||
|   | ||||
| @@ -423,6 +423,14 @@ base: | ||||
| # CHECK-REL:                             0x{{[0-9A-F]*[048C]}} R_PPC64_TLS target 0x0 | ||||
|          add 3, 4, target@tls | ||||
|  | ||||
| # Verify that fixups on constants are resolved at assemble time | ||||
|  | ||||
| # CHECK: ori 1, 2, 65535              # encoding: [0x60,0x41,0xff,0xff] | ||||
|          ori 1, 2, 131071@l | ||||
| # CHECK: ori 1, 2, 1                  # encoding: [0x60,0x41,0x00,0x01] | ||||
|          ori 1, 2, 131071@h | ||||
| # CHECK: ori 1, 2, 2                  # encoding: [0x60,0x41,0x00,0x02] | ||||
|          ori 1, 2, 131071@ha | ||||
|  | ||||
| # Data relocs | ||||
| # llvm-mc does not show any "encoding" string for data, so we just check the relocs | ||||
| @@ -442,7 +450,3 @@ base: | ||||
| # CHECK-REL: 0x{{[0-9A-F]*[08]}} R_PPC64_DTPREL64 target 0x0 | ||||
| 	.quad target@dtprel | ||||
|  | ||||
| # Constant fixup | ||||
|         ori 1, 2, 131071@l | ||||
| # CHECK: ori 1, 2, 131071@l              # encoding: [0x60,0x41,A,A] | ||||
| # CHECK-NEXT:                            #   fixup A - offset: 2, value: 131071@l, kind: fixup_ppc_half16 | ||||
|   | ||||
		Reference in New Issue
	
	Block a user