Skip to content

Commit

Permalink
Merge pull request #182 from unknownbrackets/area-files
Browse files Browse the repository at this point in the history
Disallow file directives within area/region/func
  • Loading branch information
Kingcom committed Jul 31, 2020
2 parents 89d31f7 + 93b0357 commit 14ff76e
Show file tree
Hide file tree
Showing 35 changed files with 116 additions and 74 deletions.
2 changes: 1 addition & 1 deletion Archs/ARM/CArmInstruction.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ void CArmInstruction::setPoolAddress(int64_t address)
Vars.Immediate = pos;
}

bool CArmInstruction::Validate()
bool CArmInstruction::Validate(const ValidateState &state)
{
RamPos = g_fileManager->getVirtualAddress();

Expand Down
2 changes: 1 addition & 1 deletion Archs/ARM/CArmInstruction.h
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@ class CArmInstruction: public ArmOpcodeCommand
CArmInstruction(const tArmOpcode& sourceOpcode, ArmOpcodeVariables& vars);
// ~CArmInstruction();
bool Load(char* Name, char* Params);
virtual bool Validate();
bool Validate(const ValidateState &state) override;
virtual void Encode() const;
virtual void writeTempData(TempData& tempData) const;
virtual void setPoolAddress(int64_t address);
Expand Down
2 changes: 1 addition & 1 deletion Archs/ARM/CThumbInstruction.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ void CThumbInstruction::setPoolAddress(int64_t address)
Vars.Immediate = pos >> 2;
}

bool CThumbInstruction::Validate()
bool CThumbInstruction::Validate(const ValidateState &state)
{
RamPos = g_fileManager->getVirtualAddress();

Expand Down
2 changes: 1 addition & 1 deletion Archs/ARM/CThumbInstruction.h
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ class CThumbInstruction: public ArmOpcodeCommand
CThumbInstruction(const tThumbOpcode& sourceOpcode, ThumbOpcodeVariables& vars);
// ~CThumbInstruction();
bool Load(char* Name, char* Params);
virtual bool Validate();
bool Validate(const ValidateState &state) override;
virtual void Encode() const;
virtual void writeTempData(TempData& tempData) const;
size_t GetSize() { return OpcodeSize; };
Expand Down
6 changes: 3 additions & 3 deletions Archs/ARM/Pool.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ ArmStateCommand::ArmStateCommand(bool state)
armstate = state;
}

bool ArmStateCommand::Validate()
bool ArmStateCommand::Validate(const ValidateState &state)
{
RamPos = g_fileManager->getVirtualAddress();
return false;
Expand All @@ -40,7 +40,7 @@ ArmPoolCommand::ArmPoolCommand()
position = -1;
}

