| Index: src/IceAssemblerARM32.h
|
| diff --git a/src/IceAssemblerARM32.h b/src/IceAssemblerARM32.h
|
| index 20b4e67da28ee3f7596688728a9378cdf3a6dec5..b1329030b1c21e728918994efeb3c27c3b722020 100644
|
| --- a/src/IceAssemblerARM32.h
|
| +++ b/src/IceAssemblerARM32.h
|
| @@ -39,6 +39,7 @@ namespace Ice {
|
| namespace ARM32 {
|
|
|
| class AssemblerARM32 : public Assembler {
|
| + AssemblerARM32() = delete;
|
| AssemblerARM32(const AssemblerARM32 &) = delete;
|
| AssemblerARM32 &operator=(const AssemblerARM32 &) = delete;
|
|
|
| @@ -48,7 +49,16 @@ public:
|
| // TODO(kschimpf): Add mode if needed when branches are handled.
|
| (void)use_far_branches;
|
| }
|
| - ~AssemblerARM32() override = default;
|
| + ~AssemblerARM32() override {
|
| + if (BuildDefs::asserts()) {
|
| + for (const Label *Label : CfgNodeLabels) {
|
| + Label->finalCheck();
|
| + }
|
| + for (const Label *Label : LocalLabels) {
|
| + Label->finalCheck();
|
| + }
|
| + }
|
| + }
|
|
|
| void alignFunction() override {
|
| const SizeT Align = 1 << getBundleAlignLog2Bytes();
|
| @@ -84,10 +94,12 @@ public:
|
| return CfgNodeLabels[NodeNumber];
|
| }
|
|
|
| - void bindCfgNodeLabel(SizeT NodeNumber) override {
|
| - assert(!getPreliminary());
|
| - Label *L = getOrCreateCfgNodeLabel(NodeNumber);
|
| - this->bind(L);
|
| + void bindCfgNodeLabel(const CfgNode *Node) override;
|
| +
|
| + void bindLocalLabel(SizeT Number) {
|
| + Label *L = getOrCreateLocalLabel(Number);
|
| + if (!getPreliminary())
|
| + this->bind(L);
|
| }
|
|
|
| bool fixupIsPCRel(FixupKind Kind) const override {
|
| @@ -120,17 +132,22 @@ public:
|
| return Asm->getKind() == Asm_ARM32;
|
| }
|
|
|
| - void emitTextInst(const std::string &Text);
|
| + void emitTextInst(const std::string &Text, SizeT InstSize = sizeof(uint32_t));
|
|
|
| private:
|
| // A vector of pool-allocated x86 labels for CFG nodes.
|
| using LabelVector = std::vector<Label *>;
|
| LabelVector CfgNodeLabels;
|
| + // A vector of pool-allocated x86 labels for Local labels.
|
| + LabelVector LocalLabels;
|
|
|
| Label *getOrCreateLabel(SizeT Number, LabelVector &Labels);
|
| Label *getOrCreateCfgNodeLabel(SizeT NodeNumber) {
|
| return getOrCreateLabel(NodeNumber, CfgNodeLabels);
|
| }
|
| + Label *getOrCreateLocalLabel(SizeT Number) {
|
| + return getOrCreateLabel(Number, LocalLabels);
|
| + }
|
|
|
| void emitInst(uint32_t Value) { Buffer.emit<uint32_t>(Value); }
|
|
|
|
|