bool ArmPoolCommand::Validate()
bool ArmPoolCommand::Validate(const ValidateState &state)
{
int64_t fileID = g_fileManager->getOpenFileID();
if (position != -1)
Expand All @@ -57,7 +57,7 @@ bool ArmPoolCommand::Validate()

// try to filter redundant values, but only if
// we aren't in an unordinarily long validation loop
if (Global.validationPasses < 10)
if (state.passes < 10)
{
auto it = usedValues.find(entry.value);
if (it != usedValues.end())
Expand Down
4 changes: 2 additions & 2 deletions Archs/ARM/Pool.h
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ class ArmStateCommand: public CAssemblerCommand
{
public:
ArmStateCommand(bool state);
virtual bool Validate();
bool Validate(const ValidateState &state) override;
virtual void Encode() const { };
virtual void writeTempData(TempData& tempData) const { };
virtual void writeSymData(SymbolData& symData) const;
Expand All @@ -30,7 +30,7 @@ class ArmPoolCommand: public CAssemblerCommand
{
public:
ArmPoolCommand();
virtual bool Validate();
bool Validate(const ValidateState &state) override;
virtual void Encode() const;
virtual void writeTempData(TempData& tempData) const;
virtual void writeSymData(SymbolData& symData) const;
Expand Down
2 changes: 1 addition & 1 deletion Archs/Architecture.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ ArchitectureCommand::ArchitectureCommand(const std::wstring& tempText, const std
this->endianness = Arch->getEndianness();
}

bool ArchitectureCommand::Validate()
bool ArchitectureCommand::Validate(const ValidateState &state)
{
position = g_fileManager->getVirtualAddress();
g_fileManager->setEndianness(endianness);
Expand Down
2 changes: 1 addition & 1 deletion Archs/Architecture.h
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ class ArchitectureCommand: public CAssemblerCommand
{
public:
ArchitectureCommand(const std::wstring& tempText, const std::wstring& symText);
virtual bool Validate();
bool Validate(const ValidateState &state) override;
virtual void Encode() const;
virtual void writeTempData(TempData& tempData) const;
virtual void writeSymData(SymbolData& symData) const;
Expand Down
2 changes: 1 addition & 1 deletion Archs/MIPS/CMipsInstruction.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -82,7 +82,7 @@ int CMipsInstruction::floatToHalfFloat(int i)
return s | (e << 10) | (f >> 13);
}

bool CMipsInstruction::Validate()
bool CMipsInstruction::Validate(const ValidateState &state)
{
bool Result = false;

Expand Down
2 changes: 1 addition & 1 deletion Archs/MIPS/CMipsInstruction.h
Original file line number Diff line number Diff line change
Expand Up @@ -130,7 +130,7 @@ class CMipsInstruction: public CAssemblerCommand
public:
CMipsInstruction(MipsOpcodeData& opcode, MipsImmediateData& immediate, MipsRegisterData& registers);
~CMipsInstruction();
virtual bool Validate();
bool Validate(const ValidateState &state) override;
virtual void Encode() const;
virtual void writeTempData(TempData& tempData) const;
private:
Expand Down
2 changes: 1 addition & 1 deletion Archs/MIPS/MipsElfFile.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -294,7 +294,7 @@ DirectiveLoadMipsElf::DirectiveLoadMipsElf(const std::wstring& inputName, const
g_fileManager->addFile(file);
}

bool DirectiveLoadMipsElf::Validate()
bool DirectiveLoadMipsElf::Validate(const ValidateState &state)
{
Arch->NextSection();
g_fileManager->openFile(file,true);
Expand Down
2 changes: 1 addition & 1 deletion Archs/MIPS/MipsElfFile.h
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ class DirectiveLoadMipsElf: public CAssemblerCommand
public:
DirectiveLoadMipsElf(const std::wstring& fileName);
DirectiveLoadMipsElf(const std::wstring& inputName, const std::wstring& outputName);
virtual bool Validate();
bool Validate(const ValidateState &state) override;
virtual void Encode() const;
virtual void writeTempData(TempData& tempData) const;
virtual void writeSymData(SymbolData& symData) const;
Expand Down
4 changes: 2 additions & 2 deletions Archs/MIPS/MipsMacros.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -17,11 +17,11 @@ MipsMacroCommand::MipsMacroCommand(std::unique_ptr<CAssemblerCommand> content, i
IgnoreLoadDelay = Mips.GetIgnoreDelay();
}

bool MipsMacroCommand::Validate()
bool MipsMacroCommand::Validate(const ValidateState &state)
{
int64_t memoryPos = g_fileManager->getVirtualAddress();
content->applyFileInfo();
bool result = content->Validate();
bool result = content->Validate(state);
int64_t newMemoryPos = g_fileManager->getVirtualAddress();

applyFileInfo();
Expand Down
2 changes: 1 addition & 1 deletion Archs/MIPS/MipsMacros.h
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,7 @@ class MipsMacroCommand: public CAssemblerCommand
{
public:
MipsMacroCommand(std::unique_ptr<CAssemblerCommand> content, int macroFlags);
virtual bool Validate();
bool Validate(const ValidateState &state) override;
virtual void Encode() const;
virtual void writeTempData(TempData& tempData) const;
private:
Expand Down
2 changes: 1 addition & 1 deletion Archs/MIPS/PsxRelocator.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -561,7 +561,7 @@ DirectivePsxObjImport::DirectivePsxObjImport(const std::wstring& fileName)
}
}

bool DirectivePsxObjImport::Validate()
bool DirectivePsxObjImport::Validate(const ValidateState &state)
{
int memory = (int) g_fileManager->getVirtualAddress();
rel.relocate(memory);
Expand Down
2 changes: 1 addition & 1 deletion Archs/MIPS/PsxRelocator.h
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,7 @@ class DirectivePsxObjImport: public CAssemblerCommand
public:
DirectivePsxObjImport(const std::wstring& fileName);
~DirectivePsxObjImport() { };
virtual bool Validate();
bool Validate(const ValidateState &state) override;
virtual void Encode() const;
virtual void writeTempData(TempData& tempData) const { };
virtual void writeSymData(SymbolData& symData) const;
Expand Down
13 changes: 10 additions & 3 deletions Commands/CAssemblerCommand.h
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,19 @@
class TempData;
class SymbolData;

struct ValidateState
{
bool noFileChange = false;
const wchar_t *noFileChangeDirective = nullptr;
int passes = 0;
};

class CAssemblerCommand
{
public:
CAssemblerCommand();
virtual ~CAssemblerCommand() { };
virtual bool Validate() = 0;
virtual bool Validate(const ValidateState &state) = 0;
virtual void Encode() const = 0;
virtual void writeTempData(TempData& tempData) const = 0;
virtual void writeSymData(SymbolData& symData) const { };
Expand All @@ -25,7 +32,7 @@ class CAssemblerCommand
class DummyCommand: public CAssemblerCommand
{
public:
virtual bool Validate() { return false; };
bool Validate(const ValidateState &state) override { return false; }
virtual void Encode() const { };
virtual void writeTempData(TempData& tempData) const { };
virtual void writeSymData(SymbolData& symData) const { };
Expand All @@ -34,7 +41,7 @@ class DummyCommand: public CAssemblerCommand
class InvalidCommand: public CAssemblerCommand
{
public:
virtual bool Validate() { return false; };
bool Validate(const ValidateState &state) override { return false; }
virtual void Encode() const { };
virtual void writeTempData(TempData& tempData) const { };
virtual void writeSymData(SymbolData& symData) const { };
Expand Down
11 changes: 7 additions & 4 deletions Commands/CAssemblerLabel.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ CAssemblerLabel::CAssemblerLabel(const std::wstring& name, const std::wstring& o
labelValue = value;
}

bool CAssemblerLabel::Validate()
bool CAssemblerLabel::Validate(const ValidateState &state)
{
bool result = false;
if (defined == false)
Expand Down Expand Up @@ -120,15 +120,18 @@ CDirectiveFunction::CDirectiveFunction(const std::wstring& name, const std::wstr
this->start = this->end = 0;
}

bool CDirectiveFunction::Validate()
bool CDirectiveFunction::Validate(const ValidateState &state)
{
start = g_fileManager->getVirtualAddress();

label->applyFileInfo();
bool result = label->Validate();
bool result = label->Validate(state);

ValidateState contentValidation = state;
contentValidation.noFileChange = true;
contentValidation.noFileChangeDirective = L"function";
content->applyFileInfo();
if (content->Validate())
if (content->Validate(contentValidation))
result = true;

end = g_fileManager->getVirtualAddress();
Expand Down
4 changes: 2 additions & 2 deletions Commands/CAssemblerLabel.h
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ class CAssemblerLabel: public CAssemblerCommand
public:
CAssemblerLabel(const std::wstring& name, const std::wstring& originalName);
CAssemblerLabel(const std::wstring& name, const std::wstring& originalName, Expression& value);
virtual bool Validate();
bool Validate(const ValidateState &state) override;
virtual void Encode() const;
virtual void writeTempData(TempData& tempData) const;
virtual void writeSymData(SymbolData& symData) const;
Expand All @@ -24,7 +24,7 @@ class CDirectiveFunction: public CAssemblerCommand
{
public:
CDirectiveFunction(const std::wstring& name, const std::wstring& originalName);
virtual bool Validate();
bool Validate(const ValidateState &state) override;
virtual void Encode() const;
virtual void writeTempData(TempData& tempData) const;
virtual void writeSymData(SymbolData& symData) const;
Expand Down
19 changes: 13 additions & 6 deletions Commands/CDirectiveArea.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ void CDirectiveArea::setPositionExpression(Expression& exp)
positionExpression = exp;
}

bool CDirectiveArea::Validate()
bool CDirectiveArea::Validate(const ValidateState &state)
{
int64_t oldAreaSize = areaSize;
int64_t oldContentSize = contentSize;
Expand Down Expand Up @@ -75,8 +75,11 @@ bool CDirectiveArea::Validate()
bool result = false;
if (content)
{
ValidateState contentValidation = state;
contentValidation.noFileChange = true;
contentValidation.noFileChangeDirective = L"area";
content->applyFileInfo();
result = content->Validate();
result = content->Validate(contentValidation);
}
contentSize = g_fileManager->getVirtualAddress()-position;

Expand Down Expand Up @@ -199,17 +202,21 @@ void CDirectiveAutoRegion::setRangeExpressions(Expression& minExp, Expression& m
maxRangeExpression = maxExp;
}

bool CDirectiveAutoRegion::Validate()
bool CDirectiveAutoRegion::Validate(const ValidateState &state)
{
resetPosition = g_fileManager->getVirtualAddress();

ValidateState contentValidation = state;
contentValidation.noFileChange = true;
contentValidation.noFileChangeDirective = L"region";

// We need at least one full pass run before we can get an address.
if (Global.validationPasses < 1)
if (state.passes < 1)
{
// Just calculate contentSize.
position = g_fileManager->getVirtualAddress();
content->applyFileInfo();
content->Validate();
content->Validate(contentValidation);
contentSize = g_fileManager->getVirtualAddress() - position;

g_fileManager->seekVirtual(resetPosition);
Expand Down Expand Up @@ -249,7 +256,7 @@ bool CDirectiveAutoRegion::Validate()
g_fileManager->seekVirtual(position);

content->applyFileInfo();
bool result = content->Validate();
bool result = content->Validate(contentValidation);
contentSize = g_fileManager->getVirtualAddress() - position;

// restore info of this command
Expand Down
4 changes: 2 additions & 2 deletions Commands/CDirectiveArea.h
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ class CDirectiveArea: public CAssemblerCommand
{
public:
CDirectiveArea(bool shared, Expression& size);
virtual bool Validate();
bool Validate(const ValidateState &state) override;
virtual void Encode() const;
virtual void writeTempData(TempData& tempData) const;
virtual void writeSymData(SymbolData& symData) const;
Expand All @@ -30,7 +30,7 @@ class CDirectiveAutoRegion : public CAssemblerCommand
{
public:
CDirectiveAutoRegion();
virtual bool Validate();
bool Validate(const ValidateState &state) override;
virtual void Encode() const;
virtual void writeTempData(TempData& tempData) const;
virtual void writeSymData(SymbolData& symData) const;
Expand Down
6 changes: 3 additions & 3 deletions Commands/CDirectiveConditional.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@ bool CDirectiveConditional::evaluate()
return false;
}

bool CDirectiveConditional::Validate()
bool CDirectiveConditional::Validate(const ValidateState &state)
{
bool result = evaluate();
bool returnValue = result != previousResult;
Expand All @@ -73,12 +73,12 @@ bool CDirectiveConditional::Validate()
if (result)
{
ifBlock->applyFileInfo();
if (ifBlock->Validate())
if (ifBlock->Validate(state))
returnValue = true;
} else if (elseBlock != nullptr)
{
elseBlock->applyFileInfo();
if (elseBlock->Validate())
if (elseBlock->Validate(state))
returnValue = true;
}

Expand Down
2 changes: 1 addition & 1 deletion Commands/CDirectiveConditional.h
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ class CDirectiveConditional: public CAssemblerCommand
CDirectiveConditional(ConditionType type);
CDirectiveConditional(ConditionType type, const std::wstring& name);
CDirectiveConditional(ConditionType type, const Expression& exp);
virtual bool Validate();
bool Validate(const ValidateState &state) override;
virtual void Encode() const;
virtual void writeTempData(TempData& tempData) const;
virtual void writeSymData(SymbolData& symData) const;
Expand Down
4 changes: 2 additions & 2 deletions Commands/CDirectiveData.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ TableCommand::TableCommand(const std::wstring& fileName, TextFile::Encoding enco
}
}

bool TableCommand::Validate()
bool TableCommand::Validate(const ValidateState &state)
{
Global.Table = table;
return false;
Expand Down Expand Up @@ -308,7 +308,7 @@ void CDirectiveData::encodeNormal()
}
}

bool CDirectiveData::Validate()
bool CDirectiveData::Validate(const ValidateState &state)
{
position = g_fileManager->getVirtualAddress();

Expand Down
Loading

0 comments on commit 14ff76e

Please sign in to comment.